1. Visão geral
Esta série de codelabs (tutoriais práticos e autoguiados) tem como objetivo ajudar os desenvolvedores Java do Google App Engine (Padrão) a modernizar os aplicativos por meio de uma série de migrações. Seguindo estas etapas, você pode atualizar seu app para que ele seja mais portátil e decidir colocá-lo em um contêiner para o Cloud Run, o serviço irmã de hospedagem de contêiner do Google Cloud no App Engine e outros serviços de hospedagem de contêiner.
Neste tutorial, ensinamos como conteinerizar um aplicativo do App Engine para implantação no serviço totalmente gerenciado do Cloud Run usando o Buildpacks. Os buildpacks são um projeto do CNCF que permite levar seu app diretamente do código-fonte para imagens altamente portáteis que podem ser executadas em qualquer nuvem.
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 Java 8 do App Engine para o Java 17.
Se o aplicativo que você quer migrar usa muitos serviços agrupados legados do App Engine ou outros recursos específicos do App Engine, o guia Como acessar serviços agrupados do App Engine para Java 11/17 pode ser mais adequado do que este codelab.
Você vai aprender a
- Usar o Cloud Shell
- Ative as APIs Cloud Run, Artifact Registry e Cloud Build.
- Conteinerizar seu app usando o Buildpack no Cloud Build
- Implantar 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 como desenvolver e implantar apps do App Engine
- Um app de servlet Java 8 que você quer migrar para o Java 17 e implantar no Cloud Run (pode ser um app no App Engine ou apenas a 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
Os 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 ser escalonado automaticamente de acordo com a necessidade, reduzir o tamanho zero para pagar com pagamento por uso, ajudar a controlar custos e usar uma variedade de linguagens de desenvolvimento comuns.
No entanto, a flexibilidade dos contêineres também é atraente. Com a capacidade de escolher qualquer linguagem, biblioteca e binário, os contêineres oferecem o melhor dos dois mundos: a conveniência da computação sem servidor e a flexibilidade dos contêineres. É disso que se trata o Google Cloud Run.
O aprendizado deste codelab não está no escopo deste codelab coberto pela documentação do Cloud Run. O objetivo aqui é você saber como colocar o aplicativo do App Engine em um contêiner para o Cloud Run (ou 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 Buildpacks, migrar da configuração do App Engine e 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, ainda é possível fazer upgrade para um ambiente de execução do Java 11/17 e manter seus apps no App Engine.
3. Configuração/Pré-trabalho
1. Configurar 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 app do App Engine para o Cloud Run, use esse app para acompanhar o tutorial.
Execute o seguinte comando para ativar as APIs necessárias para o projeto:
gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com run.googleapis.com
2. Fazer o download do app de exemplo de valor de referência
Clone o app de exemplo na sua máquina ou no Cloud Shell e navegue até a pasta baseline.
O exemplo é um app do Datastore baseado em servlet Java 8 destinado à implantação no App Engine. Siga as instruções no README sobre como preparar este app para a implantação no App Engine.
3. (Opcional) Implantar o app de referência
As etapas a seguir são necessárias apenas se você quiser confirmar que o app funciona no App Engine antes da migração para o Cloud Run.
Consulte as etapas no README.md:
- Instalar/se familiarizar novamente com a CLI
gcloud
- Inicialize a gcloud CLI do seu projeto com
gcloud init
- Criar o projeto do App Engine com
gcloud app create
- Implantar o app de exemplo no App Engine
./mvnw package appengine:deploy -Dapp.projectId=$PROJECT_ID
- Confirme se o aplicativo é executado no App Engine sem problemas
4. Criar um repositório do Artifact Registry
Depois de contêinerizar o app, você vai precisar de um lugar para enviar e armazenar as imagens. A maneira recomendada de fazer isso no Google Cloud é com o Artifact Registry.
Crie o repositório com o nome migration
usando o gcloud:
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 o aplicativo do App Engine de referência e seu projeto do Google Cloud está preparado para a migração para o Cloud Run.
4. Modificar arquivos do aplicativo
Nos casos em que o app usa muito os serviços agrupados legados, a configuração ou outros recursos exclusivos do App Engine, recomendamos continuar acessando esses serviços durante a atualização 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, considere fazer 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 e 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 valem a pena considerar ao alternar entre eles. Uma diferença é que, enquanto o ambiente de execução do Java 8 do App Engine fornece e gerencia um servidor Jetty para os apps hospedados, o Cloud Run não faz isso. Vamos usar o Spring Boot para 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 exclui esse artefato e fica 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 vai procurar (no pacote atual por padrão) por qualquer @WebServlets
e disponibilizá-los conforme o esperado.
4. Configuração do build
Em seguida, remova a configuração para empacotar nosso aplicativo como um WAR. Isso não vai exigir muita configuração, principalmente para projetos que usam o Maven como uma ferramenta de build, já que a embalagem jar é o comportamento padrão.
Remova a tag packaging
no arquivo pom.xml
:
<packaging>war</packaging>
Em seguida, adicione a 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. Como 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 criados para oferecer experiências de usuário diferentes. Alguns recursos que o App Engine oferece de forma imediata, como os serviços Cron e Task Queue, precisam ser recriados manualmente e serão abordados com mais detalhes em módulos posteriores.
O app de exemplo não usa os serviços incluídos no pacote legados, mas os usuários cujos apps usam 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, 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 e implantar o aplicativo
Agora você pode implantar seu app no Cloud Run diretamente do código-fonte. Essa é uma excelente opção que usa o Cloud Build em segundo plano para oferecer uma experiência de implantação prática. Para usar esse recurso, é necessário ter uma conta com pelo menos uma das permissões a seguir e seguir estas etapas de configuração do ambiente ou usar o Cloud Shell:
- Papel de proprietário
- Papel de editor
- O conjunto de papéis a seguir:
- Papel de editor do Cloud Build
- Papel de administrador do Artifact Registry
- Papel de administrador de armazenamento
- Papel de administrador do Cloud Run
- Papel Usuário da conta de serviço
Com esses pré-requisitos em vigor, basta executar o seguinte no diretório de origem:
gcloud run deploy SERVICE --source .
Durante o comando run deploy, você vai precisar fazer algumas coisas, como:
- Fornecimento do local do código-fonte
- Fornecer o nome do serviço
- Como ativar a API Cloud Run
- Selecionando sua região
Depois de responder a essas solicitações, o processo de build e implantação começa, durante o qual o Cloud Build faz o seguinte:
- compacta e salva a origem em um bucket do Cloud Storage
- usa os buildpacks da Cloud Native Computing Foundation em segundo plano para criar sua imagem
- cria um registro para armazenar a imagem do contêiner resultante (se ainda não estiver presente)
- E cria um serviço do Cloud Run para hospedar seu app (se ele ainda não estiver presente)
Quando o build e a implantação forem concluídos, você vai receber uma mensagem explicando que uma nova revisão está ativa e veiculando 100% do tráfego.
6. Resumo/limpeza
Parabéns! Você fez upgrade, criou um contêiner, migrou e seu app, o que conclui este tutorial.
A próxima etapa é conhecer os recursos de CI/CD e segurança da cadeia de suprimentos de software que você pode implantar com o Cloud Build:
- Como criar etapas de build personalizadas 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 app de exemplo no App Engine durante este tutorial, desative o app para evitar cobranças. Quando estiver tudo pronto para passar para o próximo codelab, você poderá reativá-lo. Enquanto os apps do App Engine estão desativados, eles não recebem tráfego, mas o uso do Datastore pode ser cobrado se exceder a cota sem custo financeiro. 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 desempacotar serviços do App Engine
- Como configurar acionadores de build no Cloud Build
- Mais informações sobre como migrar para o Java 11/17
Recursos on-line
Confira abaixo alguns 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 as plataformas de primeira e segunda geração
- Suporte de longo prazo para ambientes de execução legados
Outras informações do Cloud
- Nível "Sempre sem custo financeiro" do Google Cloud
- Google Cloud CLI (
gcloud
CLI) - Toda a documentação do Google Cloud
Vídeos
- Estação de migração sem servidor
- Expedições sem servidor
- Assine a 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.