Menangani sesi dengan Firestore


Tutorial ini menunjukkan cara menangani sesi di App Engine.

Banyak aplikasi memerlukan penanganan sesi untuk autentikasi dan preferensi pengguna. Paket sessions Gorilla Web Toolkit disertakan dengan implementasi berbasis sistem file untuk menjalankan fungsi ini. Namun, implementasi ini tidak cocok untuk aplikasi yang dapat ditayangkan dari beberapa instance, karena sesi yang direkam dalam satu instance mungkin berbeda dengan instance lainnya. Paket gorilla/sessions juga dilengkapi dengan implementasi berbasis cookie. Namun, penerapan ini memerlukan enkripsi cookie dan penyimpanan seluruh sesi di klien, bukan hanya ID sesi, yang mungkin terlalu besar untuk beberapa aplikasi.

Tujuan

  • Tulis aplikasi.
  • Jalankan aplikasi secara lokal.
  • Deploy aplikasi di App Engine.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Firestore API.

    Enable the API

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Firestore API.

    Enable the API

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Perbarui komponen gcloud:
    gcloud components update
  13. Menyiapkan lingkungan pengembangan.

Menyiapkan project

  1. Di jendela terminal, clone repositori aplikasi contoh ke komputer lokal Anda:

    git clone https://github.com/GoogleCloudPlatform/golang-samples.git
  2. Ubah ke direktori yang berisi kode contoh:

    cd golang-samples/getting-started/sessions

Memahami aplikasi web

Aplikasi ini menampilkan sapaan dalam berbagai bahasa untuk setiap pengguna. Pengguna yang kembali selalu disambut dalam bahasa yang sama.

Beberapa jendela aplikasi menampilkan ucapan dalam berbagai bahasa.

Sebelum aplikasi dapat menyimpan preferensi untuk pengguna, Anda memerlukan cara untuk menyimpan informasi tentang pengguna saat ini dalam sesi. Aplikasi contoh ini menggunakan Firestore untuk menyimpan data sesi.

Anda dapat menggunakan firestoregorilla, penyimpanan sesi yang kompatibel dengan gorilla/sessions.

  1. Aplikasi dimulai dengan mengimpor dependensi, menentukan jenis app untuk menyimpan sessions.Store dan template HTML, serta menentukan daftar ucapan.

    
    // Command sessions starts an HTTP server that uses session state.
    package main
    
    import (
    	"context"
    	"fmt"
    	"html/template"
    	"log"
    	"math/rand"
    	"net/http"
    	"os"
    
    	"cloud.google.com/go/firestore"
    	firestoregorilla "github.com/GoogleCloudPlatform/firestore-gorilla-sessions"
    	"github.com/gorilla/sessions"
    )
    
    // app stores a sessions.Store. Create a new app with newApp.
    type app struct {
    	store sessions.Store
    	tmpl  *template.Template
    }
    
    // greetings are the random greetings that will be assigned to sessions.
    var greetings = []string{
    	"Hello World",
    	"Hallo Welt",
    	"Ciao Mondo",
    	"Salut le Monde",
    	"Hola Mundo",
    }
    
  2. Selanjutnya, aplikasi menentukan fungsi main, yang membuat instance app baru, mendaftarkan pengendali indeks, dan memulai server HTTP. Fungsi newApp membuat instance app dengan melakukan inisialisasi sessions.Store dengan fungsi firestoregorilla.New.

    
    func main() {
    	port := os.Getenv("PORT")
    	if port == "" {
    		port = "8080"
    	}
    	projectID := os.Getenv("GOOGLE_CLOUD_PROJECT")
    	if projectID == "" {
    		log.Fatal("GOOGLE_CLOUD_PROJECT must be set")
    	}
    
    	a, err := newApp(projectID)
    	if err != nil {
    		log.Fatalf("newApp: %v", err)
    	}
    
    	http.HandleFunc("/", a.index)
    
    	log.Printf("Listening on port %s", port)
    	if err := http.ListenAndServe(":"+port, nil); err != nil {
    		log.Fatal(err)
    	}
    }
    
    // newApp creates a new app.
    func newApp(projectID string) (*app, error) {
    	ctx := context.Background()
    	client, err := firestore.NewClient(ctx, projectID)
    	if err != nil {
    		log.Fatalf("firestore.NewClient: %v", err)
    	}
    	store, err := firestoregorilla.New(ctx, client)
    	if err != nil {
    		log.Fatalf("firestoregorilla.New: %v", err)
    	}
    
    	tmpl, err := template.New("Index").Parse(`<body>{{.views}} {{if eq .views 1.0}}view{{else}}views{{end}} for "{{.greeting}}"</body>`)
    	if err != nil {
    		return nil, fmt.Errorf("template.New: %w", err)
    	}
    
    	return &app{
    		store: store,
    		tmpl:  tmpl,
    	}, nil
    }
    
  3. Pengendali indeks mendapatkan sesi pengguna, membuat sesi jika diperlukan. Sesi baru diberi bahasa acak dan jumlah penayangan 0. Kemudian, jumlah tampilan bertambah satu, sesi disimpan, dan template HTML menulis respons.

    
    // index uses sessions to assign users a random greeting and keep track of
    // views.
    func (a *app) index(w http.ResponseWriter, r *http.Request) {
    	if r.RequestURI != "/" {
    		return
    	}
    
    	// name is a non-empty identifier for this app's sessions. Set it to
    	// something descriptive for your app. It is used as the Firestore
    	// collection name that stores the sessions.
    	name := "hello-views"
    	session, err := a.store.Get(r, name)
    	if err != nil {
    		// Could not get the session. Log an error and continue, saving a new
    		// session.
    		log.Printf("store.Get: %v", err)
    	}
    
    	if session.IsNew {
    		// firestoregorilla uses JSON, which unmarshals numbers as float64s.
    		session.Values["views"] = float64(0)
    		session.Values["greeting"] = greetings[rand.Intn(len(greetings))]
    	}
    	session.Values["views"] = session.Values["views"].(float64) + 1
    	if err := session.Save(r, w); err != nil {
    		log.Printf("Save: %v", err)
    		// Don't return early so the user still gets a response.
    	}
    
    	if err := a.tmpl.Execute(w, session.Values); err != nil {
    		log.Printf("Execute: %v", err)
    	}
    }
    

    Diagram berikut menggambarkan cara Firestore menangani sesi untuk aplikasi App Engine.

    Diagram arsitektur: pengguna, App Engine, Firestore.

