1. Visão geral
Esta série de codelabs (tutoriais práticos e individualizados) tem como objetivo ajudar os desenvolvedores Java do Google App Engine (padrão) a modernizar os apps, orientando-os em uma série de migrações. Seguindo essas etapas, é possível atualizar seu aplicativo para torná-lo mais portátil e decidir colocá-lo em contêineres para o Cloud Run, o serviço associado de hospedagem de contêineres do Google Cloud para o App Engine e outros serviços de hospedagem de contêineres.
Neste tutorial, ensinamos como conteinerizar um aplicativo do App Engine para implantação no serviço totalmente gerenciado do Cloud Run com um Dockerfile. Os Dockerfiles são o método de implantação mais prático para esta migração, mas também oferecem mais opções para personalizar seu processo de build.
Além de ensinar as etapas necessárias para migrar do App Engine para o Cloud Run, você também vai aprender a fazer upgrade de um app do App Engine em Java 8 para o Java 17.
Se o aplicativo que você está interessado em migrar usa muito o pacote de serviços legados do App Engine ou outros recursos específicos do App Engine, o guia Como acessar os serviços incluídos no App Engine para Java 11/17 pode ser um ponto de partida melhor do que este codelab.
Você vai aprender a
- Usar o Cloud Shell
- Ative as APIs Cloud Run, Artifact Registry e Cloud Build
- Conteinerizar o app usando o Docker, o Docker e o Cloud Build
- implante as imagens de contêiner no Cloud Run
O que é necessário
- Um projeto do Google Cloud Platform com uma conta de faturamento do GCP ativa e o App Engine ativado.
- Conhecimento prático de comandos comuns do Linux
- Conhecimento básico sobre desenvolvimento e implantação de apps no App Engine
- Um app de servlet Java 8 que você gostaria de migrar para o Java 17 e implantar no Cloud Run (pode ser um app no App Engine ou apenas na origem)
Pesquisa
Como você vai usar este tutorial?
Como você classificaria sua experiência com Java?
Como você classificaria sua experiência de uso dos serviços do Google Cloud?
2. Contexto
Sistemas PaaS, como o App Engine e o Cloud Functions, oferecem muitas conveniências para sua equipe e aplicativo, como permitir que SysAdmins e Devops se concentrem na criação de soluções. Com plataformas sem servidor, seu app pode escalonar automaticamente conforme necessário, reduzir a escala vertical até zero com o pagamento por utilização para ajudar a controlar custos e usar uma variedade de linguagens de desenvolvimento comuns.
No entanto, a flexibilidade dos contêineres também é interessante. Com a capacidade de escolher qualquer linguagem, qualquer biblioteca e qualquer binário, os contêineres oferecem o melhor dos dois mundos: a conveniência de usar um ambiente sem servidor e a flexibilidade dos contêineres. Isso é do que se trata o Google Cloud Run.
Aprender a usar o Cloud Run não está no escopo deste codelab. que são abordados na documentação do Cloud Run. O objetivo é que você se familiarize com a conteinerização do seu aplicativo do App Engine para o Cloud Run ou de outros serviços hospedados em contêineres. Há algumas coisas que você precisa saber antes de prosseguir, principalmente que sua experiência de usuário será um pouco diferente.
Neste codelab, você vai aprender a criar e implantar contêineres. Você vai aprender a conteinerizar seu app com um Dockerfile, migrar da configuração do App Engine e, opcionalmente, definir etapas de build para o Cloud Build. Isso envolve a retirada de certos recursos específicos do App Engine. Se preferir não seguir esse caminho, você ainda pode fazer upgrade para um ambiente de execução Java 11/17 enquanto mantém seus aplicativos no App Engine.
3. Configuração/Pré-trabalho
1. Configurar o projeto
Neste tutorial, você vai usar um app de exemplo do repositório appengine-java-migration-samples em um projeto novo. Verifique se o projeto tem uma conta de faturamento ativa.
Se você pretende mover um aplicativo atual do App Engine para o Cloud Run, use esse aplicativo para acompanhar.
Execute o seguinte comando para ativar as APIs necessárias para seu projeto:
gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com run.googleapis.com
2. Instalar o app de exemplo de referência
Clone o app de exemplo na sua máquina ou no Cloud Shell e navegue até a pasta valor de referência.
A amostra é um aplicativo do Datastore em Java 8 baseado em servlets para implantação no App Engine. Siga as instruções no README sobre como preparar este aplicativo para a implantação do App Engine.
3. (Opcional) Implantar um aplicativo de referência
As informações abaixo só são necessárias se você quiser confirmar se o app funciona no App Engine antes da migração para o Cloud Run.
Consulte as etapas em README.md:
- Instale a CLI
gcloud
e se familiarize novamente - Inicialize a gcloud CLI do seu projeto com
gcloud init
- Criar o projeto do App Engine com
gcloud app create
- Implantar o app de amostra no App Engine
./mvnw package appengine:deploy -Dapp.projectId=$PROJECT_ID
- Confirme se o aplicativo é executado no App Engine sem problemas
4. Crie um repositório do Artifact Registry
Depois de conteinerizar seu app, você vai precisar de algum lugar para enviar e armazenar suas imagens. A maneira recomendada de fazer isso no Google Cloud é com o Artifact Registry.
Crie o repositório chamado migration
com a gcloud da seguinte maneira:
gcloud artifacts repositories create migration --repository-format=docker \
--description="Docker repository for the migrated app" \
--location="northamerica-northeast1"
Esse repositório usa o tipo de formato docker
, mas há vários tipos de repositório disponíveis.
Neste ponto, você tem seu aplicativo de referência do App Engine e seu projeto do Google Cloud está preparado para migrá-lo para o Cloud Run.
4. Modificar arquivos do aplicativo
Nos casos em que o aplicativo faz uso intenso de serviços incluídos legados, configuração ou outros recursos exclusivos do App Engine do App Engine, recomendamos continuar acessando esses serviços durante o upgrade para o novo ambiente de execução. Este codelab demonstra um caminho de migração para aplicativos que já usam serviços independentes ou podem ser refatorados para isso.
1. Como fazer upgrade para o Java 17
Caso seu app use Java 8, faça upgrade para um candidato a LTS posterior, como 11 ou 17, para acompanhar as atualizações de segurança e ter acesso a novos recursos da linguagem.
Comece atualizando as propriedades no pom.xml
para incluir o seguinte:
<properties>
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
Isso vai definir a versão do projeto como 17, informar ao plug-in do compilador que você quer acessar os recursos da linguagem Java 17 e gostaria que as classes compiladas fossem compatíveis com a JVM do Java 17.
2. Incluir um servidor da Web
Há várias diferenças entre o App Engine e o Cloud Run que vale a pena considerar ao migrar entre eles. Uma diferença é que, embora o ambiente de execução do Java 8 do App Engine fornecesse e gerenciasse um servidor Jetty para os aplicativos hospedados, o Cloud Run não. Vamos usar o Spring Boot para nos fornecer um servidor da Web e um contêiner de servlet.
Adicione as seguintes dependências:
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.6</version>
<exclusions>
<!-- Exclude the Tomcat dependency -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Use Jetty instead -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
<version>2.6.6</version>
</dependency>
<!-- ... -->
</dependencies>
O Spring Boot incorpora um servidor Tomcat por padrão, mas este exemplo excluirá esse artefato e seguirá com o Jetty para minimizar as diferenças no comportamento padrão após a migração.
3. Configuração do Spring Boot
Embora o Spring Boot seja capaz de reutilizar seus servlets sem modificação, será necessária uma configuração para garantir que eles sejam detectáveis.
Crie a classe MigratedServletApplication.java
abaixo no pacote com.example.appengine
:
package com.example.appengine;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@ServletComponentScan
@SpringBootApplication
@EnableAutoConfiguration
public class MigratedServletApplication {
public static void main(String[] args) {
SpringApplication.run(MigratedServletApplication.class, args);
}
}
Isso inclui a anotação @ServletComponentScan
, que procurará qualquer @WebServlets
(no pacote atual por padrão) e os disponibilizará conforme esperado.
4. Como empacotar o app como um JAR
Embora seja possível conteinerizar seu app começando de uma guerra, isso fica mais fácil se você empacotá-lo como um JAR executável. Isso não exige muita configuração, principalmente para projetos que usam o Maven como uma ferramenta de build, já que o empacotamento de jar é o comportamento padrão.
Remova a tag packaging
do arquivo pom.xml
:
<packaging>war</packaging>
Em seguida, adicione spring-boot-maven-plugin
:
<plugins>
<!-- ... -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.6</version>
</plugin>
<!-- ... -->
</plugins>
5. Migrar da configuração, dos serviços e das dependências do App Engine
Como mencionado no início do codelab, o Cloud Run e o App Engine foram projetados para oferecer diferentes experiências do usuário. Certos recursos que o App Engine oferece prontos para uso, como os serviços Cron e Task Queue, precisam ser recriados manualmente e serão abordados em mais detalhes em módulos posteriores.
O app de exemplo não usa pacotes de serviços legados, mas os usuários desses apps podem consultar os seguintes guias:
- Como migrar de serviços em pacote para encontrar serviços independentes adequados.
- Migração de arquivos de configuração XML para YAML, para usuários que estão migrando para os ambientes de execução do Java 11/17 enquanto permanecem no App Engine.
Como você vai implantar no Cloud Run a partir de agora, o appengine-maven-plugin
pode ser removido:
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<!-- can be set w/ -DprojectId=myProjectId on command line -->
<projectId>${app.projectId}</projectId>
<!-- set the GAE version or use "GCLOUD_CONFIG" for an autogenerated GAE version -->
<version>GCLOUD_CONFIG</version>
</configuration>
</plugin>
5. Conteinerizar aplicativo
Agora você já pode informar ao Cloud Build como criar o contêiner do seu aplicativo. Com esse método de conteinerização, não é necessário ter um arquivo de configuração do build separado (cloudbuild.yaml). Basta definir um Dockerfile mínimo como ponto de partida:
DE eclipse-temurin
ARG JAR_FILE=JAR_FILE_ deve_BE_SPECIFIED_AS_BUILD_ARG
COPIAR ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar","/app.jar"]
Esse dockerfile agrupa a versão uber-jar do seu serviço de inicialização por mola em uma única camada. Essa é a abordagem mais simples para a conteinerização do Dockerfile, mas apresenta algumas desvantagens, principalmente ao comparar tempos repetidos em que as dependências são relativamente estáveis. Preocupações como essa são o motivo pelo qual esse método de conteinerização é considerado mais avançado. No entanto, pelo lado positivo, criar seu próprio dockerfile oferece controle total sobre a imagem de base e acesso aos benefícios de desempenho de criar uma imagem cuidadosamente em camadas.
2**. Executar o processo de compilação**
Agora que você informou o Cloud Build sobre as etapas de build desejadas, está tudo pronto para a implantação com um clique.
Execute este comando:
gcloud builds submit --tag LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME
Substitua os valores de marcador no comando acima pelo seguinte:
- LOCATION: o local regional ou multirregional do seu repositório.
- PROJECT_ID: é o ID do seu projeto do Cloud.
- REPOSITORY: o nome do repositório do Artifact Registry.
- IMAGE_NAME: o nome da sua imagem de contêiner.
Quando o processo for concluído, a imagem do contêiner será criada, armazenada no Artifact Registry e implantada no Cloud Run.
Ao final deste codelab, seu app vai ficar igual ao da pasta mod4-migrate-to-cloud-run.
Pronto! Você migrou um app do App Engine em Java 8 para o Java 17 e o Cloud Run e agora tem uma compreensão mais clara do trabalho envolvido ao alternar e escolher entre opções de hospedagem.
6. Resumo/limpeza
Parabéns! Você fez upgrade, conteinerizou e migrou seu app. Isso conclui este tutorial.
A próxima etapa é saber mais sobre os recursos de segurança de CI/CD e da cadeia de suprimentos de software disponíveis para implantação com o Cloud Build:
- Como criar etapas personalizadas de build com o Cloud Build
- Como criar e gerenciar gatilhos de build
- Como usar a verificação sob demanda no pipeline do Cloud Build
Opcional: limpar e/ou desativar o serviço
Se você implantou o aplicativo de amostra no App Engine durante este tutorial, lembre-se de desativar o aplicativo para evitar cobranças. Quando quiser avançar para o próximo codelab, você poderá reativá-lo. Enquanto os aplicativos do App Engine estiverem desativados, eles não terão tráfego para gerar cobranças. No entanto, o uso do Datastore poderá ser faturado se exceder a cota sem custo financeiro. Por isso, exclua o suficiente para ficar abaixo desse limite.
Por outro lado, se você não for continuar com as migrações e quiser excluir tudo por completo, poderá excluir seu serviço ou encerrar seu projeto totalmente.
7. Outros recursos
Problemas/comentários do módulo de migração do App Engine
Se você encontrar problemas com este codelab, pesquise seu problema antes de preenchê-lo. Links para pesquisar e criar novos problemas:
Recursos de migração
- Opções de migração para desagrupar os serviços do App Engine
- Como configurar gatilhos de build para o Cloud Build
- Mais informações sobre como migrar para o Java 11/17
Recursos on-line
Veja abaixo recursos on-line que podem ser relevantes para este tutorial:
App Engine
- Documentação do App Engine
- Informações de preços e cotas do App Engine
- Comparação entre a primeira e plataformas de segunda geração
- Suporte de longo prazo para ambientes de execução legados
Outras informações sobre a nuvem
- "Sempre sem custo financeiro" do Google Cloud nível
- CLI do Google Cloud (CLI
gcloud
) - Toda a documentação do Google Cloud
Vídeos
- Estação de migração sem servidor
- Expedições sem servidor
- Inscreva-se no Google Cloud Tech
- Inscreva-se no Google Developers
Licença
Este conteúdo está sob a licença Atribuição 2.0 Genérica da Creative Commons.