Sitzungen mit Cloud Firestore verarbeiten

In dieser Anleitung wird gezeigt, wie Sitzungen in Cloud Run verarbeitet werden.

Viele Anwendungen benötigen eine Sitzungsverarbeitung zur Authentifizierung und für Nutzereinstellungen. Das Jetty-Framework enthält eine speicherbasierte Implementierung, um diese Funktion auszuführen. Diese Implementierung eignet sich jedoch nicht für eine Anwendung, die über mehrere Instanzen bereitgestellt werden kann, da sich die Sitzung, die in einer bestimmten Instanz aufgezeichnet wird, von Sitzungen in anderen Instanzen unterscheiden kann. In dieser Anleitung wird gezeigt, wie Sitzungen in Cloud Run verarbeitet werden.

Ziele

  • Anwendung schreiben
  • Anwendung lokal ausführen
  • Stellen Sie die Anwendung in Cloud Run bereit.

Kosten

In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss dieser Anleitung können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweis

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  4. Aktivieren Sie die Firestore API.

    Aktivieren Sie die API

  5. Öffnen Sie die Anwendung in der Google Cloud Console über Cloud Shell.

    Zu Cloud Shell

    Cloud Shell bietet Ihnen direkt über den Browser Befehlszeilenzugriff auf Ihre Cloud-Ressourcen. Öffnen Sie Cloud Shell im Browser und klicken Sie auf Fortfahren, um den Beispielcode herunterzuladen und ins Anwendungsverzeichnis zu wechseln.

  6. Konfigurieren Sie in Cloud Shell das gcloud-Tool, um das neue Google Cloud-Projekt zu verwenden:
    # Configure gcloud for your project
    gcloud config set project YOUR_PROJECT_ID
    
  7. Aktualisieren Sie Maven standardmäßig auf Java 11:
    sudo update-alternatives --config java
    
    Geben Sie bei Aufforderung die Nummer ein, um Java 11 auszuwählen. Notieren Sie sich den für diese Version aufgeführten Pfad.
  8. Exportieren Sie den Pfad, den Sie im vorherigen Schritt als Umgebungsvariable kopiert haben:
    export JAVA_HOME=java-11-path
    

Die Webanwendung

In dieser Anwendung werden Begrüßungen in verschiedenen Sprachen für jeden Nutzer angezeigt. Wiederkehrende Nutzer werden immer in derselben Sprache begrüßt.

Mehrere Anwendungsfenster mit einer Begrüßung in verschiedenen Sprachen

Bevor sich in der Anwendung die Einstellungen für einen Nutzer speichern lassen, benötigen Sie eine Möglichkeit zum Speichern der Informationen über den aktuellen Nutzer in einer Sitzung. Diese Beispielanwendung verwendet eine WebFilter, um Sitzungsdaten in Firestore abzurufen und zu aktualisieren.

@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);
  }
}

Das folgende Diagramm zeigt, wie Firestore Sitzungen für die Cloud Run-Anwendung verarbeitet.

Diagramm der Architektur: Nutzer, Cloud Run, Firestore.

HttpServletRequest verwendet ein Cookie, um eine eindeutige ID für die lokale Sitzung zu speichern, die einem Dokument in Firestore mit den Sitzungsdetails entspricht.

Sitzungen löschen

Firestore löscht keine alten oder abgelaufenen Sitzungen. In der Google Cloud Console können Sie Sitzungsdaten löschen oder eine Strategie zum automatischen Löschen implementieren. Wenn Sie zum Speichern von Sitzungen Lösungen wie Memcache oder Redis verwenden, werden abgelaufene Sitzungen automatisch gelöscht.

Lokal ausführen

  1. Starten Sie den HTTP-Server:

    mvn jetty:run
    
  2. Sehen Sie sich die App in Ihrem Webbrowser an:

    Cloud Shell

    Klicken Sie in der Symbolleiste von Cloud Shell auf Webvorschau Webvorschau und wählen Sie Vorschau auf Port 8080 aus.

    Lokaler Computer

    Rufen Sie http://localhost:8080 im Browser auf:

    Sie sehen eine von fünf Begrüßungen: "Hallo Welt", "Hallo Welt", "Hola mundo", "Salut le Monde" oder "Ciao Mondo". Die Sprache ändert sich, wenn Sie die Seite in einem anderen Browser oder im Inkognitomodus öffnen. Sie können die Sitzungsdaten in der Google Cloud Console ansehen und bearbeiten.

    Firestore-Sitzungen in der Cloud Console

  3. Drücken Sie im Terminalfenster Control+C, um den HTTP-Server zu beenden.

In Cloud Run bereitstellen und ausführen

Mit Cloud Run können Sie eine Anwendung erstellen und bereitstellen, die unter hoher Last und mit großen Datenmengen zuverlässig ausgeführt wird.

  1. Erstellen Sie im Terminalfenster ein Image Ihres Codes und stellen Sie es in Google Container Registry (GCR) mit dem Maven-Plug-in Jib bereit.

    mvn clean package jib:build

  2. Stellen Sie die Anwendung für Cloud Run bereit:

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

    Ersetzen Sie MY_PROJECT durch die ID des von Ihnen erstellten Cloudprojekts. Rufen Sie die von diesem Befehl zurückgegebene URL auf, um zu sehen, wie Sitzungsdaten zwischen dem Laden der Seite beibehalten werden.

Fehler in der Anwendung beheben

Wenn Sie keine Verbindung zu Ihrer Cloud Run-Anwendung herstellen können, prüfen Sie Folgendes:

  1. Überprüfen Sie, ob die gcloud-Bereitstellungsbefehle erfolgreich ausgeführt wurden und keine Fehler ausgegeben haben. Wenn Fehler aufgetreten sind (z.–B. message=Build failed), beheben Sie diese und versuchen Sie noch einmal, die Cloud Run-Anwendung bereitzustellen.
  2. Rufen Sie in der Google Cloud Console die Seite Loganzeige auf.

    Zur Seite "Loganzeige"

    1. Klicken Sie in der Drop-down-Liste Kürzlich ausgewählte Ressourcen auf Cloud Run-Anwendung und dann auf Alle Werte für module_id. Sie sehen eine Liste mit Anfragen, die Sie beim Besuch Ihrer App gestellt haben. Wenn keine Anfragenliste angezeigt wird, bestätigen Sie, dass Sie Alle Werte für module_id aus der Drop-down-Liste ausgewählt haben. Wenn Fehlermeldungen in der Cloud Console angezeigt werden, prüfen Sie, ob der Code Ihrer Anwendung mit dem Code im Abschnitt zum Schreiben der Webanwendung übereinstimmt.

    2. Sorgen Sie dafür, dass die Firestore API aktiviert ist.

Bereinigen

Projekt löschen

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Cloud Run-Instanz löschen

Löschen Sie den Dienst aus Cloud Run.

  • Wechseln Sie in der Cloud Console zur Seite Dienste für Cloud Run.

    Weiter zur Seite "Dienste"

  • Wählen Sie den Dienst aus, den Sie löschen möchten.
  • Klicken Sie auf Löschen, um den Dienst zu löschen.

Nächste Schritte