Google App Engine应用程序突然停止工作,返回503

问题描述 投票:3回答:3

我有一个在Google App Engine上运行的应用程序,我在2018年9月6日部署了该应用程序的最新版本的最新版本,但今天该应用程序停止了服务请求,它返回错误503,其中包含以下内容

<HTML>
  <HEAD>
    <TITLE>Service Unavailable</TITLE>
  </HEAD>
 <BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Service Unavailable</H1>
 <H2>Error 503</H2>
  </BODY>
 </HTML>

我以为是因为我没有迁移到已弃用的Cloud Endpoint v1.1到V2.0

但是在我进行迁移所需的更改之后,当我尝试部署它时,仍然返回503,同时运行Maven命令来部署或生成Docs。

我知道谷歌昨天表示他们正在与一些App Engine区域遇到issues,但我不确定它是否与我所遇到的有任何关系。

我的App引擎应用程序正在使用Us-central区域。

更新:看起来云端点V1.1已关闭,无法再提供流量,因此按照迁移指南,我已经能够迁移到2.0版但不幸的是我收到了api-discovery doc的错误

这是错误

500

API发现响应缺少必填字段。

我试图解决这个问题

这是我的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>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>

<groupId>group-id</groupId>
<artifactId>artifact-id</artifactId>

<properties>
    <app.id>project-id</app.id>
    <app.version>1</app.version>
    <appengine.version>1.9.64</appengine.version>
    <gcloud.plugin.version>2.0.9.121.v20160815</gcloud.plugin.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <jackson.version>2.9.0</jackson.version>
    <archiveClasses>true</archiveClasses>
</properties>

<prerequisites>
    <maven>3.3.9</maven>
</prerequisites>

<dependencies>
    <!-- Compile/runtime dependencies -->
    <dependency>
        <groupId>com.google.endpoints</groupId>
        <artifactId>endpoints-framework</artifactId>
        <version>2.1.0</version>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>

    <!--  Objectify library ready -->
    <dependency>
        <groupId>com.googlecode.objectify</groupId>
        <artifactId>objectify</artifactId>
        <version>6.0</version>
    </dependency>

    <!--  Apache Commons Library -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.0</version>
    </dependency>

    <!-- Add support for joda money library  -->
    <dependency>
        <groupId>org.joda</groupId>
        <artifactId>joda-money</artifactId>
        <version>0.10.0</version>
    </dependency>

    <!--Added support for joda time library -->
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.9.4</version>
    </dependency>
    <!-- end joda time api.-->

    <!-- Load scrypt library for password encryption and decryption -->
    <dependency>
        <groupId>com.lambdaworks</groupId>
        <artifactId>scrypt</artifactId>
        <version>1.4.0</version>
    </dependency>
    <!-- Objectify utils to help us with currency -->
    <dependency>
        <groupId>com.sappenin.objectify</groupId>
        <artifactId>objectify-utils</artifactId>
        <version>5.1.3</version>
    </dependency>
    <!-- google guava -->
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>19.0</version>
    </dependency>
    <!-- Apache poi for excel file processing -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.15</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.15</version>
    </dependency>


    <!-- jackson-dataformat-csv-->
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-csv</artifactId>
        <version>2.7.0</version>
    </dependency>

    <!-- jackson data bind library for json -->
    <!-- Google cloud storage ends -->
    <!-- google cloud storage client -->
    <dependency>
        <groupId>com.google.appengine.tools</groupId>
        <artifactId>appengine-gcs-client</artifactId>
        <version>0.7</version>
        <exclusions>
            <exclusion>
                <groupId>com.google.api-client</groupId>
                <artifactId>google-api-client-appengine</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.google.http-client</groupId>
                <artifactId>google-http-client-jackson2</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.google.http-client</groupId>
                <artifactId>google-http-client</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>google-cloud-storage</artifactId>
        <version>0.4.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.api-client</groupId>
        <artifactId>google-api-client-appengine</artifactId>
        <version>1.23.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.http-client</groupId>
        <artifactId>google-http-client-jackson2</artifactId>
        <version>1.23.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.http-client</groupId>
        <artifactId>google-http-client</artifactId>
        <version>1.23.0</version>
    </dependency>
    <!-- Test Dependencies -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>2.0.2-beta</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.google.appengine</groupId>
        <artifactId>appengine-api-stubs</artifactId>
        <version>${appengine.version}</version>
        <scope>test</scope>
    </dependency>

    <!-- Mail Dependencies with MailGun -->
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
        <version>1.19.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>1.19.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey.contribs</groupId>
        <artifactId>jersey-multipart</artifactId>
        <version>1.19.1</version>
    </dependency>
    <!-- End Mail Dependencies with MailGun -->
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker-gae</artifactId>
        <version>2.3.25-incubating</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>

    <dependency>
        <!-- Note: core-annotations version x.y.0 is generally compatible with
             (identical to) version x.y.1, x.y.2, etc. -->
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${jackson.version}</version>
    </dependency>

