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

Questa guida illustra il processo di scrittura di una Cloud Function utilizzando il runtime Java. Esistono due tipi di funzioni Cloud Functions:

  • Una funzione HTTP, che richiami dalle richieste HTTP standard.
  • Una funzione basata su eventi, che puoi utilizzare per gestire gli eventi dalla tua infrastruttura Cloud, come i messaggi su un argomento Pub/Sub o le modifiche in un bucket Cloud Storage.

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

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Abilita le API Cloud Functions and Cloud Build.

    Abilita le API

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

    Go to project selector

  6. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  7. Abilita le API Cloud Functions and Cloud Build.

    Abilita le API

  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

crea una funzione

Questa sezione descrive come creare una funzione.

Maven

  1. Crea una directory sul tuo 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 che contenga la directory 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 tuo 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 che contenga la directory 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 è impostare le dipendenze:

Maven

Passa alla directory helloworld creata 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 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>

Vedi 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 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)
  }
}

Vedi helloworld-gradle per un campione completo basato su Gradle.

Creazione e test in locale

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

Maven

Esegui questo comando per verificare che la funzione venga creata:

mvn compile

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

Per testare la funzione, esegui questo comando:

mvn function:run

Gradle

Esegui questo comando per verificare che la funzione venga creata:

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 tuo browser web per vedere la funzione in azione: http://localhost:8080/. Dovresti vedere 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 eseguire il deployment della funzione con un trigger HTTP, esegui questo comando nella directory helloworld:

gcloud functions deploy my-first-function --entry-point functions.HelloWorld --runtime java17 --trigger-http --memory 512MB --allow-unauthenticated

dove my-first-function è il nome registrato con cui la funzione sarà identificata nella console Google Cloud e --entry-point specifica il nome completo della classe (FQN) della funzione.

Gradle

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

gcloud functions deploy my-first-function --entry-point functions.HelloWorld --runtime java17 --trigger-http --memory 512MB --allow-unauthenticated

dove my-first-function è il nome registrato con cui la funzione sarà identificata nella console Google Cloud e --entry-point specifica il nome completo della classe (FQN) della funzione.

Testa la funzione di cui è stato eseguito il deployment

  1. Al termine del deployment della funzione, prendi nota della 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 vedere un messaggio Hello World!.

visualizza i log

I log per Cloud 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
...

Usa la dashboard di Logging

Puoi visualizzare i log per Cloud Functions anche dalla console Google Cloud.