Lingkungan runtime Java

Runtime Java adalah stack software yang bertanggung jawab untuk menginstal kode layanan web Anda dan dependensinya serta menjalankan layanan Anda.

Deklarasikan runtime Java untuk lingkungan standar App Engine dalam file app.yaml. Contoh:

runtime: javaVERSION

Dengan VERSION sebagai nomor versi MAJOR Java. Misalnya, Java 21 menggunakan 21.

Untuk versi Java lainnya yang didukung, dan versi Ubuntu yang sesuai untuk versi Java Anda, lihat Jadwal dukungan runtime.

Sebelum memulai

  1. Download Google Cloud CLI versi terbaru atau update gcloud CLI ke versi terbaru:

    gcloud components update
    
  2. Untuk men-deploy menggunakan Maven, Anda perlu menambahkan Plugin Maven App Engine ke file pom.xml:

    <plugin>
       <groupId>com.google.cloud.tools</groupId>
       <artifactId>appengine-maven-plugin</artifactId>
       <version>2.7.0</version>
    </plugin>

    Opsi lain untuk men-deploy mencakup penggunaan perintah gcloud app deploy atau plugin App Engine Gradle.

  3. Ikuti petunjuk untuk framework aplikasi Anda guna mengonfigurasi build dari file JAR yang dapat dieksekusi.

Kompatibilitas framework

Dengan runtime Java App Engine, Anda dapat men-deploy file JAR yang dapat dieksekusi. Runtime tidak menyertakan framework penayangan web apa pun, yang berarti Anda tidak dibatasi untuk menggunakan framework atau library berbasis servlet. Menggunakan dependensi native atau stack jaringan seperti library Netty.

Ada hello world contoh yang menggunakan framework web Java populer di repositori GitHub Google Cloud:

Anda tidak terbatas pada framework ini dan dianjurkan untuk mencoba framework pilihan Anda, seperti Grails, Blade, Play!, Vaadin atau jHipster.

Men-deploy project sumber Maven ke runtime Java

Anda dapat men-deploy project Maven Anda sebagai kode sumber, lalu mem-build dan men-deploy project tersebut menggunakan buildpack Google Cloud.

Untuk men-deploy project Maven sebagai kode sumber, buka direktori level teratas project Anda dan ketik:

gcloud app deploy pom.xml

Log build dan deploy akan di-streaming, dan Anda dapat melihat log mendetail di bagian histori Cloud Build di konsol Cloud.

Menggunakan file GraalVM yang dapat dieksekusi

Runtime Java lingkungan standar App Engine mendukung file image native GraalVM yang dapat dieksekusi. Setelah mengompilasi aplikasi Java ke image native GraalVM, Anda dapat menggunakan setelan entrypoint di file app.yaml untuk mengarah ke file yang dapat dieksekusi.

Misalnya, file yang dapat dieksekusi dengan nama file myexecutable dapat memiliki file konfigurasi app.yaml berikut:

runtime: java17 # or another supported runtime
entrypoint: ./myexecutable

Library klien Google Cloud dapat digunakan untuk mengompilasi aplikasi sebagai image native GraalVM. Untuk informasi lebih lanjut, lihat dokumentasi tentang cara Mengompilasi image native.

Versi Java

Runtime Java menggunakan rilis stabil terbaru dari versi yang ditentukan dalam file app.yaml Anda. App Engine secara otomatis diupdate ke versi rilis patch baru, tetapi tidak akan otomatis mengupdate versi minor.

Misalnya, aplikasi Anda mungkin di-deploy pada Java 11.0.4 dan otomatis diupdate ke versi Java 11.0.5 pada deployment platform terkelola berikutnya, tetapi tidak akan diupdate secara otomatis ke Java 12.

Untuk mempelajari cara mengupgrade versi Java, lihat Mengupgrade aplikasi yang sudah ada.

Lingkungan Open JDK runtime

App Engine menjalankan aplikasi Java dalam container yang diamankan oleh gVisor pada distribusi Linux Ubuntu terbaru dan openjdk-11-jdk yang didukung untuk Java 11 atau openjdk-17-jdk untuk runtime Java 17.

