Membuat aplikasi Java di lingkungan fleksibel App Engine

ID region

REGION_ID adalah kode singkat yang ditetapkan Google berdasarkan region yang Anda pilih saat membuat aplikasi. Kode ini tidak sesuai dengan negara atau provinsi, meskipun beberapa ID region mungkin tampak mirip dengan kode negara dan provinsi yang umum digunakan. Untuk aplikasi yang dibuat setelah Februari 2020, REGION_ID.r disertakan dalam URL App Engine. Untuk aplikasi lama yang dibuat sebelum tanggal tersebut, ID region bersifat opsional dalam URL.

Pelajari ID region lebih lanjut.

Panduan memulai ini menunjukkan cara membuat dan men-deploy aplikasi yang menampilkan pesan singkat. Aplikasi contoh menggunakan Java versi 17.

Contoh kode untuk Java versi 8 dan versi 11 tersedia di GitHub.

Sebelum memulai

Panduan memulai ini mengasumsikan bahwa Anda telah menginstal Java SE 17 Development Kit (JDK) di komputer lokal Anda.
  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Enable the Cloud Build API.

    Enable the API

  5. Menginstal Google Cloud CLI.
  6. Untuk initialize gcloud CLI, jalankan perintah berikut:

    gcloud init
  7. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  8. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  9. Enable the Cloud Build API.

    Enable the API

  10. Menginstal Google Cloud CLI.
  11. Untuk initialize gcloud CLI, jalankan perintah berikut:

    gcloud init

Prasyarat tambahan

  1. Lakukan inisialisasi aplikasi App Engine dengan project Anda, lalu pilih region:

    gcloud app create --project=[YOUR_PROJECT_ID]
    

    Saat diminta, pilih region tempat Anda ingin menemukan aplikasi App Engine.

  2. Instal prasyarat berikut:

Lokasi App Engine

App Engine bersifat regional. Artinya, infrastruktur yang menjalankan aplikasi Anda terletak di region tertentu, dan Google mengelolanya sehingga aplikasi Anda tersedia secara redundan di semua zona dalam region tersebut.

Memenuhi persyaratan latensi, ketersediaan, atau ketahanan adalah faktor utama untuk memilih region tempat aplikasi dijalankan. Umumnya, Anda dapat memilih region yang paling dekat dengan pengguna aplikasi Anda, tetapi Anda harus mempertimbangkan lokasi tempat App Engine tersedia serta lokasi dari produk dan layanan Google Cloud lainnya yang digunakan aplikasi Anda. Penggunaan layanan di beberapa lokasi dapat memengaruhi latensi dan pricing aplikasi.

Anda tidak dapat mengubah region aplikasi setelah menyetelnya.

Jika sudah membuat aplikasi App Engine, Anda dapat melihat region-nya dengan melakukan salah satu tindakan berikut:

Men-download aplikasi Halo Dunia

Kami telah membuat aplikasi Halo Dunia sederhana untuk App Engine agar Anda dapat dengan cepat membiasakan diri dalam men-deploy aplikasi ke Google Cloud.

  1. Buat clone repositori aplikasi contoh Halo Dunia ke komputer lokal Anda.

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

    Atau, Anda dapat mendownload sampel sebagai file ZIP dan mengekstraknya.

  2. Ubah ke direktori yang berisi kode contoh.

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

Menjalankan Halo Dunia di komputer lokal

Untuk menjalankan aplikasi Halo Dunia di komputer lokal:

  1. Jalankan perintah berikut:
    java -jar target/micronaut-helloworld-0.1.jar
  2. Di browser web, masukkan alamat berikut:

    http://localhost:8080

    Jika Anda menggunakan Cloud Shell, di toolbar, klik Web Preview dan pilih Preview on port 8080.

Pesan Halo Dunia dari aplikasi contoh akan ditampilkan di halaman. Di jendela terminal, tekan Ctrl+C untuk keluar dari server web.

Men-deploy dan menjalankan Halo Dunia di App Engine

Untuk men-deploy aplikasi Anda ke lingkungan fleksibel App Engine:

  1. Deploy aplikasi Halo Dunia dengan menjalankan perintah berikut dari direktori java-17/micronaut-helloworld:

    mvn clean package appengine:deploy
  2. Luncurkan browser Anda untuk melihat aplikasi di https://PROJECT_ID.REGION_ID.r.appspot.com

    gcloud app browse
    dengan PROJECT_ID mewakili ID project Google Cloud Anda.

Kali ini, halaman yang menampilkan pesan Halo Dunia dikirim oleh server web yang berjalan di instance App Engine.

Selamat! Anda telah men-deploy aplikasi App Engine pertama Anda ke lingkungan fleksibel App Engine.

Jika Anda mengalami error saat men-deploy aplikasi, lihat tips pemecahan masalah.

Lihat bagian berikut untuk mengetahui informasi tentang pembersihan serta link ke kemungkinan langkah berikutnya yang dapat Anda lakukan.

Pembersihan

Agar tidak menimbulkan biaya, Anda dapat menghapus project Google Cloud untuk menghentikan penagihan semua resource yang digunakan dalam project tersebut.

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Langkah selanjutnya

Mempelajari seluruh platform

Setelah mengetahui cara mengembangkan dan men-deploy aplikasi App Engine, Anda dapat menjelajahi bagian Google Cloud lainnya. Anda telah menginstal Google Cloud CLI yang menyediakan alat untuk berinteraksi dengan produk seperti Cloud SQL, Cloud Storage, Firestore, dan lainnya.

Mempelajari lingkungan fleksibel App Engine

Berikut beberapa topik yang dapat membantu Anda melanjutkan pembelajaran tentang App Engine:

Ulasan kode Halo Dunia

Halo Dunia adalah aplikasi App Engine paling sederhana, karena hanya berisi satu layanan, hanya memiliki satu versi, dan semua kode berada dalam direktori utama aplikasi. Bagian ini menjelaskan setiap file aplikasi secara mendetail.

HelloControllerTest.java

File HelloControllerTest.java menentukan pola URL yang mendeskripsikan tempat aplikasi akan memproses permintaan, dan merespons permintaan apa pun dengan pesan 'Halo Dunia'.

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

File app.yaml mendeskripsikan konfigurasi berikut untuk aplikasi Anda:

  • Menetapkan env: flex, yang menunjukkan bahwa aplikasi Anda menggunakan lingkungan fleksibel App Engine.
  • Menentukan runtime yang digunakan oleh aplikasi.

    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
    • Untuk mengetahui informasi selengkapnya tentang cara kerja runtime Java, lihat Runtime Java.

    pom.xml

    Hello World juga menyertakan file pom.xml yang berisi informasi tentang project, seperti dependensi dan target build-nya.

    <?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>
    
    • Untuk mengetahui informasi selengkapnya tentang file pom.xml, lihat dokumentasi Maven.