Gestione delle sessioni con Firestore

Questo tutorial mostra come gestire le sessioni su Cloud Run.

Molte app richiedono la gestione delle sessioni per l'autenticazione e le preferenze utente. Il framework Jetty include un'implementazione basata sulla memoria per eseguire questa funzione. Tuttavia, questa implementazione non è adatta a un'app che può essere pubblicata da più istanze, perché la sessione registrata in un'istanza potrebbe essere diversa da altre istanze. Questo tutorial mostra come gestire le sessioni su Cloud Run.

Obiettivi

  • Scrivere l'app.
  • Eseguire l'app in locale.
  • Eseguire il deployment dell'app su Cloud Run.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

I nuovi Google Cloud utenti potrebbero avere diritto a una prova senza costi.

Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.

Prima di iniziare

  1. Accedi al tuo Google Cloud account. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei carichi di lavoro.
  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 serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). 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 serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

  8. Nella Google Cloud console, apri l'app in Cloud Shell.

    Vai a Cloud Shell

    Cloud Shell fornisce l'accesso da riga di comando alle risorse cloud direttamente dal browser. Apri Cloud Shell nel browser e fai clic Continua per scaricare il codice campione e modificarlo nella directory dell'app.

  9. In Cloud Shell, configura gcloud CLI in modo da utilizzare il nuovo Google Cloud progetto:
    # Configure gcloud for your project
    gcloud config set project YOUR_PROJECT_ID
    
  10. Aggiorna Maven in modo che utilizzi Java 11 per impostazione predefinita:
    sudo update-alternatives --config java
    
    Quando richiesto, inserisci il numero per selezionare Java 11. Prendi nota del percorso elencato per quella versione.
  11. Esporta il percorso copiato nel passaggio precedente come variabile di ambiente:
    export JAVA_HOME=java-11-path
    

L'app web

Questa app mostra saluti in lingue diverse per ogni utente. Gli utenti che tornano vengono sempre salutati nella stessa lingua.

Più finestre dell'app che mostrano un saluto in lingue diverse.

Prima che l'app possa memorizzare le preferenze di un utente, devi avere un modo per memorizzare le informazioni sull'utente corrente in una sessione. Questa app di esempio utilizza un WebFilter per recuperare e aggiornare i dati della sessione in 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);
  }
}

Il seguente diagramma illustra come Firestore gestisce le sessioni per l'app Cloud Run.

Diagramma dell'architettura: utente, Cloud Run, Firestore.

HttpServletRequest utilizza un cookie per memorizzare un ID univoco per la sessione locale, che corrisponde a un documento in Firestore con i dettagli della sessione.

Eliminazione delle sessioni

Firestore non elimina le sessioni vecchie o scadute. Puoi eliminare i dati della sessione nella Google Cloud console o implementare una strategia di eliminazione automatica. Se utilizzi soluzioni di archiviazione per le sessioni come Memcache o Redis, le sessioni scadute vengono eliminate automaticamente.

Esecuzione in locale

  1. Avvia il server HTTP:

    mvn jetty:run
    
  2. Visualizza l'app nel browser web:

    Cloud Shell

    Nella barra degli strumenti di Cloud Shell, fai clic su Anteprima web Anteprima web e seleziona Anteprima sulla porta 8080.

    Macchina locale

    Nel browser, vai a http://localhost:8080

    Viene visualizzato uno dei cinque saluti: "Hello World", "Hallo Welt", "Hola mundo", "Salut le Monde" o "Ciao Mondo". La lingua cambia se apri la pagina in un browser diverso o in modalità di navigazione in incognito. Puoi visualizzare e modificare i dati della sessione nella Google Cloud console.

    Sessioni Firestore nella console Google Cloud .

  3. Per arrestare il server HTTP, nella finestra del terminale premi Control+C.

Esecuzione del deployment e dell'esecuzione su Cloud Run

Puoi utilizzare Cloud Run per creare ed eseguire il deployment di un'app che funziona in modo affidabile con carichi elevati e grandi quantità di dati.

  1. Nella finestra del terminale, crea ed esegui il deployment di un'immagine del codice in Google Container Registry (GCR) con il plug-in Maven Jib.

    mvn clean package jib:build

  2. Esegui il deployment dell'app in Cloud Run:

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

    Sostituisci MY_PROJECT con l'ID del Google Cloud progetto che hai creato. Visita l'URL restituito da questo comando per vedere come i dati della sessione persistono tra i caricamenti di pagina.

Esecuzione del debug dell'app

Se non riesci a connetterti all'app Cloud Run, controlla quanto segue:

  1. Verifica che i comandi di deployment gcloud siano stati completati correttamente e non abbiano generato errori. Se si sono verificati errori (ad esempio, message=Build failed), correggili e prova a eseguire di nuovo il deployment dell'app Cloud Run again.
  2. Nella Google Cloud console, vai alla pagina Esplora log.

    Vai alla pagina Esplora log

    1. Nell'elenco a discesa Risorse selezionate di recente, fai clic Applicazione Cloud Run, quindi su Tutti module_id. Viene visualizzato un elenco di richieste da quando hai visitato l'app. Se non vedi un elenco di richieste, verifica di aver selezionato Tutti module_id dall'elenco a discesa. Se vedi messaggi di errore stampati nella Google Cloud console, verifica che il codice dell'app corrisponda al codice nella sezione relativa alla scrittura dell'app web.

    2. Assicurati che l'API Firestore sia abilitata.

Libera spazio

Elimina il progetto

  1. Nella Google Cloud console, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID progetto, quindi fai clic su Chiudi per eliminare il progetto.

Elimina l'istanza Cloud Run

Elimina il servizio da Cloud Run.

  • Nella Google Cloud console, vai alla pagina Servizi di Cloud Run.

    Vai alla pagina Servizi

  • Seleziona il servizio che vuoi eliminare.
  • Fai clic su Elimina per eliminare il servizio.

Passaggi successivi