Menangani sesi dengan Firestore

Tutorial ini menunjukkan cara menangani sesi di Cloud Run.

Banyak aplikasi memerlukan penanganan sesi untuk autentikasi dan preferensi pengguna. Framework Jetty dilengkapi dengan implementasi berbasis memori 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. Tutorial ini menunjukkan cara menangani sesi di Cloud Run.

Tujuan

  • Menulis aplikasi.
  • Menjalankan aplikasi secara lokal.
  • Men-deploy aplikasi di Cloud Run.

Biaya

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

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis. Google Cloud

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

Sebelum memulai

  1. Login keakun Anda. Google Cloud Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Firestore API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Firestore API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  8. Di Google Cloud konsol, buka aplikasi di Cloud Shell.

    Buka Cloud Shell

    Cloud Shell menyediakan akses command line ke resource cloud langsung dari browser. Buka Cloud Shell di browser Anda dan klik Lanjutkan untuk mendownload kode contoh dan mengubah ke direktori aplikasi.

  9. Di Cloud Shell, konfigurasikan gcloud CLI untuk menggunakan project baru Google Cloud Anda:
    # Configure gcloud for your project
    gcloud config set project YOUR_PROJECT_ID
    
  10. Update Maven untuk menggunakan Java 11 secara default:
    sudo update-alternatives --config java
    
    Saat diminta, masukkan angka untuk memilih Java 11. Catat jalur yang tercantum untuk versi tersebut.
  11. Ekspor jalur yang Anda salin pada langkah sebelumnya sebagai variabel lingkungan:
    export JAVA_HOME=java-11-path
    

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 WebFilter untuk mengambil dan memperbarui data sesi di Firestore.

@Override
public void init(FilterConfig config) throws ServletException {
  // Initialize local copy of datastore session variables.
  firestore = FirestoreOptions.getDefaultInstance().getService();
  sessions = firestore.collection("sessions");

  try {
    // Delete all sessions unmodified for over two days.
    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date());
    cal.add(Calendar.HOUR, -48);
    Date twoDaysAgo = Calendar.getInstance().getTime();
    QuerySnapshot sessionDocs =
        sessions.whereLessThan("lastModified", dtf.format(twoDaysAgo)).get().get();
    for (QueryDocumentSnapshot snapshot : sessionDocs.getDocuments()) {
      snapshot.getReference().delete();
    }
  } catch (InterruptedException | ExecutionException e) {
    throw new ServletException("Exception initializing FirestoreSessionFilter.", e);
  }
}

Diagram berikut mengilustrasikan cara Firestore menangani sesi untuk aplikasi Cloud Run.

Diagram arsitektur: pengguna, Cloud Run, Firestore.

HttpServletRequest menggunakan cookie untuk menyimpan ID unik untuk sesi lokal, yang sesuai dengan dokumen di Firestore dengan detail sesi.

Menghapus sesi

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

Menjalankan secara lokal

  1. Mulai server HTTP:

    mvn jetty:run
    
  2. Lihat aplikasi di browser web Anda:

    Cloud Shell

    Di toolbar Cloud Shell, klik Pratinjau web Pratinjau web dan pilih Pratinjau di port 8080.

    Mesin lokal

    Di browser Anda, buka http://localhost:8080

    Anda akan melihat salah satu dari lima sapaan: "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 penyamaran. Anda dapat melihat dan mengedit data sesi di Google Cloud konsol.

    Sesi Firestore di konsol Google Cloud .

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

Men-deploy dan menjalankan di Cloud Run

Anda dapat menggunakan Cloud Run untuk membuat dan men-deploy aplikasi yang berjalan dengan andal dalam beban berat dan dengan data dalam jumlah besar.

  1. Di jendela terminal Anda, buat dan deploy image kode Anda ke Google Container Registry (GCR) dengan plugin Maven Jib.

    mvn clean package jib:build

  2. Men-deploy aplikasi ke Cloud Run:

       gcloud beta run deploy session-handling --image gcr.io/MY_PROJECT/session-handling 
    --platform managed --region us-central1 --memory 512M

    Ganti MY_PROJECT dengan ID Google Cloud project yang Anda buat. Buka URL yang ditampilkan oleh perintah ini untuk melihat cara data sesi tetap ada di antara pemuatan halaman.

Men-debug aplikasi

Jika Anda tidak dapat terhubung ke aplikasi Cloud Run, periksa hal berikut:

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

    Buka halaman Logs Explorer

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

    2. Pastikan Firestore API diaktifkan.

Pembersihan

Menghapus project

  1. Di Google Cloud konsol, buka halaman Manage resources.

    Buka Kelola resource

  2. Pada daftar project, pilih project yang Anda ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus instance Cloud Run

Hapus layanan dari Cloud Run.

  • Di Google Cloud konsol, buka halaman Services untuk Cloud Run.

    Buka halaman Layanan

  • Pilih layanan yang ingin Anda hapus.
  • Klik Delete untuk menghapus layanan.

Langkah berikutnya

  • Coba tutorial fungsi Cloud Run lainnya.
  • Coba Cloud Run, yang memungkinkan Anda menjalankan container stateless di lingkungan yang terkelola sepenuhnya atau di cluster Google Kubernetes Engine Anda sendiri.