Gérer les sessions avec Firestore

Ce didacticiel montre comment gérer des sessions sur Cloud Run.

De nombreuses applications requièrent une fonctionnalité de gestion de session pour l'authentification et le stockage des préférences utilisateur. Le framework Jetty intègre une mise en œuvre basée sur la mémoire pour assurer cette gestion. Cette mise en œuvre n'est toutefois pas adaptée à une application pouvant être diffusée depuis plusieurs instances. En effet, la session enregistrée dans une instance peut différer des autres instances. Ce didacticiel montre comment gérer des sessions sur Cloud Run.

Objectifs

  • Écrire l'application
  • Exécuter l'application en local
  • Déployer l'application sur Cloud Run

Coûts

Ce tutoriel utilise les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Une fois que vous avez terminé ce tutoriel, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Consultez la page Effectuer un nettoyage pour en savoir plus.

Avant de commencer

  1. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  2. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  3. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier que la facturation est activée pour votre projet.

  4. Activez l'API Firestore.

    Activer l'API

  5. Dans Google Cloud Console, ouvrez l'application dans Cloud Shell.

    Accéder à Cloud Shell

    Cloud Shell vous permet d'accéder en ligne de commande à vos ressources cloud, directement depuis votre navigateur. Ouvrez Cloud Shell dans votre navigateur et cliquez sur Continuer pour télécharger l'exemple de code et accéder au répertoire de l'application.

  6. Dans Cloud Shell, configurez l'outil gcloud pour qu'il utilise votre nouveau projet Google Cloud :
    # Configure gcloud for your project
    gcloud config set project YOUR_PROJECT_ID
    
  7. Mettez à jour Maven pour utiliser Java 11 par défaut :
    sudo update-alternatives --config java
    
    Lorsque vous y êtes invité, saisissez le nombre requis pour sélectionner Java 11. Notez le chemin d'accès répertorié pour cette version.
  8. Exportez le chemin d'accès que vous avez copié à l'étape précédente en tant que variable d'environnement :
    export JAVA_HOME=java-11-path
    

L'application Web

L'application affiche des messages d'accueil dans différentes langues pour chaque utilisateur. Les utilisateurs connus reçoivent toujours les messages d'accueil dans la même langue.

Fenêtres d'application affichant un message d'accueil dans différentes langues.

Pour que votre application puisse stocker les préférences d'un utilisateur, vous devez mettre en œuvre une méthode permettant de stocker les informations sur l'utilisateur actuel dans une session. Cet exemple d'application utilise un objet WebFilter pour récupérer et mettre à jour les données de session dans 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);
  }
}

Le diagramme suivant illustre la façon dont Firestore gère les sessions pour l'application Cloud Run.

Schéma d'architecture : utilisateur, Cloud Run, Firestore.

La requête HttpServletRequest utilise un cookie pour stocker un identifiant unique pour la session locale, qui correspond à un document dans Firestore contennat les détails de la session.

Supprimer des sessions

Firestore ne supprime pas les sessions anciennes ou ayant expiré. Google Cloud Console vous permet de supprimer les données de session. Vous pouvez également mettre en œuvre une stratégie de suppression automatique. Si vous utilisez des solutions de stockage pour des sessions telles que Memcache ou Redis, les sessions expirées sont automatiquement supprimées.

Exécution locale

  1. Démarrez le serveur HTTP :

    mvn jetty:run
    
  2. Affichez l'application dans votre navigateur Web :

    Cloud Shell

    Dans la barre d'outils Cloud Shell, cliquez sur Aperçu sur le Web Aperçu sur le Web et sélectionnez Prévisualiser sur le port 8080.

    Machine locale

    Dans votre navigateur, accédez à http://localhost:8080

    L'un des cinq messages d'accueil suivants s'affiche : "Hello World", "Hallo Welt", "Hola mundo", "Salut le Monde" ou "Ciao Mondo". La langue change si vous ouvrez la page dans un autre navigateur ou en mode navigation privée. Vous pouvez consulter et modifier les données de session dans Google Cloud Console.

    Sessions Firestore dans Cloud Console.

  3. Dans votre fenêtre de terminal, appuyez sur Control+C pour arrêter le serveur HTTP.

Déployer et exécuter sur Cloud Run

Vous pouvez utiliser Cloud Run pour créer et déployer une application qui fonctionne de manière fiable sous une charge élevée et avec de grandes quantités de données.

  1. Dans votre fenêtre de terminal, créez et déployez une image de votre code dans Google Container Registry (GCR) avec le plug-in Jib Maven.

    mvn clean package jib:build

  2. Déployez l'application sur Cloud Run :

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

    Remplacez MY_PROJECT par l'ID du projet Cloud que vous avez créé. Accédez à l'URL renvoyée par cette commande pour observer comment les données de session persistent entre les chargements de page.

Déboguer l'application

Si vous ne pouvez pas vous connecter à votre application Cloud Run, vérifiez les points suivants :

  1. Vérifiez que les commandes de déploiement gcloud ont bien abouti et n'ont généré aucune erreur. S'il y a eu des erreurs (par exemple, message=Build failed), corrigez-les et réessayez dedéployer l'application Cloud Run.
  2. Dans Cloud Console, accédez à la page Visionneuse de journaux.

    Accéder à la page "Visionneuse de journaux"

    1. Dans la liste déroulante Ressources sélectionnées récemment, cliquez sur Application Cloud Run, puis sur Tous les ID de module. La liste des requêtes correspondant à votre accès à l'application s'affiche. Si aucune liste de requêtes ne s'affiche, vérifiez que vous avez bien sélectionné Tous les ID de module dans la liste déroulante. Si des messages d'erreur s'affichent dans Cloud Console, vérifiez que le code de votre application correspond au code décrit dans la section sur l'écriture de l'application Web.

    2. Assurez-vous que l'API Firestore est activée.

Nettoyer

Supprimer le projet

  1. Dans Cloud Console, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Supprimer l'instance Cloud Run

Supprimez le service de Cloud Run.

  • Dans Cloud Console, accédez à la page Services de Cloud Run.

    Accéder à la page "Services"

  • Sélectionnez le service que vous souhaitez supprimer.
  • Cliquez sur Supprimer  pour supprimer le service.

Étape suivante

  • Découvrez d'autres tutoriels Cloud Functions.
  • Essayez Cloud Run, qui vous permet d'exécuter des conteneurs sans état dans un environnement entièrement géré ou dans votre propre cluster Google Kubernetes Engine.