Рубрики
Без рубрики

Опыт развертывания движка приложений Google Cloud Platform

В этой статье описываются некоторые проблемы и особенности развертывания аннотированного @Springboot… С тегами java, spring, gcp, gae.

В этой статье описываются некоторые проблемы и особенности развертывания аннотированного приложения @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
          
        
      
    
  

Рекомендации

[1] Упражнение оставлено на усмотрение читателя. ↩

Оригинал: “https://dev.to/allenball/google-cloud-platform-app-engine-deployment-experience-jp0”