Untuk mengetahui versi Ubuntu yang didukung untuk versi Java Anda, lihat Jadwal dukungan runtime.

App Engine mempertahankan image dasar dan memperbarui paket OpenJDK 11 dan OpenJDK 17, tanpa mengharuskan Anda men-deploy ulang aplikasi.

Aplikasi yang Anda deploy berada di direktori /workspace runtime. Elemen ini juga dapat diakses melalui link simbolis di /srv.

Rilis Java App Engine

Semua artefak yang dirilis yang dimulai dengan versi 2.x.x menggunakan mekanisme rilis open source. Artefak yang dirilis yang dimulai dengan versi 1.9.9xx atau sebelumnya akan menggunakan sistem build internal. Lihat repositori GitHub untuk mengetahui detail selengkapnya.

Dependensi

Untuk mengetahui informasi selengkapnya tentang mendeklarasikan dan mengelola dependensi, lihat Menentukan dependensi.

Proses mulai aplikasi

Framework seperti Spring Boot, Micronaut, Ktor mem-build uber yang dapat dieksekusi JAR secara default. Jika file build Maven atau Gradle Anda menghasilkan Uber JAR yang dapat dieksekusi, runtime akan memulai aplikasi Anda dengan menjalankan aplikasi Uber JAR.

Atau, App Engine akan menggunakan konten kolom entrypoint opsional dalam file app.yaml Anda. Contoh:

runtime: java21 # or another supported runtime
entrypoint: java -Xmx64m -jar YOUR-ARTIFACT.jar

Contoh jar aplikasi YOUR-ARTIFACT.jar harus:

  • Berada di direktori utama dengan file app.yaml Anda.
  • Berisi entri Main-Class dalam file metadata META-INF/MANIFEST.MF-nya.
  • Secara opsional, berisi entri Class-Path dengan daftar jalur relatif ke jar dependen lainnya. Seluruh jar dependen tersebut akan diupload bersama aplikasi secara otomatis.

Agar aplikasi Anda dapat menerima permintaan HTTP, titik entri harus memulai server web yang memproses port yang ditentukan oleh variabel lingkungan PORT. Nilai variabel lingkungan PORT ditetapkan secara dinamis oleh lingkungan penayangan App Engine. Nilai ini tidak dapat ditetapkan di bagian env_variables dari file app.yaml.

Dengan titik entri kustom, Anda dapat membangun dan mengemas aplikasi sebagai file JAR tipis yang hanya berisi kode aplikasi dan dependensi langsung. Saat men-deploy aplikasi Anda, plugin App Engine hanya akan mengupload file yang berubah, bukan seluruh paket JAR Uber.

Pastikan untuk menggunakan variabel lingkungan PORT

Jika Anda melihat peringatan tentang port 8080 dan NGINX dalam file log aplikasi Anda, berarti server web aplikasi Anda memproses port default 8080. Hal ini mencegah App Engine menggunakan lapisan NGINX untuk mengompresi respons HTTP. Sebaiknya konfigurasikan server web Anda untuk merespons permintaan HTTP di port yang ditentukan oleh variabel lingkungan PORT, biasanya 8081. Contoh:

