Dengan App Engine, Anda dapat membangun aplikasi web yang menggunakan infrastruktur dan layanan Google yang skalabel. App Engine menjalankan aplikasi web Anda menggunakan JVM Java 8. App Engine memanggil class servlet aplikasi Anda untuk menangani permintaan dan menyiapkan respons di lingkungan ini.
Platform App Engine menyediakan banyak layanan API bawaan yang dapat dipanggil oleh kode Anda. Aplikasi Anda juga dapat mengonfigurasi tugas terjadwal yang berjalan pada interval yang ditentukan.
Menentukan runtime Java 8 untuk aplikasi Anda
Agar aplikasi Anda menggunakan runtime Java 8, tambahkan baris berikut
ke file appengine-web.xml
:
<runtime>java8</runtime>
File appengine-api.jar
yang disertakan dengan Google Cloud CLI pada platform/google_appengine/google/appengine/tools/java/lib/impl/appengine-api.jar
mewakili App Engine API untuk Java. Anda juga dapat mengakses file ini menggunakan
repositori Maven
yang mencantumkan semua versi.
Pilih versi API yang digunakan aplikasi Anda dengan menyertakan JAR ini dalam
direktori WEB-INF/lib/
aplikasi, atau gunakan Maven untuk menangani dependensi. Jika versi baru lingkungan runtime Java dirilis yang memperkenalkan perubahan yang tidak kompatibel dengan aplikasi yang sudah ada, lingkungan tersebut akan memiliki nomor versi utama baru.
Menggunakan Maven untuk menangani dependensi
Anda dapat menggunakan Maven untuk mengelola semua dependensi. Misalnya, entripom.xml
ini menyertakan App Engine API
terbaru (Rappengine-api-1.0-sdk
) yang tersedia dari Maven Central:
<dependency> <groupId>com.google.appengine</groupId> <artifactId>appengine-api-1.0-sdk</artifactId> <version></version> </dependency>
Sandbox
Runtime Java App Engine mendistribusikan permintaan untuk aplikasi di beberapa server web dan mencegah satu aplikasi mengganggu aplikasi lainnya. Aplikasi App Engine tidak boleh merespons dengan lambat. Permintaan web ke aplikasi harus ditangani dalam batas waktu tunggu permintaan. Proses yang melampaui batas respons ini akan dihentikan untuk menghindari kelebihan muatan pada server web.Perhatikan bahwa satu-satunya tempat pengguna dapat menulis file adalah direktori /tmp
.
File di /tmp
akan menggunakan memori yang dialokasikan untuk instance Anda. File
yang disimpan di lokasi ini hanya tersedia untuk instance ini dan hanya selama
masa aktif instance spesifik ini.
Cara biasa bagi aplikasi untuk mendapatkan file resource adalah memaketkan file
yang Anda andalkan dengan aplikasi di bagian WEB-INF
, lalu memuatnya dari aplikasi
menggunakan Class.getResource()
, ServletContext.getResource()
, atau metode serupa.
Secara default, semua file dalam WAR merupakan "file resource". Anda dapat mengecualikan file dari
kumpulan ini menggunakan file appengine-web.xml
.
Pengurutan JAR loader class
Terkadang, mungkin Anda perlu menentukan ulang urutan file JAR
dipindai untuk class guna mengatasi konflik antara nama class. Dalam
kasus ini, prioritas pemuatan dapat diberikan ke file JAR tertentu dengan menambahkan
elemen <class-loader-config>
yang berisi elemen <priority-specifier>
di
file appengine-web.xml
. Contoh:
<class-loader-config>
<priority-specifier filename="mailapi.jar"/>
</class-loader-config>
Tindakan ini menempatkan "mailapi.jar
" sebagai file JAR pertama yang akan ditelusuri untuk class,
kecuali class yang ada dalam direktori war/WEB-INF/classes/
.
Jika beberapa file JAR diprioritaskan, urutan pemuatan aslinya (satu sama lain) akan digunakan. Dengan kata lain, urutan
elemen <priority-specifier>
itu sendiri tidak menjadi masalah.
Thread
Dengan runtime Java 8, Anda dapat membuat thread menggunakan
ThreadManager API
App Engine dan API bawaan Java, misalnya new Thread()
.
Saat ini, jika ingin memanggil API App Engine (com.google.appengine.api.*
), Anda harus memanggil API tersebut dari thread permintaan atau dari thread yang dibuat menggunakan ThreadManager API.
Aplikasi dapat
- Menerapkan
java.lang.Runnable
. - Membuat factory thread dengan memanggil
com.google.appengine.api.ThreadManager.currentRequestThreadFactory()
. - Memanggil metode
newRequestThread
factory, yang meneruskanRunnable
,newRequestThread(runnable)
, atau gunakan objek factory yang ditampilkan olehcom.google.appengine.api.ThreadManager.currentRequestThreadFactory()
denganExecutorService
(misalnya, panggilExecutors.newCachedThreadPool(factory)
).
Jika Anda membuat ThreadPoolExecutor
dengan currentRequestThreadFactory()
, shutdown()
harus dipanggil secara eksplisit sebelum permintaan servlet selesai. Jika hal ini tidak dilakukan, permintaan tidak akan selesai dan server aplikasi pada akhirnya akan gagal.
Perlu diketahui bahwa beberapa library dapat membuat ThreadPoolExecutors untuk Anda.
Aplikasi dapat menjalankan operasi terhadap thread saat ini, seperti
thread.interrupt()
.
Setiap permintaan dibatasi hingga 50 thread permintaan App Engine API secara serentak.
Saat menggunakan thread, gunakan objek serentak tingkat tinggi, seperti Executor
dan Runnable
. Keduanya menangani banyak detail konkurensi yang halus tetapi
penting seperti
Interupsi
serta penjadwalan dan
pembukuan.
Alat
IDE yang Didukung
Cloud Tools for IntelliJ memungkinkan Anda menjalankan dan men-debug aplikasi App Engine di dalam IntelliJ IDEA. Anda dapat men-deploy project App Engine secara live ke produksi tanpa keluar dari IDE.
Alat build yang didukung
Untuk mempercepat proses pengembangan, Anda dapat menggunakan plugin App Engine untuk Apache Maven atau Gradle:
Server pengembangan lokal
Server pengembangan menjalankan aplikasi Anda di komputer lokal untuk pengembangan dan pengujian. Server menyimulasikan layanan Datastore. Server pengembangan juga dapat membuat konfigurasi untuk indeks Datastore berdasarkan kueri yang dilakukan aplikasi selama pengujian.
Konkurensi dan latensi
Latensi aplikasi Anda memiliki dampak terbesar pada jumlah instance yang diperlukan untuk melayani traffic Anda. Jika Anda memproses permintaan dengan cepat, satu instance dapat menangani banyak permintaan.
Instance thread tunggal dapat menangani satu permintaan serentak. Oleh karena itu, ada hubungan langsung antara latensi dan jumlah permintaan yang dapat ditangani pada instance per detik. Misalnya, latensi 10 md sama dengan 100 permintaan/detik/instance.Instance multi-thread dapat menangani banyak permintaan serentak. Oleh karena itu, ada hubungan langsung antara CPU yang dipakai dan jumlah permintaan/detik.
Aplikasi Java mendukung permintaan serentak, sehingga satu instance dapat menangani permintaan baru sambil menunggu permintaan lain selesai. Konkurensi secara signifikan mengurangi jumlah instance yang dibutuhkan aplikasi, tetapi Anda perlu mendesain aplikasi untuk multithreading.
Misalnya, jika instance B4 (sekitar 2,4 GHz) menggunakan 10 Mcycles/permintaan, Anda dapat memproses 240 permintaan/detik/instance. Jika menggunakan 100 Mcycles/permintaan, Anda dapat memproses 24 permintaan/detik/instance. Angka-angka ini merupakan kasus yang ideal, tetapi cukup realistis dalam hal hal yang dapat Anda capai pada instance.
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.
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 tempat layanan Anda saat ini berjalan. |
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. |
Anda dapat menentukan variabel lingkungan tambahan dalam file app.yaml
,
tetapi nilai di atas tidak dapat diganti.