</dependencies>

<build>
    <!-- for hot reload of the web application-->
    <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>2.1</version>
            <executions>
                <execution>
                    <phase>compile</phase>
                    <goals>
                        <goal>display-dependency-updates</goal>
                        <goal>display-plugin-updates</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>        
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>appengine-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                    <stage.enableJarClasses>true</stage.enableJarClasses>
                    <cloudSdkPath>/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk</cloudSdkPath>
                </configuration>
            </plugin>
        <plugin>
            <groupId>com.google.cloud.tools</groupId>
            <artifactId>appengine-maven-plugin</artifactId>
            <version>1.3.2</version>
            <configuration>
                <!-- deploy configuration -->
            </configuration>

        </plugin>

        <plugin>
            <groupId>com.google.cloud.tools</groupId>
            <artifactId>endpoints-framework-maven-plugin</artifactId>
            <version>1.0.2</version>
            <configuration>
                <!-- plugin configuration -->
                <hostname>project-id.appspot.com</hostname>

            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>discoveryDocs</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

这是我的web.xml文件

 <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <!-- Endpoints web.xml -->
    <!-- [START web] -->
    <servlet>
        <display-name>Remote API Servlet</display-name>
        <servlet-name>RemoteApiServlet</servlet-name>
        <servlet-class>com.google.apphosting.utils.remoteapi.RemoteApiServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>Grader</servlet-name>
        <servlet-class>com.softquest.apollo.servlets.Grader</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>SheetHandler</servlet-name>
        <servlet-class>com.softquest.apollo.servlets.SheetHandler</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RemoteApiServlet</servlet-name>
        <url-pattern>/remote_api</url-pattern>
    </servlet-mapping>
    <!-- Score Sheet Servlet -->
    <!-- Remote Api Servlet -->
    <servlet>
        <servlet-name>EndpointsServlet</servlet-name>
        <servlet-class>com.google.api.server.spi.EndpointsServlet</servlet-class>
        <init-param>
            <param-name>services</param-name>
            <param-value>com.softquest.apollo.services.UserServices</param-value>
        </init-param>
    </servlet>
    <!-- Payment Response Servlet -->
    <servlet>
        <servlet-name>PaymentResponseServlet</servlet-name>
        <servlet-class>com.softquest.apollo.servlets.PaymentResponseServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>PaymentResponseServlet</servlet-name>
        <url-pattern>/PaymentResponse</url-pattern>
    </servlet-mapping>
    <!-- Payment Response Servlet-->
    <servlet-mapping>
        <servlet-name>EndpointsServlet</servlet-name>
        <url-pattern>/_ah/api/*</url-pattern>
    </servlet-mapping>
    <!-- Objectify filter registration -->
    <filter>
        <filter-name>ObjectifyFilter</filter-name>
        <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ObjectifyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- Setup ServletContextListener to start up objectify entities on application -->
    <servlet>
        <servlet-name>BackEndStarter</servlet-name>
        <servlet-class>com.softquest.apollo.BackEndStarter</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>BackEndStarter</servlet-name>
        <url-pattern>/backend/starter</url-pattern>
    </servlet-mapping>
    <!-- Migration servlet -->
    <servlet>
        <servlet-name>MigrationServlet</servlet-name>
        <servlet-class>com.softquest.apollo.servlets.MigrationServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MigrationServlet</servlet-name>
        <url-pattern>/migration/*</url-pattern>
    </servlet-mapping>
    <!-- Migration Servlet-->
    <!-- Migration Handler Servlet -->
    <servlet>
        <servlet-name>MigrationHandler</servlet-name>
        <servlet-class>com.softquest.apollo.servlets.MigrationHandler</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MigrationHandler</servlet-name>
        <url-pattern>/migration-handler/*</url-pattern>
    </servlet-mapping>
    <!-- End of Migration handler Servlet-->
    <!-- Setup web.xml to start up context listener -->
    <servlet-mapping>
        <servlet-name>Grader</servlet-name>
        <url-pattern>/Grader</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>SheetHandler</servlet-name>
        <url-pattern>/SheetHandler</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

我在尝试调用api发现文档时遇到此错误,我已将其跟踪到第72行的空指针错误

com.google.api.server.spi.EndpointsServlet文件

if (!dispatcher.dispatch(method, path, context)) {
        response.setStatus(HttpServletResponse.SC_NOT_FOUND);
        response.getWriter().append("Not Found");
      }

我猜这个错误被发布到某个第三方库,可能仍然使用任何较旧的云端点maven依赖项或插件。所以我会从我的pom.xml中删除所有依赖项并尝试部署。

更新:我能够修复API发现错误,它是由与Google Guava库有关的反射错误引起的,而迁移Doc已声明版本19可以工作,但它没有,升级到版本20以上修正了对我来说,现在我在所有端点上都得到错误404。当我能够解决这个问题时,我会写一个答案。

google-app-engine google-cloud-platform google-cloud-endpoints google-cloud-endpoints-v2
3个回答
3
投票

我在几个月没有改变的端点上遇到同样的问题,日志中也没有出现任何问题。我认为它可能是一个应用引擎问题。


编辑

我修复了我们的问题,虽然您提到您已尝试更新到新的Cloud Endpoint v2.0并且您仍然遇到问题,但是在从v1.1到v2的迁移步骤之后我们的项目已经解决了问题https://cloud.google.com/endpoints/docs/frameworks/python/migrating

文件说v1.1将于8月2日关闭,我猜他们已经完成了它


0
投票

经过一系列的点击和试用方法后,我已成功迁移到Endpoints V2。

在Android Studio上开发的App Engine项目具有以下结构 -

项目

  • 应用
  • 后端
  • 的build.gradle

我必须在所有3个地方更改build.gradle。项目是root项目的地方,app是android app,后端是App Engine app。所有这些都有自己的build.gradlew。

让我们一个接一个地改变。


/app/build.gradle(在android客户端进行更改)

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:26.+'

// Remove this line
//compile project(path: ':micirclews', configuration: 'android-endpoints')

}

在android插件之后应用端点插件

apply plugin: 'com.google.cloud.tools.endpoints-framework-client'

/backend/build.gradle(在后端/ appengine模块中进行更改)

buildscript {
repositories {
    mavenCentral()
    jcenter()
}
dependencies {
    //Remove this
    //classpath 'com.google.appengine:gradle-appengine-plugin:1.9.59'

    //Add these two lines
    classpath 'com.google.cloud.tools:endpoints-framework-gradle-plugin:1.0.2'
    classpath 'com.google.cloud.tools:appengine-gradle-plugin:1.3.3'
}

}

删除这个 - apply plugin: 'appengine'

加上这两个 -

apply plugin: 'com.google.cloud.tools.appengine'
apply plugin: 'com.google.cloud.tools.endpoints-framework-server'


dependencies {
//Remove these 3 lines-
//appengineSdk 'com.google.appengine:appengine-java-sdk:1.9.59'
//compile 'com.google.appengine:appengine-endpoints:1.9.59'
//compile 'com.google.appengine:appengine-endpoints-deps:1.9.59'

//Add these 2 lines-
compile 'com.google.endpoints:endpoints-framework:2.0.9'
compile 'javax.inject:javax.inject:1'
.....

}

// delete this whole block, it's configuration for the older plugin
// appengine {
//   downloadSdk = true
//   appcfg {
//     oauth2 = true
//   }
//   endpoints {
//     getClientLibsOnBuild = true
//     getDiscoveryDocsOnBuild = true
//   }
// }

/build.gradle(在root的build.gradle中进行更改)

buildscript {
repositories {
    jcenter()
}

dependencies {
    classpath 'com.android.tools.build:gradle:2.3.3'

    //Add these 2 lines
    classpath 'com.google.cloud.tools:endpoints-framework-gradle-plugin:1.0.2'
    classpath 'com.google.cloud.tools:appengine-gradle-plugin:1.3.3'
}

}


仔细进行所有更改后,清理项目,重建并运行它。当一切工作完美时,最后部署它。

你可以在这里参考整个过程 - https://github.com/GoogleCloudPlatform/endpoints-framework-gradle-plugin/blob/master/ANDROID_README.md


0
投票

正如saiyr在评论中所述,Google Cloud Endpoints v1.1已被完全弃用,并且已停止提供流量,这就是我遇到错误的原因。我通过迁移到云端点v2解决了这个问题,这个过程就像遵循migration docs中的指南一样简单,但是这里有一些我在迁移时遇到的问题以及我如何修复它。

  1. Google guava库必须更新到版本大于19的版本,使用版本19或更低版本可能会导致应用程序在处理请求时抛出反射错误。
  2. 如果您有多个服务类,则必须在声明com.google.api.server.spi.EndpointsServlet Servlet时将它们作为服务参数添加到web.xml文件中。出于某些原因列出了在云端点1.0中仅为我工作的一个服务类Api文档和路由是为我所有的服务类生成的,而没有在com.google.api.server.spi.SystemServiceServlet Servlet下明确声明它们,我认为它与Objectify过滤器有关。 See the Docs for more info
  3. 由于谷歌App Engine Java 7运行时也被弃用,我决定迁移到Java 8但不幸的是我用来抽象连接到数据存储(Objectify)的过程似乎不适用于Java 8运行时,我会调查稍后,但恢复到java 7运行时为我工作,应用程序已备份并运行。
© www.soinside.com 2019 - 2024. All rights reserved.