/*
 * Copyright 2019 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 com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

public class Main {

  public static void main(String[] args) throws IOException {
    // Create an instance of HttpServer bound to port defined by the
    // PORT environment variable when present, otherwise on 8080.
    int port = Integer.parseInt(System.getenv().getOrDefault("PORT", "8080"));
    HttpServer server = HttpServer.create(new InetSocketAddress(port), 0);

    // Set root URI path.
    server.createContext("/", (var t) -> {
      byte[] response = "Hello World!".getBytes();
      t.sendResponseHeaders(200, response.length);
      try (OutputStream os = t.getResponseBody()) {
        os.write(response);
      }
    });

    // Create a second URI path.
    server.createContext("/foo", (var t) -> {
      byte[] response = "Foo!".getBytes();
      t.sendResponseHeaders(200, response.length);
      try (OutputStream os = t.getResponseBody()) {
        os.write(response);
      }
    });

    server.start();
  }
}

Kompatibilitas dengan versi Java sebelumnya

Untuk mengetahui perbedaan antara Java 8 dan versi Java terbaru yang didukung, lihat Perbedaan utama antara runtime Java 8 dan Java 11+.

Variabel lingkungan

Variabel lingkungan berikut ditetapkan oleh runtime:

Variabel lingkungan Deskripsi
GAE_APPLICATION ID aplikasi App Engine Anda. ID ini diawali dengan 'region code~' seperti 'e~' untuk aplikasi yang di-deploy di Eropa.
GAE_DEPLOYMENT_ID ID deployment saat ini.
GAE_ENV Lingkungan App Engine. Tetapkan ke standard.
GAE_INSTANCE ID instance di mana layanan Anda saat ini berjalan.
GAE_MEMORY_MB Jumlah memori yang tersedia untuk proses aplikasi, dalam MB.
GAE_RUNTIME Runtime yang ditentukan dalam file app.yaml Anda.
GAE_SERVICE Nama layanan yang ditentukan dalam file app.yaml Anda. Jika tidak ada nama layanan yang ditentukan, nama akan ditetapkan ke default.
GAE_VERSION Label versi layanan Anda saat ini.
GOOGLE_CLOUD_PROJECT ID project Google Cloud yang terkait dengan aplikasi Anda.
PORT Port yang menerima permintaan HTTP.
NODE_ENV (Hanya tersedia di runtime Node.js) Tetapkan ke production saat layanan Anda di-deploy.

Anda dapat menentukan variabel lingkungan tambahan dalam file app.yaml, tetapi nilai di atas tidak dapat diganti, kecuali untuk NODE_ENV.

HTTPS dan proxy penerusan

App Engine menghentikan koneksi HTTPS di load balancer dan meneruskan permintaan ke aplikasi Anda. Beberapa aplikasi perlu menentukan IP dan protokol permintaan asli. Alamat IP pengguna tersedia di header X-Forwarded-For standar. Aplikasi yang memerlukan informasi ini harus mengonfigurasi framework webnya untuk memercayai proxy.

Akses sistem file

Runtime ini menyertakan direktori /tmp yang dapat ditulis, dengan semua direktori lain memiliki akses hanya baca. Menulis ke /tmp menghabiskan memori sistem.

Server metadata

Setiap instance aplikasi Anda dapat menggunakan server metadata App Engine untuk mengkueri informasi tentang instance dan project Anda.

Anda dapat mengakses server metadata melalui endpoint berikut:

  • http://metadata
  • http://metadata.google.internal

Permintaan yang dikirim ke server metadata harus menyertakan header permintaan Metadata-Flavor: Google. Header ini menunjukkan bahwa permintaan dikirim dengan tujuan mengambil nilai metadata.

Tabel berikut mencantumkan daftar endpoint tempat Anda dapat membuat permintaan HTTP untuk metadata tertentu:

Endpoint metadata Deskripsi
/computeMetadata/v1/project/numeric-project-id Nomor project yang ditetapkan ke project Anda.
/computeMetadata/v1/project/project-id Project ID yang ditetapkan ke project Anda.
/computeMetadata/v1/instance/region Region di mana instance berjalan.
/computeMetadata/v1/instance/service-accounts/default/aliases
/computeMetadata/v1/instance/service-accounts/default/email Email akun layanan default yang ditetapkan ke project Anda.
/computeMetadata/v1/instance/service-accounts/default/ Mencantumkan semua akun layanan default untuk project Anda.
/computeMetadata/v1/instance/service-accounts/default/scopes Mencantumkan semua cakupan yang didukung untuk akun layanan default.
/computeMetadata/v1/instance/service-accounts/default/token Menampilkan token autentikasi yang dapat digunakan untuk mengautentikasi aplikasi Anda ke Google Cloud API lain.

Misalnya, untuk mengambil project ID Anda, kirim permintaan ke http://metadata.google.internal/computeMetadata/v1/project/project-id.