Menghapus sesi

firestoregorilla tidak menghapus sesi lama atau yang sudah tidak berlaku. Anda dapat menghapus data sesi di konsol Google Cloud atau menerapkan strategi penghapusan otomatis. Jika Anda menggunakan solusi penyimpanan untuk sesi seperti Memcache atau Redis, sesi yang sudah tidak berlaku akan otomatis dihapus.

Berjalan secara lokal

  1. Di jendela terminal, build biner sessions:

    go build
    
  2. Mulai server HTTP:

    ./sessions
    
  3. Lihat aplikasi di browser web Anda:

    Cloud Shell

    Di toolbar Cloud Shell, klik Web preview Pratinjau web dan pilih Preview on port 8080.

    Komputer lokal

    Di browser, buka http://localhost:8080

    Anda akan melihat salah satu dari lima ucapan: “Hello World”, “Hallo Welt”, "Hola mundo”, “Salut le Monde”, atau “Ciao Mondo”. Bahasa akan berubah jika Anda membuka halaman di browser lain atau dalam mode Samaran. Anda dapat melihat dan mengedit data sesi di Konsol Google Cloud.

    Sesi Firestore di konsol Google Cloud.

  4. Untuk menghentikan server HTTP, tekan Control+C di jendela terminal Anda.

Men-deploy dan menjalankan di App Engine

Anda dapat menggunakan lingkungan standar App Engine untuk mem-build dan men-deploy aplikasi yang berjalan dengan andal dalam beban berat dan dengan jumlah data yang besar.

Tutorial ini menggunakan lingkungan standar App Engine untuk men-deploy server.

File app.yaml berisi konfigurasi lingkungan standar App Engine:

runtime: go112
  1. Deploy aplikasi di App Engine:

    gcloud app deploy
    
  2. Di browser Anda, masukkan URL berikut:

    https://PROJECT_ID.REGION_ID.r.appspot.com

    Ganti kode berikut:

Ucapan kini dikirim oleh server web yang berjalan di instance App Engine.

Men-debug aplikasi

Jika Anda tidak dapat terhubung ke aplikasi App Engine, periksa hal-hal berikut:

  1. Pastikan perintah deployment gcloud berhasil diselesaikan dan tidak menampilkan error apa pun. Jika ada error (misalnya, message=Build failed), perbaiki, lalu coba men-deploy aplikasi App Engine lagi.
  2. Di Konsol Google Cloud, buka halaman Logs Explorer.

    Buka halaman Logs Explorer

    1. Di menu drop-down Recently selected resources, klik App Engine Application, lalu klik All module_id. Anda akan melihat daftar permintaan dari saat Anda mengunjungi aplikasi. Jika tidak melihat daftar permintaan, pastikan Anda memilih Semua module_id dari menu drop-down. Jika Anda melihat pesan error yang dicetak ke konsol Google Cloud, pastikan kode aplikasi Anda cocok dengan kode di bagian tentang menulis aplikasi web.

    2. Pastikan Firestore API diaktifkan.

Pembersihan

Menghapus project

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Menghapus instance App Engine

  1. In the Google Cloud console, go to the Versions page for App Engine.

    Go to Versions

  2. Select the checkbox for the non-default app version that you want to delete.
  3. Untuk menghapus versi aplikasi, klik Hapus.

Langkah selanjutnya