Приложение Google App Engine внезапно перестало работать, вернув 503

У меня есть приложение, работающее на Google App Engine, я развернул последнюю версию последней версии приложения 6 сентября 2018 г., но сегодня приложение перестало обслуживать запрос и возвращает ошибку 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 to V2.0

Но после того, как я внес изменения, необходимые для миграции, когда я пытаюсь развернуть, он по-прежнему возвращает 503 при выполнении команды Maven для развертывания или создания документов.

Мне известно, что Google заявил, что они испытывают проблемы с некоторыми регионами App Engine вчера, но я не уверен, связано ли это с тем, с чем я столкнулся.

Приложение My App Engine использует центральный регион США.

Обновление: похоже, что облачная конечная точка V1.1 отключена и больше не может обслуживать трафик, поэтому, следуя руководству по миграции, я смог перейти на версию 2.0, но, к сожалению, я получаю сообщение об ошибке документ api-discovery

Это ошибка

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>

Here is my web.xml file

 <?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, в то время как в документе по миграции говорилось, что версия 19 будет работать, но это не так. t, обновление до версии 20 и выше устранило это для меня, теперь я получаю ошибку 404 на всех конечных точках. Я напишу ответ, когда смогу это исправить.


comment
Привет, Огбе, мы тоже боремся с тем же самым и пытаемся все, чтобы он снова заработал с утра. Пожалуйста, добавьте комментарий, если вы в этом разобрались. По этой ссылке утверждается, что проблемы были решены с помощью движка приложений Google. Взгляните на status.cloud.google.com/incident/appengine/18006   -  person shank2111    schedule 13.09.2018
comment
Конечные точки v1 отключены. Если у вас возникают проблемы после миграции при создании документов, возможно, вы еще не перенесли плагин Maven для конечных точек. Пожалуйста, опубликуйте свой pom.xml, если у вас возникли проблемы.   -  person saiyr    schedule 13.09.2018
comment
@saiyr Я разместил свой файл pom.xml, я не могу понять, почему у меня в ответе на обнаружение ошибки API отсутствуют обязательные поля.   -  person oziomajnr    schedule 14.09.2018
comment
Включите также свой web.xml, и когда вы получите эту ошибку?   -  person saiyr    schedule 14.09.2018
comment
@saiyr Я добавил файл web.xml   -  person oziomajnr    schedule 15.09.2018


Ответы (3)


У меня такая же проблема с конечной точкой, которая не менялась месяцами, в журналах тоже ничего не отображается. Я предполагаю, что это, вероятно, проблема с движком приложения.


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

Я исправил нашу проблему, хотя вы упомянули, что пытались выполнить обновление до новой Cloud Endpoint v2.0, и у вас все еще есть проблема, как выяснилось для нашего проекта, после шагов по миграции с v1.1 на v2 проблема была устранена https://cloud.google.com/endpoints/docs/frameworks/python/migrating.

Документы говорят, что v1.1 должна была быть отключена 2 августа, я думаю, они только что дошли до этого

person WillCalderbank    schedule 13.09.2018
comment
У вас есть 503 и этот HTML? - person oziomajnr; 13.09.2018
comment
Да точно так же. - person WillCalderbank; 13.09.2018

Я успешно перешел на конечные точки V2 после серии попыток.

Проект App Engine, разработанный на Android Studio, имеет следующую структуру:

проект

  • приложение
  • бэкэнд
  • build.gradle

Мне нужно изменить build.gradle во всех трех местах. Где проект - это корневой проект, приложение - это приложение для Android, а серверная часть - это приложение App Engine. Все они имеют собственный 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 (внесите изменения в модуль backend / 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 (внесите изменения в 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

person Yassir    schedule 14.09.2018

Как сказал сайр в комментариях, Google Cloud Endpoints v1.1 полностью устарела и перестала обслуживать трафик, и это является причиной ошибок, которые у меня были. Я решил эту проблему, перейдя на облачные конечные точки v2, процесс так же прост, как следование руководству в документы по миграции, но вот некоторые проблемы, с которыми я столкнулся с миграцией, и способы их устранения.

  1. Библиотеку Google guava необходимо обновить до версии выше, чем версия 19, использование версии 19 или ниже может привести к тому, что приложение будет выдавать ошибки отражения при обработке запросов.

  2. Если у вас есть несколько классов обслуживания, их необходимо добавить в файл web.xml в качестве параметров службы при объявлении сервлета com.google.api.server.spi.EndpointsServlet. по некоторым причинам перечисление только одного класса обслуживания сработало для меня в облачной конечной точке 1.0. Документы Api и маршруты были сгенерированы для всех классов обслуживания, которые у меня были, без явного объявления каждого из них в com.google.api.server.spi.SystemServiceServlet сервлете, я думаю, что это как-то связано с фильтрами Objectify, хотя . Дополнительную информацию см. в Документах

  3. Поскольку среда выполнения Java 7 в Google App Engine также устарела, я решил перейти на Java 8, но, к сожалению, библиотека, которую я использовал для абстрагирования процесса подключения к хранилищу данных (Objectify), похоже, не работает со средой выполнения Java 8, я бы посмотрел на это позже, но возврат к среде выполнения Java 7 сработал для меня, и приложение снова запущено и работает.

Обновление: проблема, с которой я столкнулся при переходе на среду выполнения Java 8, не имела ничего общего с Objectify, проблема была в библиотеке, которую я использовал для шифрования паролей (BCrypt), она просто не работала на Google App Engine Java. 8, мне пришлось переключиться на библиотеку шифрования в Spring Security.

person oziomajnr    schedule 17.09.2018