Spring 在 Google App Engine 上启动 REST 抛出 502
Spring Boot REST on Google App Engine throws 502
我已经为此苦苦挣扎了大约一个星期,而我在 SO 上看到的任何东西都对我有用。我有一个基于 Spring 启动的 REST API,我正试图将其部署到 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>
我的应用程序 class 是一个简单的注释 @SpringBootApplication
class。我有 2 个带有注释 @RestController
和简单 @RequestMapping
方法的控制器。其中一个 REST 控制器用于 returns 200 的 /_ah/health
端点,因为有人 post 提到常量重启是由于缺少健康检查端点而触发的。
我有一个简单的 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 时它坏了。)
更新
我确实注意到我忘记将我的项目 ID 放在 maven 插件下。一旦我这样做了,我就得到关于找不到 app.yaml 的错误。我意识到,因为我使用的是灵活的环境,所以我不需要 appengine-web.xml,而且我的文件被错误命名为 app.yml 而不是 app.yaml。我用这个更新了我的问题,但在成功部署后我仍然收到 502。
我意识到我在 GAE 的试用期包括技术支持,所以我联系了他们。他们要我的 pom 和 app.yaml。他们的回应是将以下内容添加到我的 app.yaml "Since Java is known for consuming high memory usage, there is an overhead process consumed more than the approximate 0.4GB value"
resources:
cpu: 2
memory_gb: 2.3
disk_size_gb: 10
volumes:
- name: ramdisk1
volume_type: tmpfs
size_gb: 0.5
他们还提供了这个link供参考:https://cloud.google.com/appengine/docs/flexible/java/configuring-your-app-with-app-yaml#resource-settings
完成此操作后,我的应用程序开始正常运行。
编辑
如果您有一个简单的应用程序,请设置 cpu:1
,因为您按 CPU 小时计费,您的每日配额为 28,如果有 2 CPU,您最终会得到 48 CPU小时。我在 1 个月内用完了 300 美元的免费赠金,因为他们的教程设置了一个 RDB(80 美元),它没有被使用,也没有显示会终止项目。还要确保在部署新内容时删除旧版本,否则将为每个可用版本付费。
我已经为此苦苦挣扎了大约一个星期,而我在 SO 上看到的任何东西都对我有用。我有一个基于 Spring 启动的 REST API,我正试图将其部署到 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>
我的应用程序 class 是一个简单的注释 @SpringBootApplication
class。我有 2 个带有注释 @RestController
和简单 @RequestMapping
方法的控制器。其中一个 REST 控制器用于 returns 200 的 /_ah/health
端点,因为有人 post 提到常量重启是由于缺少健康检查端点而触发的。
我有一个简单的 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 时它坏了。)
更新 我确实注意到我忘记将我的项目 ID 放在 maven 插件下。一旦我这样做了,我就得到关于找不到 app.yaml 的错误。我意识到,因为我使用的是灵活的环境,所以我不需要 appengine-web.xml,而且我的文件被错误命名为 app.yml 而不是 app.yaml。我用这个更新了我的问题,但在成功部署后我仍然收到 502。
我意识到我在 GAE 的试用期包括技术支持,所以我联系了他们。他们要我的 pom 和 app.yaml。他们的回应是将以下内容添加到我的 app.yaml "Since Java is known for consuming high memory usage, there is an overhead process consumed more than the approximate 0.4GB value"
resources:
cpu: 2
memory_gb: 2.3
disk_size_gb: 10
volumes:
- name: ramdisk1
volume_type: tmpfs
size_gb: 0.5
他们还提供了这个link供参考:https://cloud.google.com/appengine/docs/flexible/java/configuring-your-app-with-app-yaml#resource-settings
完成此操作后,我的应用程序开始正常运行。
编辑
如果您有一个简单的应用程序,请设置 cpu:1
,因为您按 CPU 小时计费,您的每日配额为 28,如果有 2 CPU,您最终会得到 48 CPU小时。我在 1 个月内用完了 300 美元的免费赠金,因为他们的教程设置了一个 RDB(80 美元),它没有被使用,也没有显示会终止项目。还要确保在部署新内容时删除旧版本,否则将为每个可用版本付费。