Membuat dan men-deploy fungsi Cloud Run HTTP dengan Java

Panduan ini akan memandu Anda dalam proses penulisan fungsi Cloud Run menggunakan runtime Java. Ada dua jenis fungsi Cloud Run:

  • Fungsi HTTP, yang Anda panggil dari permintaan HTTP standar.
  • Fungsi berbasis peristiwa, yang dipicu oleh peristiwa di infrastruktur Cloud Anda, seperti pesan pada topik Pub/Sub atau perubahan dalam bucket Cloud Storage.

Dokumen ini menunjukkan cara membuat fungsi HTTP sederhana dan membangunnya menggunakan Maven atau Gradle.

Untuk mengetahui detail selengkapnya, baca artikel tentang menulis fungsi HTTP dan menulis fungsi berbasis peristiwa.

Sebelum memulai

  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, Cloud Build, Artifact Registry, Cloud Run, and Cloud Logging 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, Cloud Build, Artifact Registry, Cloud Run, and Cloud Logging APIs.

    Enable the APIs

  8. Instal dan lakukan inisialisasi Google Cloud SDK.
  9. Update dan instal komponen gcloud dengan perintah berikut.
    gcloud components update
  10. Menyiapkan lingkungan pengembangan.

    Buka panduan penyiapan Java

Membuat fungsi

Bagian ini menjelaskan cara membuat fungsi.

Maven

  1. Buat direktori di sistem lokal Anda untuk kode fungsi:

    Linux atau Mac OS X:

     mkdir ~/helloworld
     cd ~/helloworld
    

    Windows:

     mkdir %HOMEPATH%\helloworld
     cd %HOMEPATH%\helloworld
    
  2. Buat struktur project untuk memuat direktori sumber dan file sumber.

    mkdir -p ~/helloworld/src/main/java/functions
    touch ~/helloworld/src/main/java/functions/HelloWorld.java
    
  3. Tambahkan konten berikut ke 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!");
      }
    }

    Fungsi contoh ini menghasilkan ucapan "Halo Dunia!"

Gradle

  1. Buat direktori di sistem lokal Anda untuk kode fungsi:

    Linux atau Mac OS X:

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

    Windows:

     mkdir %HOMEPATH%\helloworld-gradle
     cd %HOMEPATH%\helloworld-gradle
    
  2. Buat struktur project untuk memuat direktori sumber dan file sumber.

     mkdir -p src/main/java/functions
     touch src/main/java/functions/HelloWorld.java
    
  3. Tambahkan konten berikut ke 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!");
      }
    }

    Fungsi contoh ini menghasilkan ucapan "Halo Dunia!"

Menentukan dependensi

Langkah berikutnya adalah menyiapkan dependensi:

Maven

Ubah direktori ke direktori helloworld yang Anda buat di atas, dan buat file pom.xml:

 cd ~/helloworld
 touch pom.xml

Untuk mengelola dependensi menggunakan Maven, tentukan dependensi di bagian <dependencies> di dalam file pom.xml project Anda. Untuk latihan ini, salin konten berikut ke file pom.xml Anda.

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

Lihat helloworld untuk mengetahui contoh lengkap berdasarkan Maven.

Gradle

Ubah direktori ke direktori helloworld-gradle yang Anda buat di atas, lalu buat file build.gradle:

 cd ~/helloworld-gradle
 touch build.gradle

Untuk mengelola dependensi menggunakan Gradle, tentukan dependensi dalam file build.gradle project Anda. Untuk latihan ini, salin konten berikut ke file build.gradle Anda. Perhatikan bahwa file build.gradle ini menyertakan tugas kustom untuk membantu Anda menjalankan fungsi secara lokal.

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

Lihat helloworld-gradle untuk mengetahui contoh lengkap berdasarkan Gradle.

Membangun dan menguji fungsi secara lokal

Sebelum men-deploy fungsi, Anda dapat membangun dan mengujinya secara lokal:

