Spring Boot REST на Google App Engine выбрасывает 502

Я боролся с этим около недели, и ничто из того, что я видел на SO, не сработало для меня. У меня есть REST API, построенный на Spring Boot, который я пытаюсь развернуть в Google App Engine. Локально работает локально, и когда я запускаю его на эмуляторе GAE, он также отлично работает; однако, как только я развернусь с помощью mvn appengine:deploy Я получаю успешную сборку, но при попытке конечных точек я получаю только 502. Я не уверен, где журналы, так что это действительно пинает мою задницу.

Мой pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.admin</groupId>
  <artifactId>admin-api</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <!-- Exclude this for deployment only -->
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- other project dependencies -->
    <dependency>
        <groupId>com.google.firebase</groupId>
        <artifactId>firebase-admin</artifactId>
        <version>5.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.10.2</version>
    </dependency>
    <!-- end other project specific dependencies -->

    <!-- Dependencies provided during deployment -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jul-to-slf4j</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <scope>provided</scope>
    </dependency>
    <!-- End dependencies for deployment -->

    <!-- Dependencies for local -->
    <!--        <dependency> -->
    <!--            <groupId>org.springframework.boot</groupId> -->
    <!--            <artifactId>spring-boot-starter-tomcat</artifactId> -->
    <!--            <scope>provided</scope> -->
    <!--        </dependency> -->
    <!-- End dependencies for local -->
  </dependencies>

  <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>com.google.cloud.tools</groupId>
            <artifactId>appengine-maven-plugin</artifactId>
            <version>1.3.1</version>
            <configuration>
                <project>project-id-from-GAE-here</project
            </configuration>
        </plugin>
    </plugins>
  </build>
</project>

Мой класс приложения является простым аннотированным @SpringBootApplication учебный класс. У меня 2 контроллера с аннотацией @RestController и просто @RequestMapping методы. Один из контроллеров REST предназначен для /_ah/health конечная точка, которая возвращает 200, так как один пост упомянул константу, перезапускается из-за отсутствия конечной точки проверки работоспособности.

У меня есть простой application.yml для моих инъекций значения и создал app.yaml файл помещен в src/main/appengine

runtime: java
env: flexible
threadsafe: true
manual_scaling:
  instances: 1
handlers:
- url: /.*
  script: this field is required, but ignored
runtime_config:
  jdk: openjdk8

Я в полной растерянности по этому поводу. Это мое первое развертывание GAE, которое, я надеюсь, еще не завершено. (Я также еще не использую Docker, так как нахожусь на компьютере с Windows 10, который ломается, когда я загружаю на него Docker.)

ОБНОВЛЕНИЕ Я заметил, что я забыл поместить свой идентификатор проекта в плагин maven. Как только я сделал это, я получил ошибки о том, что я не нашел app.yaml. Я понял, что, поскольку я использую гибкую среду, мне не нужен appengine-web.xml, и мой файл был назван как app.yml, а не app.yaml. Я обновил свой вопрос этим, и я все еще получаю 502 после успешного развертывания.

1 ответ

Решение

Я понял, что мой испытательный срок с GAE включал техническую поддержку, поэтому я связался с ними. Спросил мой пом и app.yaml. В ответ они добавили в мой app.yaml следующее: "Поскольку Java известна тем, что она потребляет много памяти, процесс заголовка занимает больше, чем приблизительное значение в 0,4 ГБ".

resources:
  cpu: 2
  memory_gb: 2.3
  disk_size_gb: 10
  volumes:
  - name: ramdisk1
    volume_type: tmpfs
    size_gb: 0.5

Они также предоставили эту ссылку для справки: https://cloud.google.com/appengine/docs/flexible/java/configuring-your-app-with-app-yaml

Как только я это сделал, мое приложение стало работать нормально.

РЕДАКТИРОВАТЬ

Если у вас есть простое приложение, установите cpu:1 так как вам выставляют счет за количество процессорных часов, а ваша дневная квота составляет 28, а с двумя процессорами вы получаете 48 процессорных часов. Я потратил бесплатный кредит в размере 300 долларов за 1 месяц, потому что их учебники настраивают RDB (80 долларов), который не привыкает и не показывает, как убить проект. Также убедитесь, что при развертывании чего-то нового вы удаляете старые версии, иначе вам придется платить за каждую вышедшую версию.

Другие вопросы по тегам