Crea ed esegui il deployment di una funzione Cloud Run HTTP utilizzando Java (1ª generazione.)

Questa guida ti illustra la procedura per scrivere una funzione Cloud Run utilizzando il runtime Java. Esistono due tipi di funzioni Cloud Run:

  • Una funzione HTTP, che richiami da richieste HTTP standard.
  • Una funzione basata su eventi, che utilizzi per gestire gli eventi della tua infrastruttura cloud, ad esempio i messaggi in un argomento Pub/Sub o le modifiche in un bucket Cloud Storage.

Il documento mostra come creare una semplice funzione HTTP e compilarla utilizzando Maven o Gradle.

Prima di iniziare

  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. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Functions and Cloud Build APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Cloud Functions and Cloud Build APIs.

    Enable the APIs

  8. Installa e inizializza Google Cloud SDK.
  9. Aggiorna e installa i componenti di gcloud:
    gcloud components update
  10. Prepara l'ambiente di sviluppo.

    Vai alla guida alla configurazione di Java

  11. Crea una funzione

    Questa sezione descrive come creare una funzione.

    Maven

    1. Crea una directory sul sistema locale per il codice della funzione:

      Linux o Mac OS X:

       mkdir ~/helloworld
       cd ~/helloworld
      

      Windows:

       mkdir %HOMEPATH%\helloworld
       cd %HOMEPATH%\helloworld
      
    2. Crea la struttura del progetto in modo che contenga la directory di origine e il file di origine.

      mkdir -p src/main/java/functions
      touch src/main/java/functions/HelloWorld.java
      
    3. Aggiungi i seguenti contenuti al file HelloWorld.java:

      
      package functions;
      
      import com.google.cloud.functions.HttpFunction;
      import com.google.cloud.functions.HttpRequest;
      import com.google.cloud.functions.HttpResponse;
      import java.io.BufferedWriter;
      import java.io.IOException;
      
      public class HelloWorld implements HttpFunction {
        // Simple function to return "Hello World"
        @Override
        public void service(HttpRequest request, HttpResponse response)
            throws IOException {
          BufferedWriter writer = response.getWriter();
          writer.write("Hello World!");
        }
      }

      Questa funzione di esempio restituisce il saluto "Hello World!".

    Gradle

    1. Crea una directory sul sistema locale per il codice della funzione:

      Linux o Mac OS X:

       mkdir ~/helloworld-gradle
       cd ~/helloworld-gradle
      

      Windows:

       mkdir %HOMEPATH%\helloworld-gradle
       cd %HOMEPATH%\helloworld-gradle
      
    2. Crea la struttura del progetto in modo che contenga la directory di origine e il file di origine.

       mkdir -p src/main/java/functions
       touch src/main/java/functions/HelloWorld.java
      
    3. Aggiungi i seguenti contenuti al file HelloWorld.java:

      
      package functions;
      
      import com.google.cloud.functions.HttpFunction;
      import com.google.cloud.functions.HttpRequest;
      import com.google.cloud.functions.HttpResponse;
      import java.io.BufferedWriter;
      import java.io.IOException;
      
      public class HelloWorld implements HttpFunction {
        // Simple function to return "Hello World"
        @Override
        public void service(HttpRequest request, HttpResponse response)
            throws IOException {
          BufferedWriter writer = response.getWriter();
          writer.write("Hello World!");
        }
      }

      Questa funzione di esempio restituisce il saluto "Hello World!".

    Specifica delle dipendenze

    Il passaggio successivo consiste nel configurare le dipendenze:

    Maven

    Passa alla directory helloworld che hai creato in precedenza e crea un file pom.xml:

     cd ~/helloworld
     touch pom.xml
    

    Per gestire le dipendenze utilizzando Maven, specifica le dipendenze nella sezione <dependencies> all'interno del file pom.xml del tuo progetto. Per questo esercizio, copia i seguenti contenuti nel file pom.xml.

    <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.functions</groupId>
      <artifactId>functions-hello-world</artifactId>
      <version>1.0.0-SNAPSHOT</version>
      <properties>
        <maven.compiler.target>11</maven.compiler.target>
        <maven.compiler.source>11</maven.compiler.source>
      </properties>
    
      <dependencies>
        <!-- Required for Function primitives -->
        <dependency>
          <groupId>com.google.cloud.functions</groupId>
          <artifactId>functions-framework-api</artifactId>
          <version>1.1.0</version>
          <scope>provided</scope>
        </dependency>
      </dependencies>
    
      <build>
        <plugins>
          <plugin>
            <!--
              Google Cloud Functions Framework Maven plugin
    
              This plugin allows you to run Cloud Functions Java code
              locally. Use the following terminal command to run a
              given function locally:
    
              mvn function:run -Drun.functionTarget=your.package.yourFunction
            -->
            <groupId>com.google.cloud.functions</groupId>
            <artifactId>function-maven-plugin</artifactId>
            <version>0.11.0</version>
            <configuration>
              <functionTarget>functions.HelloWorld</functionTarget>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>

    Consulta helloworld per un esempio completo basato su Maven.

    Gradle

    Passa alla directory helloworld-gradle creata in precedenza e crea un file build.gradle:

     cd ~/helloworld-gradle
     touch build.gradle
    

    Per gestire le dipendenze utilizzando Gradle, specifica le dipendenze nel file build.gradle del tuo progetto. Per questo esercizio, copia i seguenti contenuti nel file build.gradle. Tieni presente che questo file build.gradle include un'attività personalizzata per aiutarti a eseguire le funzioni localmente.

    apply plugin: 'java'
    
    repositories {
      jcenter()
      mavenCentral()
    }
    configurations {
        invoker
    }
    
    dependencies {
      // Every function needs this dependency to get the Functions Framework API.
      compileOnly 'com.google.cloud.functions:functions-framework-api:1.1.0'
    
      // To run function locally using Functions Framework's local invoker
      invoker 'com.google.cloud.functions.invoker:java-function-invoker:1.3.1'
    
      // These dependencies are only used by the tests.
      testImplementation 'com.google.cloud.functions:functions-framework-api:1.1.0'
      testImplementation 'junit:junit:4.13.2'
      testImplementation 'com.google.truth:truth:1.4.0'
      testImplementation 'org.mockito:mockito-core:5.10.0'
    
    }
    
    // Register a "runFunction" task to run the function locally
    tasks.register("runFunction", JavaExec) {
      main = 'com.google.cloud.functions.invoker.runner.Invoker'
      classpath(configurations.invoker)
      inputs.files(configurations.runtimeClasspath, sourceSets.main.output)
      args(
        '--target', project.findProperty('run.functionTarget') ?: '',
        '--port', project.findProperty('run.port') ?: 8080
      )
      doFirst {
        args('--classpath', files(configurations.runtimeClasspath, sourceSets.main.output).asPath)
      }
    }

    Consulta helloworld-gradle per un esempio completo basato su Gradle.

    Creare build e testare in locale

    Prima di eseguire il deployment della funzione, puoi crearla e testarla localmente:

    Maven

    Esegui questo comando per verificare che la build della funzione sia stata eseguita:

    mvn compile
    

    Un'altra opzione è utilizzare il comando mvn package per compilare il codice Java, eseguire i test e comprimere il codice in un file JAR all'interno della directory di destinazione. Puoi scoprire di più sul ciclo di vita della build Maven qui.

    Per testare la funzione, esegui questo comando:

    mvn function:run
    

    Gradle

    Esegui questo comando per verificare che la build della funzione sia stata eseguita:

    gradle build
    

    Per testare la funzione, esegui questo comando:

    gradle runFunction -Prun.functionTarget=functions.HelloWorld
    

    Se il test viene completato correttamente, viene visualizzato l'URL che puoi visitare nel browser web per vedere la funzione in azione: http://localhost:8080/. Dovresti visualizzare un messaggio Hello World!.

    In alternativa, puoi inviare richieste a questa funzione utilizzando curl da un'altra finestra del terminale:

    curl localhost:8080
    # Output: Hello World!
    

    esegui il deployment della funzione

    Maven

    Per il deployment della funzione con un trigger HTTP, esegui questo comando nella directory helloworld:

    gcloud functions deploy my-first-function --no-gen2 --entry-point functions.HelloWorld --runtime java17 --trigger-http --memory 512MB --allow-unauthenticated
    dove my-first-function è il nome registrato con cui la funzione verrà identificata nella console Google Cloud e --entry-point specifica il nome completo della classe (FQN) della funzione.

    Gradle

    Per il deployment della funzione con un trigger HTTP, esegui questo comando nella directory helloworld-gradle:

    gcloud functions deploy my-first-function --no-gen2 --entry-point functions.HelloWorld --runtime java17 --trigger-http --memory 512MB --allow-unauthenticated
    dove my-first-function è il nome registrato con cui la funzione verrà identificata nella console Google Cloud e --entry-point specifica il nome completo della classe (FQN) della funzione.

    Testa la funzione di cui hai eseguito il deployment

    1. Al termine del deployment della funzione, annota la proprietà httpsTrigger.url o cercala utilizzando il seguente comando:

      gcloud functions describe my-first-function
      Dovrebbe avere il seguente aspetto:

      https://GCP_REGION-PROJECT_ID.cloudfunctions.net/my-first-function
    2. Accedi all'URL dal browser. Dovresti visualizzare un messaggio Hello World!.

    Visualizza i log

    I log per Cloud Run Functions sono visualizzabili utilizzando Google Cloud CLI e nell'interfaccia utente di Cloud Logging.

    Utilizzare lo strumento a riga di comando

    Per visualizzare i log per la tua funzione con gcloud CLI, utilizza il comando logs read, seguito dal nome della funzione:

    gcloud functions logs read my-first-function

    L'output dovrebbe essere simile al seguente:

    LEVEL  NAME               EXECUTION_ID  TIME_UTC                 LOG
    D      my-first-function  k2bqgroszo4u  2020-07-24 18:18:01.791  Function execution started
    D      my-first-function  k2bqgroszo4u  2020-07-24 18:18:01.958  Function execution took 168 ms, finished with status code: 200
    ...

    Utilizzare la dashboard Logging

    Puoi visualizzare i log per Cloud Run Functions anche dalla consoleGoogle Cloud .