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 dell'utente. Il framework Jetty include un'implementazione basata sulla memoria per eseguire questa funzione. Tuttavia, questa implementazione non è adatta per 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

  • Scrivi l'app.
  • Esegui l'app localmente.
  • Esegui il deployment dell'app su Cloud Run.

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.

Prima di iniziare

  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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  7. Enable the Firestore API.

    Enable the API

  8. In Google Cloud Console, apri l'app in Cloud Shell.

    Vai a Cloud Shell

    Cloud Shell fornisce l'accesso tramite riga di comando alle tue risorse cloud direttamente dal browser. Apri Cloud Shell nel browser e fai clic su Procedi per scaricare il codice di esempio e modificarlo nella directory dell'applicazione.

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

L'app web

Questa app visualizza i saluti in diverse lingue per ogni utente. Gli utenti di ritorno vengono sempre accolti nella stessa lingua.

Diverse finestre dell'app in cui viene visualizzato un annuncio in diverse lingue.

Prima che la tua app possa memorizzare le preferenze per un utente, devi trovare un modo per memorizzare le informazioni sull'utente corrente in una sessione. Questa app di esempio utilizza un elemento WebFilter per recuperare e aggiornare i dati delle sessioni 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 il modo in cui Firestore gestisce le sessioni per l'app Cloud Run.

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

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

Eliminazione di sessioni

Firestore non elimina le sessioni vecchie o scadute. Puoi eliminare i dati della sessione in Google Cloud Console o implementare una strategia di eliminazione automatica. Se utilizzi soluzioni di archiviazione per sessioni quali 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.

    Computer locale

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

    Vedrai uno dei cinque saluti: "Hello World" e "Hallo Welt", "Hola mundo", La lingua cambia se apri la pagina in un altro browser o in modalità di navigazione in incognito. Puoi visualizzare e modificare i dati della sessione in Google Cloud Console.

    Sessioni Firestore in Cloud Console.

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

Deployment ed esecuzione in Cloud Run

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

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

    mvn clean package jib:build

  2. Esegui il deployment dell'app su 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 progetto Cloud che hai creato. Visita l'URL restituito da questo comando per vedere come i dati della sessione persistono tra un caricamento pagina e l'altro.

Esecuzione del debug dell'app

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

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

    Vai alla pagina Esplora log

    1. Nell'elenco a discesa Risorse selezionate di recente, fai clic su Applicazione Cloud Run e quindi su All module_id. Viene visualizzato un elenco di richieste da quando hai visitato la tua app. Se non vedrai un elenco di richieste, conferma di aver selezionato All module_id dall'elenco a discesa. Se vengono visualizzati messaggi di errore stampati in 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.

Esegui la pulizia

Elimina il progetto

  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.

Elimina l'istanza Cloud Run

Elimina il servizio da Cloud Run.

  • In Cloud Console, vai alla pagina Servizi per Cloud Run.

    Vai alla pagina Servizi

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

Passaggi successivi