В этой статье описываются некоторые проблемы и особенности развертывания аннотированного приложения @SpringBootApplication
на Google Cloud Platform .
Настройка
В этой статье предполагается, что Google Cloud SDK установлен и настроен. Кроме того, в этой статье предполагается, что проект был настроен в Google Cloud Platform Console .
Значение по умолчанию
Необходимо создать сервис Google App Engine . Он может быть создан из командной строки с помощью gcloud app create
.
Проект WAR Maven
Проект Maven для создания ВОЙНЫ для развертывания состоит из следующих артефактов:
www-example-com-service-default ├── pom.xml └── src └── main ├── resources │ └── application-gcp.properties └── webapp └── WEB-INF ├── logging.properties └── web.xml
Для простоты в этом примере предполагается, что приложение Spring Boot доступно как отдельная зависимость Maven. POM проекта для развертывания приложения идентифицируется с помощью groupId
соответствует облаку Google PROJECT_ID
, artifactId
соответствует имени службы App Engine, а версия
соответствует версии службы App Engine.
www-example-com default 2018121801 war ... org.springframework.boot spring-boot-dependencies 2.1.1.RELEASE ... ... com.example spring-boot-application 1.0.0
Также следует добавить зависимости во время выполнения. Например, необходимые зависимости для подключения к Google mysql
Экземпляр SQL будет включать в себя:
... com.google.cloud.sql mysql-socket-factory 1.0.11 runtime ... mysql mysql-connector-java 8.0.13 runtime
Необходимые плагины для сборки WAR и переупаковки WAR в качестве приложения Spring Boot следующие:
...... ...com.example.Launcher ...... ... org.apache.maven.plugins maven-war-plugin @ false true src/main/webapp org.springframework.boot spring-boot-maven-plugin build-info repackage ${start-class}
Дополнительные артефакты, используемые при создании ВОЙНЫ, включают src/main/resources/application-gcp.properties
,
spring.datasource.url: @spring.datasource.url@ spring.datasource.username: @spring.datasource.username@ spring.datasource.password: @spring.datasource.password@ spring.main.banner-mode: OFF
src/main/webapp/WEB-INF/web.xml
,
HTTPS Redirect /* CONFIDENTIAL
и src/main/webapp/WEB-INF/logging.properties
:
# Set the default logging level for all loggers to WARNING .level = WARNING
Ожидается, что результирующая ВОЙНА будет выполнена с включенным профилем Spring ” dhcp
“. Секреты в шаблоне могут быть заполнены путем установки соответствующих свойств Maven в сборке. 1 В то время как web.xml
не требуется аннотированному приложению Spring Boot, оно настроено на перенаправление http
трафика на https
и обеспечить управление сеансами.
Война может быть создана путем выполнения mvn clean package
.
Настройки для развертывания в Google App Engine
В “стандартной” среде движка приложений используется Причал
вместо/| Кота таким образом, зависимости приложений должны быть скорректированы путем добавления исключений:
... com.example spring-boot-application 1.0.0 commons-logging commons-logging javax.transaction javax.transaction-api org.springframework.boot spring-boot-starter-tomcat
Google предлагает как минимум два Maven плагины. На момент написания этой статьи двумя доступными плагинами являются:
... ...... com.google.appengine appengine-maven-plugin 1.9.70 com.google.cloud.tools appengine-maven-plugin 1.3.2
Google описывает первый как “основанный на App Engine SDK” и предоставляет документ об этом плагине здесь и второй как “Основанный на облачном SDK” с документом об этом плагине здесь . Плагин на основе облачного SDK также требует установки компонента app-engine-java
с помощью gcloud components install app-engine-java
.
Оба плагина (как и при любом развертывании в App Engine) требуют src/main/webapp/WEB-INF/appengine-web.xml
который либо задается и/или генерируется. Это приложение включает в себя следующее:
@project.groupId@ @project.artifactId@ @project.version@ java8 1 5m B1 true true
который имеет следующие функции (в дополнение к заданию масштабирования):
- Устанавливает переменную окружения
SPRING_PROFILES_ACTIVE
вgcp
для включения профиля Spring - Настроенный
java.util.ведение журнала
Для этой демонстрации com.google.appengine:appengine-maven-plugin
настроен в профиле Maven:
... ... com.google.appengine:appengine-maven-plugin ${basedir}/src/main/appengine/app.yaml com.google.appengine appengine-maven-plugin
Приложение может быть создано и развернуто с помощью mvn clean package appengine:deploy
. Пример вывода:
mvn -B clean package appengine:deploy [INFO] Scanning for projects... [INFO] [INFO] ---------------------< www-example-com:default >---------------------- [INFO] Building www-example-com default 1 [INFO] --------------------------------[ war ]--------------------------------- ... [INFO] --- appengine-maven-plugin:1.9.70:deploy (default-cli) @ default --- [INFO] [INFO] Google App Engine Java SDK - Updating Application [INFO] [INFO] Retrieving Google App Engine Java SDK from Maven [INFO] Downloading from central: https://repo1.maven.org/maven2/com/google/appengine/appengine-java-sdk/1.9.70/appengine-java-sdk-1.9.70.zip [INFO] Downloaded from central: https://repo1.maven.org/maven2/com/google/appengine/appengine-java-sdk/1.9.70/appengine-java-sdk-1.9.70.zip (183 MB at 15 MB/s) [INFO] Updating Google App Engine Application [INFO] Running -A www-example-com -V 1 --oauth2 update /Users/ball/www-example-com-service-default/target/default-1 Reading application configuration data... Beginning interaction for module default... 0% Created staging directory at: '/var/folders/c5/pzywv1k91gqgvkklp5r2twx00000gn/T/appcfg6118757389943856883.tmp' 5% Scanning for jsp files. 20% Scanning files on local disk. 25% Initiating update. 28% Cloning 162 application files. 40% Uploading 6 files. 52% Uploaded 1 files. 61% Uploaded 2 files. 68% Uploaded 3 files. 73% Uploaded 4 files. 77% Uploaded 5 files. 80% Uploaded 6 files. 82% Sending batch containing 6 file(s) totaling 231KB. 84% Initializing precompilation... 90% Deploying new version. 95% Will check again in 1 seconds. 98% Will check again in 2 seconds. 99% Will check again in 4 seconds. 99% Will check again in 8 seconds. 99% Closing update: new version is ready to start serving. 99% Uploading index definitions. Update for module default completed successfully. Success. Cleaning up temporary files for module default... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 48.730 s [INFO] Finished at: 2018-12-18T19:34:33-08:00 [INFO] ------------------------------------------------------------------------
Это развертывает службу, но не переключает балансировщик нагрузки на новую службу.
В com.google.cloud.инструменты:appengine-maven-plugin
может быть настроен с помощью src/main/appengine/app.yaml
:
... ... com.google.cloud.tools:appengine-maven-plugin ${basedir}/src/main/appengine/app.yaml com.google.cloud.tools appengine-maven-plugin ${project.groupId} ${project.artifactId} ${project.version}
Различные статьи предполагают, что минимальный app.yaml
может заменить appengine-web.xml
:
runtime: java8 env: standard
Однако он завершается ошибкой с загадочным сообщением об ошибке:
mvn -B clean package appengine:deploy [INFO] Scanning for projects... [INFO] [INFO] ---------------------< www-example-com:default >---------------------- [INFO] Building www-example-com default 2 [INFO] --------------------------------[ war ]--------------------------------- ... [INFO] --- appengine-maven-plugin:1.3.2:deploy (default-cli) @ default --- [INFO] Staging the application to: /Users/ball/www-example-com-service-default/target/appengine-staging [INFO] Detected App Engine flexible environment application. Dec 18, 2018 8:16:31 PM com.google.cloud.tools.appengine.cloudsdk.CloudSdk logCommand INFO: submitting command: /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/gcloud app deploy --version 2 --project www-example-com [INFO] GCLOUD: Services to deploy: [INFO] GCLOUD: [INFO] GCLOUD: descriptor: [/Users/ball/www-example-com-service-default/target/appengine-staging/app.yaml] [INFO] GCLOUD: source: [/Users/ball/www-example-com-service-default/target/appengine-staging] [INFO] GCLOUD: target project: [www-example-com] [INFO] GCLOUD: target service: [default] [INFO] GCLOUD: target version: [2] [INFO] GCLOUD: target url: [http://www-example-com.appspot.com] [INFO] GCLOUD: [INFO] GCLOUD: [INFO] GCLOUD: Beginning deployment of service [default]... [INFO] GCLOUD: ERROR: (gcloud.app.deploy) Cannot upload file [/Users/ball/www-example-com-service-default/target/appengine-staging/default-2.war], which has size [74408302] (greater than maximum allowed size of [33554432]). Please delete the file or add to the skip_files entry in your application .yaml file and try again. [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 12.260 s [INFO] Finished at: 2018-12-18T20:16:34-08:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal com.google.cloud.tools:appengine-maven-plugin:1.3.2:deploy (default-cli) on project default: Execution default-cli of goal com.google.cloud.tools:appengine-maven-plugin:1.3.2:deploy failed: Non zero exit: 1 -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException
Этот автор рекомендует использовать com.google.cloud.инструменты:appengine-maven-plugin
с полностью определенным appengine-web.xml
и тривиальный app.yaml
:
# Configured from src/main/webapp/WEB-INF/appengine-web.xml --------
С соответствующим выходом:
mvn -B clean package appengine:deploy [INFO] Scanning for projects... [INFO] [INFO] ----------------------< www-example-com:default >----------------------- [INFO] Building www-example-com default 3 [INFO] --------------------------------[ war ]--------------------------------- ... [INFO] --- appengine-maven-plugin:1.3.2:deploy (default-cli) @ default --- [INFO] Staging the application to: /Users/ball/www-example-com-service-default/target/appengine-staging [INFO] Detected App Engine standard environment application. Dec 18, 2018 8:30:22 PM com.google.cloud.tools.appengine.cloudsdk.CloudSdk logCommand INFO: submitting command: /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/jre/bin/java -cp /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/platform/google_appengine/google/appengine/tools/java/lib/appengine-tools-api.jar com.google.appengine.tools.admin.AppCfg --disable_update_check stage /Users/ball/www-example-com-service-default/target/default-3 /Users/ball/www-example-com-service-default/target/appengine-staging [INFO] GCLOUD: Reading application configuration data... [INFO] GCLOUD: [INFO] GCLOUD: [INFO] GCLOUD: Beginning interaction for module default... [INFO] GCLOUD: 0% Scanning for jsp files. [INFO] GCLOUD: 2018-12-18 20:30:24.932:INFO::main: Logging initialized @234ms to org.eclipse.jetty.util.log.StdErrLog [INFO] GCLOUD: 2018-12-18 20:30:25.048:INFO:oejs.Server:main: jetty-9.4.14.v20181114; built: 2018-11-14T21:20:31.478Z; git: c4550056e785fb5665914545889f21dc136ad9e6; jvm 1.8.0_192-b12 [INFO] GCLOUD: 2018-12-18 20:30:26.627:INFO:oeja.AnnotationConfiguration:main: Scanning elapsed time=989ms [INFO] GCLOUD: 2018-12-18 20:30:26.643:INFO:oejq.QuickStartDescriptorGenerator:main: Quickstart generating [INFO] GCLOUD: 2018-12-18 20:30:26.658:INFO:oejsh.ContextHandler:main: Started o.e.j.q.QuickStartWebApp@685cb137{/,file:///Users/ball/www-example-com-service-default/target/appengine-staging/,AVAILABLE} [INFO] GCLOUD: 2018-12-18 20:30:26.661:INFO:oejs.Server:main: Started @1964ms [INFO] GCLOUD: 2018-12-18 20:30:26.666:INFO:oejsh.ContextHandler:main: Stopped o.e.j.q.QuickStartWebApp@685cb137{/,file:///Users/ball/www-example-com-service-default/target/appengine-staging/,UNAVAILABLE} [INFO] GCLOUD: Success. [INFO] GCLOUD: Temporary staging for module default directory left in /Users/ball/www-example-com-service-default/target/appengine-staging Dec 18, 2018 8:30:26 PM com.google.cloud.tools.appengine.cloudsdk.CloudSdk logCommand INFO: submitting command: /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/gcloud app deploy --version 3 --project www-example-com [INFO] GCLOUD: Services to deploy: [INFO] GCLOUD: [INFO] GCLOUD: descriptor: [/Users/ball/www-example-com-service-default/target/appengine-staging/app.yaml] [INFO] GCLOUD: source: [/Users/ball/www-example-com-service-default/target/appengine-staging] [INFO] GCLOUD: target project: [www-example-com] [INFO] GCLOUD: target service: [default] [INFO] GCLOUD: target version: [3] [INFO] GCLOUD: target url: [https://www-example-com.appspot.com] [INFO] GCLOUD: [INFO] GCLOUD: [INFO] GCLOUD: Beginning deployment of service [default]... [INFO] GCLOUD: #============================================================# [INFO] GCLOUD: #= Uploading 3 files to Google Cloud Storage =# [INFO] GCLOUD: #============================================================# [INFO] GCLOUD: File upload done. [INFO] GCLOUD: Updating service [default]... [INFO] GCLOUD: ..............done. [INFO] GCLOUD: Setting traffic split for service [default]... [INFO] GCLOUD: .......done. [INFO] GCLOUD: Stopping version [www-example-com/default/2018121803]. [INFO] GCLOUD: Sent request to stop version [www-example-com/default/2018121803]. This operation may take some time to complete. If you would like to verify that it succeeded, run: [INFO] GCLOUD: $ gcloud app versions describe -s default 2018121803 [INFO] GCLOUD: until it shows that the version has stopped. [INFO] GCLOUD: Deployed service [default] to [https://www-example-com.appspot.com] [INFO] GCLOUD: [INFO] GCLOUD: You can stream logs from the command line by running: [INFO] GCLOUD: $ gcloud app logs tail -s default [INFO] GCLOUD: [INFO] GCLOUD: To view your application in the web browser run: [INFO] GCLOUD: $ gcloud app browse [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 37.537 s [INFO] Finished at: 2018-12-18T20:30:51-08:00 [INFO] ------------------------------------------------------------------------
pom.xml
Полный pom.xml
используется в этом примере:
4.0.0 www-example-com default 2018121801 war org.springframework.boot spring-boot-dependencies 2.1.1.RELEASE com.google.appengine:appengine-maven-plugin ${basedir}/src/main/appengine/app.yaml com.google.appengine appengine-maven-plugin com.google.cloud.tools:appengine-maven-plugin ${basedir}/src/main/appengine/app.yaml com.google.cloud.tools appengine-maven-plugin ${project.groupId} ${project.artifactId} ${project.version} com.example.Launcher com.example spring-boot-application 1.0.0 commons-logging commons-logging javax.transaction javax.transaction-api org.springframework.boot spring-boot-starter-tomcat com.google.cloud.sql mysql-socket-factory 1.0.11 runtime mysql mysql-connector-java 8.0.13 runtime com.google.appengine appengine-maven-plugin 1.9.70 com.google.cloud.tools appengine-maven-plugin 1.3.2 org.apache.maven.plugins maven-war-plugin @ false true src/main/webapp org.springframework.boot spring-boot-maven-plugin build-info repackage ${start-class} gcp
Рекомендации
- Пружинный Ботинок
- Облачная платформа Google
- Движок приложений Google
- Консоль облачной платформы Google
[1] Упражнение оставлено на усмотрение читателя. ↩
Оригинал: “https://dev.to/allenball/google-cloud-platform-app-engine-deployment-experience-jp0”