Dengan bermigrasi ke runtime Go 1.12+, Anda dapat menggunakan fitur bahasa terbaru dan membangun aplikasi yang lebih portabel dengan kode idiomatis.
Perubahan pada runtime App Engine Go 1.12+
Jika ingin bermigrasi ke runtime Go 1.12+, Anda harus mengetahui perbedaan berikut antara runtime Go 1.12+ dan runtime sebelumnya di lingkungan standar App Engine:
Untuk mengurangi upaya dan kompleksitas migrasi runtime, lingkungan standar App Engine memungkinkan Anda mengakses banyak paket layanan dan API versi lama dalam runtime Go 1.12+, seperti Memcache. Aplikasi Go 1.12+ Anda dapat memanggil API paket layanan melalui App Engine SDK for Go, dan mengakses sebagian besar fungsi yang sama seperti pada runtime Go 1.11.
Anda juga memiliki opsi untuk menggunakan produk Google Cloud yang menawarkan fungsi serupa dengan paket layanan lama. Produk Google Cloud ini menyediakan Library Klien Cloud untuk Go idiomatis. Untuk paket layanan yang tidak tersedia sebagai produk terpisah di Google Cloud, seperti pemrosesan gambar, penelusuran, dan pengiriman pesan, Anda dapat menggunakan penyedia pihak ketiga atau solusi lainnya.
Untuk mempelajari lebih lanjut cara bermigrasi ke layanan yang tidak dipaketkan, lihat Bermigrasi dari layanan terpaket.
Perilaku beberapa elemen dalam file konfigurasi
app.yaml
telah diubah. Untuk informasi selengkapnya, lihat Perubahan pada fileapp.yaml
.Logging di runtime Go 1.12+ mengikuti standar logging di Cloud Logging. Dalam runtime Go 1.12+, log aplikasi tidak lagi dipaketkan dengan log permintaan, tetapi dipisahkan dalam data yang berbeda. Untuk mempelajari lebih lanjut cara membaca dan menulis log di runtime Go 1.12+, lihat panduan logging.
Perbedaan penggunaan memori
Runtime generasi kedua mengalami dasar penggunaan memori yang lebih tinggi dibandingkan runtime generasi pertama. Hal ini disebabkan oleh beberapa faktor, seperti versi image dasar yang berbeda, dan perbedaan cara penghitungan penggunaan memori oleh kedua generasi.
Runtime generasi kedua menghitung penggunaan memori instance sebagai jumlah penggunaan proses aplikasi, dan jumlah file aplikasi yang di-cache secara dinamis dalam memori. Untuk menghindari aplikasi yang menggunakan banyak memori mengalami penonaktifan instance karena melebihi batas memori, upgrade ke class instance yang lebih besar dengan memori yang lebih besar.
Perbedaan penggunaan CPU
Runtime generasi kedua dapat melihat dasar penggunaan CPU yang lebih tinggi saat cold start instance. Bergantung pada konfigurasi penskalaan aplikasi, hal ini mungkin memiliki efek samping yang tidak diinginkan, seperti jumlah instance yang lebih tinggi daripada yang diperkirakan jika aplikasi dikonfigurasi untuk diskalakan berdasarkan penggunaan CPU. Untuk menghindari masalah ini, tinjau dan uji konfigurasi penskalaan aplikasi untuk memastikan jumlah instance dapat diterima.
Perbedaan header permintaan
Runtime generasi pertama memungkinkan header permintaan dengan garis bawah (misalnya, X-Test-Foo_bar
) diteruskan ke aplikasi. Runtime generasi kedua memperkenalkan Nginx ke dalam arsitektur host. Akibat perubahan
ini, runtime generasi kedua dikonfigurasi untuk otomatis menghapus
header dengan garis bawah (_
). Untuk mencegah masalah aplikasi, hindari penggunaan
garis bawah dalam header permintaan aplikasi.
Perubahan pada file app.yaml
Perilaku beberapa elemen dalam file konfigurasi app.yaml
telah
diubah:
Elemen | Ubah jenis | Deskripsi |
---|---|---|
app_engine_apis |
Hanya berlaku untuk Go 1.12+ | Harus ditetapkan ke true jika Anda ingin mengakses
layanan paket lama untuk Go 1.12+.
|
login |
Didukung jika app_engine_apis adalah true |
Jika Anda tidak menggunakan paket layanan lama untuk Go 1.12+, gunakan metode alternatif ini untuk mengautentikasi pengguna. |
runtime |
Modified (Diubah) |
Ubah elemen runtime untuk
menetapkan Go 1.12+.
|
Untuk informasi selengkapnya, lihat referensi app.yaml
.
Membuat paket main
Layanan Anda harus menyertakan pernyataan package main
dalam setidaknya satu file
sumber. Atau, jika layanan Anda menggunakan paket google.golang.org/appengine
, sertakan panggilan ke appengine.Main()
.
Menulis paket utama
Jika layanan Anda belum berisi paket main
, tambahkan
pernyataan package main
dan tulis fungsi main()
. Diminimum ,fungsi main()
seharusnya:
Baca variabel lingkungan
PORT
dan panggil fungsihttp.ListenAndServe()
:
Mendaftarkan pengendali HTTP Anda
Anda dapat mendaftarkan pengendali HTTP dengan memilih salah satu opsi berikut:
- Metode yang direkomendasikan adalah memindahkan semua panggilan
http.HandleFunc()
secara manual dari paket ke fungsimain()
dalam paketmain
. Atau, impor paket aplikasi Anda ke dalam paket
main
, dengan memastikan setiap fungsiinit()
yang berisi panggilan kehttp.HandleFunc()
dijalankan saat memulai.Anda dapat menemukan semua paket yang menggunakan panggilan
http.HandleFunc()
dengan skrip bash berikut, dan menyalin outputnya ke blokimport
paketmain
Anda:gp=$(go env GOPATH) && p=$(pwd) && pkg=${p#"$gp/src/"} && find . -name "*.go" | xargs grep "http.HandleFunc" --files-with-matches | grep -v vendor/ | grep -v '/main.go' | sed "s#\./\(.*\)/[^/]\+\.go#\t_ \"$pkg/\1\"#" | sort | uniq
Membuat struktur file
Go mengharuskan setiap paket memiliki direktorinya sendiri. Anda dapat memberi tahu App Engine lokasi paket main
dengan menggunakan main:
dalam file app.yaml
project Anda. Misalnya, jika struktur file aplikasi Anda terlihat seperti ini:
myapp/ ├── app.yaml ├── foo.go ├── bar.go └── web/ └── main.go
File app.yaml
Anda akan memiliki:
main: ./web # Relative filepath to the directory containing your main package.
Untuk mengetahui informasi selengkapnya tentang flag main
, lihat referensi app.yaml
.
Memindahkan file ke GOPATH
Anda
Temukan GOPATH
Anda menggunakan perintah berikut:
go env GOPATH
Pindahkan semua file dan impor yang relevan ke GOPATH
Anda. Jika menggunakan impor
relatif, seperti import ./guestbook
, perbarui impor Anda untuk menggunakan jalur lengkap: import github.com/example/myapp/guestbook
.