Crie uma app Java no ambiente flexível do App Engine

ID da região

O REGION_ID é um código abreviado que a Google atribui com base na região que seleciona quando cria a sua app. O código não corresponde a um país ou uma província, embora alguns IDs de regiões possam parecer semelhantes aos códigos de países e províncias usados frequentemente. Para apps criadas após fevereiro de 2020, REGION_ID.r está incluído nos URLs do App Engine. Para apps existentes criadas antes desta data, o ID da região é opcional no URL.

Saiba mais acerca dos IDs de regiões.

Este início rápido demonstra como criar e implementar uma app que apresenta uma mensagem curta. A aplicação de exemplo usa a versão 17 do Java.

Antes de começar

Este início rápido pressupõe que instalou o Java SE 17 Development Kit (JDK) na sua máquina local.
  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Build API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  5. Install the Google Cloud CLI.

  6. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  7. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Cloud Build API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  11. Install the Google Cloud CLI.

  12. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  13. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  14. Devido a alterações no comportamento predefinido da forma como o Cloud Build usa as contas de serviço em novos projetos e alterações à política organizacional segura por predefinição, pode ter de conceder funções adicionais à sua conta de serviço de implementação. Para mais informações sobre a concessão de funções específicas, consulte o guia de resolução de problemas.
  15. Pré-requisitos adicionais

    1. Inicialize a app do App Engine com o seu projeto e escolha a respetiva região:

      gcloud app create --project=[YOUR_PROJECT_ID]
      

      Quando lhe for pedido, selecione a região onde quer localizar a sua aplicação do App Engine.

    2. Instale o seguinte na sua máquina local:

    Localizações do App Engine

    O App Engine é regional, o que significa que a infraestrutura que executa as suas apps está localizada numa região específica e é gerida pela Google para estar disponível de forma redundante em todas as zonas dessa região.

    O cumprimento dos requisitos de latência, disponibilidade ou durabilidade são fatores principais para selecionar a região onde as suas apps são executadas. Geralmente, pode selecionar a região mais próxima dos utilizadores da sua app, mas deve considerar as localizações onde o App Engine está disponível, bem como as localizações dos outrosGoogle Cloud produtos e serviços que a sua app usa. A utilização de serviços em várias localizações pode afetar a latência da sua app, bem como os respetivos preços.

    Não pode alterar a região de uma app depois de a definir.

    Se já tiver criado uma aplicação do App Engine, pode ver a respetiva região através de uma das seguintes ações:

    Transfira a app Hello World

    Criámos uma app Hello World para o App Engine para que possa rapidamente experimentar a implementação de uma app no Google Cloud.

    1. Clone o repositório da app de exemplo Hello World para a sua máquina local.

      git clone https://github.com/GoogleCloudPlatform/java-docs-samples
      

      Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo.

    2. Altere para o diretório que contém o exemplo de código.

         cd java-docs-samples/flexible/java-17/micronaut-helloworld
      

    Execute o Hello World na sua máquina local

    Para executar a app Hello World no seu computador local:

    1. Execute o seguinte comando:
      java -jar target/micronaut-helloworld-0.1.jar
    2. No navegador de Internet, introduza o seguinte endereço:

      http://localhost:8080

      Se estiver a usar o Cloud Shell, na barra de ferramentas, clique em Pré-visualização Web e selecione Pré-visualizar na porta 8080.

    A mensagem Hello World da app de exemplo é apresentada na página. Na janela de terminal, prima Ctrl+C para sair do servidor Web.

    Implemente e execute o Hello World no App Engine

    Para implementar a sua app no ambiente flexível do App Engine:

    1. Implemente a app Hello World executando o seguinte comando a partir do diretório java-17/micronaut-helloworld:

      mvn clean package appengine:deploy
    2. Inicie o navegador para ver a app em https://PROJECT_ID.REGION_ID.r.appspot.com

      gcloud app browse
      onde PROJECT_ID representa o seu Google Cloud ID do projeto.

    Desta vez, a página que apresenta a mensagem Hello World é fornecida por um servidor Web em execução numa instância do App Engine.

    Parabéns! Implementou a sua primeira app do App Engine no ambiente flexível do App Engine!

    Se encontrou erros ao implementar a sua aplicação, consulte as sugestões de resolução de problemas.

    Consulte as secções seguintes para obter informações sobre a limpeza, bem como links para possíveis passos seguintes que pode seguir.

    Limpar

    Para evitar incorrer em custos, pode eliminar o seu Google Cloud projeto para parar a faturação de todos os recursos usados nesse projeto.

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    O que se segue?

    Conheça toda a plataforma

    Agora que já sabe como é desenvolver e implementar apps do App Engine, pode explorar o resto do Google Cloud. Já tem a CLI do Google Cloud instalada, o que lhe dá as ferramentas para interagir com produtos como o Cloud SQL, o Cloud Storage, o Firestore e muito mais.

    Saiba mais sobre o ambiente flexível do App Engine

    Seguem-se alguns tópicos para continuar a aprender sobre o App Engine:

    Revisão do código Olá, mundo

    O Hello World é a app do App Engine mais simples possível, uma vez que contém apenas um serviço, tem apenas uma versão e todo o código está localizado no diretório raiz da app. Esta secção descreve detalhadamente cada um dos ficheiros da app.

    HelloControllerTest.java

    O ficheiro HelloControllerTest.java especifica um padrão de URL que descreve onde a app vai ouvir pedidos e responde a todos os pedidos com a mensagem "Hello World".

    /*
     * Copyright 2023 Google LLC
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     * http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    package com.example.appengine;
    
    import static org.junit.Assert.assertEquals;
    
    import io.micronaut.context.ApplicationContext;
    import io.micronaut.http.HttpRequest;
    import io.micronaut.http.client.HttpClient;
    import io.micronaut.runtime.server.EmbeddedServer;
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;
    
    public class HelloControllerTest {
      private static EmbeddedServer server;
      private static HttpClient client;
    
      @BeforeClass
      public static void setupServer() {
    
        server = ApplicationContext.run(EmbeddedServer.class);
    
        client = server.getApplicationContext().createBean(HttpClient.class, server.getURL());
      }
    
      @AfterClass
      public static void stopServer() {
        if (client != null) {
          client.stop();
        }
        if (server != null) {
          server.stop();
        }
      }
    
      @Test
      public void testHelloWorldResponse() {
        String response = client.toBlocking().retrieve(HttpRequest.GET("/"));
        assertEquals("Hello World!", response);
      }
    }
    

    app.yaml

    O ficheiro app.yaml descreve a seguinte configuração para a sua app:

    • Define env: flex, indicando que a sua app usa o ambiente flexível do App Engine.
    • Especifica o tempo de execução usado pela app.

      runtime: java
      env: flex
      runtime_config:
        operating_system: ubuntu22
        runtime_version: 17
      handlers:
      - url: /.*
        script: this field is required, but ignored
      
      manual_scaling:
        instances: 1

      pom.xml

      O Hello World também inclui um ficheiro pom.xml, que contém informações sobre o projeto, como as respetivas dependências e o destino de compilação.

      <?xml version="1.0" encoding="UTF-8"?>
      <!--
        Copyright 2023 Google LLC
        Licensed under the Apache License, Version 2.0 (the "License");
        you may not use this file except in compliance with the License.
        You may obtain a copy of the License at
             http://www.apache.org/licenses/LICENSE-2.0
        Unless required by applicable law or agreed to in writing, software
        distributed under the License is distributed on an "AS IS" BASIS,
        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        See the License for the specific language governing permissions and
        limitations under the License.
      -->
      <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>
        <groupId>com.example.appengine.flexible</groupId>
        <artifactId>micronaut-helloworld</artifactId>
        <version>0.1</version>
      
        <!--
        The parent pom defines common style checks and testing strategies for our samples.
        Removing or replacing it should not affect the execution of the samples in anyway.
        -->
        <parent>
            <groupId>com.google.cloud.samples</groupId>
            <artifactId>shared-configuration</artifactId>
            <version>1.2.0</version>
        </parent>
      
        <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          <exec.mainClass>com.example.appengine.Application</exec.mainClass>
          <maven.compiler.target>11</maven.compiler.target>
          <maven.compiler.source>11</maven.compiler.source>
          <micronaut.version>3.10.3</micronaut.version>
        </properties>
      
        <dependencies>
          <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-inject</artifactId>
            <version>${micronaut.version}</version>
            <scope>compile</scope>
          </dependency>
          <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-validation</artifactId>
            <version>${micronaut.version}</version>
            <scope>compile</scope>
          </dependency>
          <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-runtime</artifactId>
            <version>${micronaut.version}</version>
            <scope>compile</scope>
          </dependency>
          <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-http-client</artifactId>
            <version>${micronaut.version}</version>
            <scope>compile</scope>
          </dependency>
          <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
            <scope>compile</scope>
          </dependency>
          <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-http-server-netty</artifactId>
            <version>${micronaut.version}</version>
            <scope>compile</scope>
          </dependency>
          <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
          </dependency>
        </dependencies>
      
        <build>
          <plugins>
            <plugin>
              <groupId>com.google.cloud.tools</groupId>
              <artifactId>appengine-maven-plugin</artifactId>
              <version>2.8.0</version>
              <configuration>
                <projectId>GCLOUD_CONFIG</projectId>
                <version>micronaut-helloworld</version>
              </configuration>
            </plugin>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-shade-plugin</artifactId>
              <version>3.5.1</version>
              <executions>
                <execution>
                  <phase>package</phase>
                  <goals>
                    <goal>shade</goal>
                  </goals>
                  <configuration>
                    <transformers>
                      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>${exec.mainClass}</mainClass>
                      </transformer>
                      <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                    </transformers>
                  </configuration>
                </execution>
              </executions>
            </plugin>
            <plugin>
              <groupId>org.codehaus.mojo</groupId>
              <artifactId>exec-maven-plugin</artifactId>
              <version>3.1.1</version>
              <configuration>
                <executable>java</executable>
                <arguments>
                  <argument>-noverify</argument>
                  <argument>-XX:TieredStopAtLevel=1</argument>
                  <argument>-Dcom.sun.management.jmxremote</argument>
                  <argument>-classpath</argument>
                  <classpath/>
                  <argument>${exec.mainClass}</argument>
                </arguments>
              </configuration>
            </plugin>
            <plugin>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>3.2.5</version>
            </plugin>
      
              <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.12.1</version>
                <configuration>
                  <encoding>UTF-8</encoding>
                  <compilerArgs>
                    <arg>-parameters</arg>
                  </compilerArgs>
                  <annotationProcessorPaths>
                    <path>
                      <groupId>io.micronaut</groupId>
                      <artifactId>micronaut-inject-java</artifactId>
                      <version>${micronaut.version}</version>
                    </path>
                    <path>
                      <groupId>io.micronaut</groupId>
                      <artifactId>micronaut-validation</artifactId>
                      <version>${micronaut.version}</version>
                    </path>
                  </annotationProcessorPaths>
                </configuration>
                <executions>
                  <execution>
                    <id>test-compile</id>
                    <goals>
                      <goal>testCompile</goal>
                    </goals>
                    <configuration>
                      <compilerArgs>
                        <arg>-parameters</arg>
                      </compilerArgs>
                      <annotationProcessorPaths>
                        <path>
                          <groupId>io.micronaut</groupId>
                          <artifactId>micronaut-inject-java</artifactId>
                          <version>${micronaut.version}</version>
                        </path>
                        <path>
                          <groupId>io.micronaut</groupId>
                          <artifactId>micronaut-validation</artifactId>
                          <version>${micronaut.version}</version>
                        </path>
                      </annotationProcessorPaths>
                    </configuration>
                  </execution>
                </executions>
              </plugin>
            </plugins>
      
        </build>
      </project>