Bermigrasi dari Go 1.11 ke runtime Go terbaru

Halaman ini berisi petunjuk untuk bermigrasi dari runtime Go generasi pertama ke generasi kedua. Untuk mengupgrade aplikasi generasi kedua agar menggunakan versi Go terbaru yang didukung, lihat Mengupgrade aplikasi yang ada.

Go 1.11 telah mencapai akhir dukungan pada 30 Januari 2024. Aplikasi Go 1.11 yang ada akan terus berjalan dan menerima traffic. Namun, App Engine dapat memblokir deployment ulang aplikasi yang menggunakan runtime setelah tanggal akhir dukungannya. Sebaiknya Anda bermigrasi ke runtime yang didukung terbaru Go dengan menggunakan pedoman di halaman ini.

Dengan bermigrasi ke runtime Go generasi kedua yang didukung, Anda dapat menggunakan fitur bahasa terbaru dan membangun aplikasi yang lebih portabel dengan kode idiomatis.

Perubahan pada runtime generasi kedua

Pertimbangkan perbedaan berikut saat mengupgrade ke runtime Go generasi kedua yang didukung:

  • Untuk mengurangi upaya dan kompleksitas migrasi runtime, lingkungan standar App Engine memungkinkan Anda mengakses banyak layanan dan API paket lama di runtime generasi kedua, seperti Memcache. Aplikasi Go generasi kedua Anda dapat memanggil API layanan paket melalui App Engine SDK for Go, dan mengakses sebagian besar fitur yang sama seperti pada runtime Go 1.11.

    Anda juga memiliki opsi untuk menggunakan produk yang menawarkan fitur serupa dengan layanan paket lama. Google Cloud Produk Google Cloud ini menyediakan Library Klien Cloud untuk Go idiomatis. Untuk paket layanan yang tidak tersedia sebagai produk terpisah diGoogle 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 paket.

  • Perilaku beberapa elemen dalam file konfigurasi app.yaml telah diubah. Untuk informasi selengkapnya, lihat Perubahan pada file app.yaml.

  • Logging di runtime generasi kedua mengikuti standar logging di Cloud Logging. Pada runtime generasi kedua, log aplikasi tidak lagi dipaketkan dengan log permintaan, tetapi dipisahkan dalam kumpulan data yang berbeda. Untuk mempelajari lebih lanjut cara membaca dan menulis log di runtime generasi kedua, lihat panduan logging.

Perbedaan penggunaan memori

Runtime generasi kedua memiliki penggunaan memori dasar yang lebih tinggi dibandingkan dengan runtime generasi pertama. Hal ini disebabkan oleh beberapa faktor, seperti versi gambar dasar yang berbeda, dan perbedaan cara kedua generasi menghitung penggunaan memori.

Runtime generasi kedua menghitung penggunaan memori instance sebagai jumlah dari apa yang digunakan proses aplikasi, dan jumlah file aplikasi yang di-cache secara dinamis dalam memori. Untuk menghindari aplikasi intensif memori mengalami penonaktifan instance karena melampaui batas memori, upgrade ke class instance yang lebih besar dengan memori yang lebih banyak.

Perbedaan penggunaan CPU

Runtime generasi kedua dapat melihat baseline penggunaan CPU yang lebih tinggi saat instance mulai dingin. Bergantung pada konfigurasi penskalaan aplikasi, hal ini dapat menimbulkan efek samping yang tidak diinginkan, seperti jumlah instance yang lebih tinggi dari yang diperkirakan jika aplikasi dikonfigurasi untuk diskalakan berdasarkan pemanfaatan 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. Sebagai akibat dari perubahan ini, runtime generasi kedua dikonfigurasi untuk menghapus header dengan garis bawah (_) secara otomatis. 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 Diperlukan untuk aplikasi yang menggunakan layanan paket lama Harus ditetapkan ke true jika Anda ingin mengakses layanan paket lama untuk runtime generasi kedua.
login Didukung jika app_engine_apis adalah true Jika Anda tidak menggunakan paket layanan lama untuk runtime generasi kedua, gunakan metode alternatif ini untuk mengautentikasi pengguna.
runtime Diubah Ubah elemen runtime untuk menentukan runtime generasi kedua.

Untuk informasi selengkapnya, lihat referensi app.yaml.

Membuat paket main

Layanan Anda harus menyertakan pernyataan package main dalam setidaknya satu file sumber.

Layanan paket lama App Engine

Jika layanan Anda menggunakan layanan paket lama untuk runtime generasi kedua:

  • Layanan Anda hanya boleh menggunakan paket v2 (google.golang.org/appengine/v2). Menggunakan paket v1 (google.golang.org/appengine) yang lebih lama akan menyebabkan error.

  • Di fungsi main(), panggil appengine.Main(), bukan http.ListenAndServe(). Hal ini memastikan bahwa API user dan appengine memiliki akses ke konteks permintaan saat ini.

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 fungsi http.ListenAndServe():

    port := os.Getenv("PORT")
    if port == "" {
    	port = "8080"
    	log.Printf("Defaulting to port %s", port)
    }
    
    log.Printf("Listening on port %s", port)
    if err := http.ListenAndServe(":"+port, nil); err != nil {
    	log.Fatal(err)
    }

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 fungsi main() dalam paket main.
  • Atau, impor paket aplikasi Anda ke dalam paket main, dengan memastikan setiap fungsi init() yang berisi panggilan ke http.HandleFunc() dijalankan saat memulai.

    Anda dapat menemukan semua paket yang menggunakan panggilan http.HandleFunc() dengan skrip bash berikut, dan menyalin outputnya ke blok import paket main 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.