Maven

  1. Jalankan perintah berikut untuk mengonfirmasi bahwa fungsi Anda di-build:

    mvn compile
    

    Opsi lainnya adalah menggunakan perintah mvn package untuk mengompilasi kode Java, menjalankan pengujian, dan mengemas kode ke dalam file JAR dalam direktori target. Anda dapat mempelajari lebih lanjut siklus proses build Maven di sini.

  2. Mulai fungsi Anda dengan perintah berikut:

    mvn function:run
    
  3. Uji fungsi Anda dengan membuka http://localhost:8080 di browser atau dengan menjalankan curl localhost:8080 dari jendela lain.

    Lihat Mengirim permintaan ke fungsi lokal untuk mengetahui detail selengkapnya.

Gradle

  1. Jalankan perintah berikut untuk mengonfirmasi bahwa fungsi Anda di-build:

    gradle build
    
  2. Mulai fungsi Anda dengan perintah berikut:

    gradle runFunction -Prun.functionTarget=functions.HelloWorld
    
  3. Uji fungsi Anda dengan membuka http://localhost:8080 di browser atau dengan menjalankan curl localhost:8080 dari jendela lain.

    Lihat Mengirim permintaan ke fungsi lokal untuk mengetahui detail selengkapnya.

Men-deploy fungsi

Untuk men-deploy fungsi Anda, jalankan perintah berikut di direktori helloworld (jika Anda menggunakan maven) atau direktori helloworld-gradle (untuk gradle):

  gcloud functions deploy java-http-function \
    --gen2 \
    --entry-point=functions.HelloWorld \
    --runtime=java21 \
    --region=REGION \
    --source=. \
    --trigger-http \
    --allow-unauthenticated

Ganti REGION dengan nama region Google Cloud tempat Anda ingin men-deploy fungsi (misalnya us-west1).

Flag --allow-unauthenticated opsional memungkinkan Anda menjangkau fungsi tanpa autentikasi.

java-http-function adalah nama terdaftar yang akan digunakan untuk mengidentifikasi fungsi Anda di Konsol Google Cloud, dan --entry-point menentukan nama class yang sepenuhnya memenuhi syarat (FQN) dari fungsi Anda.

Menguji fungsi yang di-deploy

  1. Setelah fungsi di-deploy, catat properti uri dari output perintah gcloud functions deploy, atau ambil dengan perintah berikut:

    gcloud functions describe java-http-function \
      --region=REGION
    

    Ganti REGION dengan nama region Google Cloud tempat Anda men-deploy fungsi (misalnya us-west1).

  2. Kunjungi URL ini di browser Anda. Fungsi ini menampilkan pesan "Halo Dunia!".

Melihat log fungsi Anda

Melihat log dengan alat command line

Anda dapat meninjau log fungsi dengan UI Cloud Logging atau melalui Google Cloud CLI.

Untuk melihat log fungsi Anda dengan gcloud CLI, gunakan perintah logs read:

    gcloud functions logs read \
      --gen2 \
      --limit=10 \
      --region=REGION \
      java-http-function

Ganti REGION dengan nama region Google Cloud tempat Anda men-deploy fungsi (misalnya us-west1).

Outputnya akan terlihat seperti berikut:

LEVEL: I
NAME: my-first-function
TIME_UTC: 2023-05-29 23:09:57.708
LOG:

LEVEL: I
NAME: my-first-function
TIME_UTC: 2023-05-29 23:05:53.257
LOG: Default STARTUP TCP probe succeeded after 1 attempt for container "my--first--function-1" on port 8080.

LEVEL:
NAME: my-first-function
TIME_UTC: 2023-05-29 23:05:53.248
LOG: 2023-05-29 23:05:53.248:INFO:oejs.Server:main: Started @892ms

Melihat log dengan dasbor logging

Untuk melihat log fungsi Anda dengan dasbor logging, buka halaman Ringkasan fungsi Cloud Run, lalu klik nama fungsi Anda dari daftar, lalu klik tab Log.