Crea un'app Java nell'ambiente flessibile di App Engine

ID regione

Il REGION_ID è un codice abbreviato che Google assegna in base alla regione selezionata durante la creazione dell'app. Il codice non corrisponde a un paese o a una provincia, anche se alcuni ID regione possono sembrare simili ai codici di paesi e province di uso comune. Per le app create dopo febbraio 2020, REGION_ID.r è incluso negli URL App Engine. Per le app esistenti create prima di questa data, l'ID regione è facoltativo nell'URL.

Scopri di più sugli ID regione.

Questa guida rapida mostra come creare ed eseguire il deployment di un'app che visualizza un breve messaggio. L'applicazione di esempio utilizza Java versione 17.

Prima di iniziare

Questa guida rapida presuppone che tu abbia installato Java SE 17 Development Kit (JDK) sulla tua macchina locale.
  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.

    Go to project selector

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

  4. Enable the Cloud Build API.

    Enable the API

  5. Install the Google Cloud CLI.

  6. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere alla gcloud CLI con la tua identità federata.

  7. Per inizializzare gcloud CLI, esegui questo comando:

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

    Go to project selector

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

  10. Enable the Cloud Build API.

    Enable the API

  11. Install the Google Cloud CLI.

  12. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere alla gcloud CLI con la tua identità federata.

  13. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  14. A causa delle modifiche al comportamento predefinito per il modo in cui Cloud Build utilizza i service account nei nuovi progetti e delle modifiche ai criteri dell'organizzazione sicuri per impostazione predefinita, potresti dover concedere ruoli aggiuntivi al account di servizio di deployment. Per ulteriori informazioni sulla concessione di ruoli specifici, consulta la guida alla risoluzione dei problemi.
  15. Prerequisiti aggiuntivi

    1. Inizializza la tua app App Engine con il tuo progetto e scegli la relativa area geografica:

      gcloud app create --project=[YOUR_PROJECT_ID]
      

      Quando richiesto, seleziona la regione in cui vuoi collocare l'applicazione App Engine.

    2. Installa i seguenti elementi sulla tua macchina locale:

    Località App Engine

    App Engine è regionale, il che significa che l'infrastruttura che esegue le tue app si trova in una regione specifica e Google la gestisce in modo che sia disponibile in modo ridondante in tutte le zone all'interno di quella regione.

    Soddisfare i requisiti di latenza, disponibilità o durabilità sono fattori primari per la selezione della regione in cui vengono eseguite le tue app. In genere puoi selezionare la regione più vicina agli utenti della tua app, ma devi considerare le posizioni in cui è disponibile App Engine e le posizioni degli altri Google Cloud prodotti e servizi utilizzati dalla tua app. L'utilizzo di servizi in più località può influire sulla latenza della tua app e sui relativi prezzi.

    Non puoi modificare la regione di un'app dopo averla impostata.

    Se hai già creato un'applicazione App Engine, puoi visualizzarne la regione in uno dei seguenti modi:

    scarica l'app Hello World

    Abbiamo creato un'app Hello World per App Engine in modo che tu possa farti rapidamente un'idea di come eseguire il deployment di un'app in Google Cloud.

    1. Clona il repository dell'app di esempio Hello World sulla tua macchina locale.

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

      In alternativa puoi scaricare l'esempio come file ZIP ed estrarlo.

    2. Passa alla directory che contiene il codice campione.

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

    Esegui Hello World sulla tua macchina locale

    Per eseguire l'applicazione Hello World nel computer locale:

    1. Esegui questo comando:
      java -jar target/micronaut-helloworld-0.1.jar
    2. Nel browser web, inserisci il seguente indirizzo:

      http://localhost:8080

      Se utilizzi Cloud Shell, nella barra degli strumenti fai clic su Anteprima web e seleziona Anteprima sulla porta 8080.

    Sulla pagina viene visualizzato il messaggio Hello World dell'app di esempio. Nella finestra del terminale, premi Ctrl+C per uscire dal server web.

    Esegui il deployment di Hello World e avviala in App Engine

    Per eseguire il deployment dell'app nell'ambiente flessibile di App Engine:

    1. Esegui il deployment dell'app Hello World eseguendo il seguente comando dalla directory java-17/micronaut-helloworld:

      mvn clean package appengine:deploy
    2. Avvia il browser per visualizzare l'app all'indirizzo https://PROJECT_ID.REGION_ID.r.appspot.com

      gcloud app browse
      , dove PROJECT_ID rappresenta l'ID progetto Google Cloud.

    Questa volta, la pagina che mostra il messaggio Hello World viene fornita da un server web in esecuzione su un'istanza App Engine.

    Complimenti! Hai eseguito il deployment della tua prima app App Engine nell'ambiente flessibile di App Engine.

    Se si sono verificati errori durante il deployment dell'applicazione, consulta i suggerimenti per la risoluzione dei problemi.

    Consulta le sezioni seguenti per informazioni sulla pulizia e link ai possibili passaggi successivi che puoi intraprendere.

    Esegui la pulizia

    Per evitare addebiti, puoi eliminare il tuo progetto Google Cloud per interrompere la fatturazione per tutte le risorse utilizzate al suo interno.

    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.

    Passaggi successivi

    Imparare a usare l'intera piattaforma

    Ora che sai come sviluppare ed eseguire il deployment delle app App Engine, puoi esplorare il resto di Google Cloud. Hai già installato Google Cloud CLI, che ti fornisce gli strumenti per interagire con prodotti come Cloud SQL, Cloud Storage, Firestore e altri ancora.

    Scopri di più sull'ambiente flessibile di App Engine

    Ecco alcuni argomenti per continuare a imparare a utilizzare App Engine:

    Revisione del codice Hello World

    Hello World è l'app App Engine più semplice possibile, in quanto contiene un solo servizio, ha una sola versione e tutto il codice si trova nella directory principale dell'app. Questa sezione descrive in dettaglio ciascuno dei file dell'app.

    HelloControllerTest.java

    Il file HelloControllerTest.java specifica un pattern URL che descrive dove l'app ascolterà le richieste e risponde a qualsiasi richiesta con il messaggio "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

    Il file app.yaml descrive la seguente configurazione per la tua app:

    • Imposta env: flex, indicando che la tua app utilizza l'ambiente flessibile di App Engine.
    • Specifica il runtime utilizzato dall'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

      Hello World include anche un file pom.xml, che contiene informazioni sul progetto, ad esempio le dipendenze e la destinazione di build.

      <?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>