Sitzungen mit Cloud Firestore verarbeiten


In dieser Anleitung wird gezeigt, wie Sitzungen in App Engine verarbeitet werden.

Viele Anwendungen benötigen eine Sitzungsverarbeitung zur Authentifizierung und für Nutzereinstellungen. Das Paket Gorilla Web Toolkit sessions enthält eine dateisystembasierte 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. Das Paket gorilla/sessions enthält außerdem eine cookiebasierte Implementierung. Diese Implementierung erfordert jedoch das Verschlüsseln von Cookies und das Speichern der gesamten Sitzung auf dem Client anstelle einer Sitzungs-ID, was für einige Anwendungen möglicherweise zu viel ist.

Lernziele

  • Anwendung schreiben
  • Anwendung lokal ausführen
  • Anwendung in App Engine bereitstellen

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

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 der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweise

  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 Google Cloud-Projekt muss aktiviert sein.

  4. Firestore API aktivieren.

    Aktivieren Sie die API

  5. Installieren Sie die Google Cloud CLI.
  6. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  7. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  8. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  9. Firestore API aktivieren.

    Aktivieren Sie die API

  10. Installieren Sie die Google Cloud CLI.
  11. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  12. Aktualisieren Sie die gcloud-Komponenten:
    gcloud components update
  13. Bereiten Sie die Entwicklungsumgebung vor.

Projekt einrichten

  1. Klonen Sie das Beispiel-App-Repository in Ihrem Terminalfenster auf Ihren lokalen Computer:

    git clone https://github.com/GoogleCloudPlatform/golang-samples.git
  2. Wechseln Sie in das Verzeichnis, das den Beispielcode enthält:

    cd golang-samples/getting-started/sessions

Informationen zur Web-App

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 Firestore zum Speichern von Sitzungsdaten.

Sie können firestoregorilla verwenden, einen Sitzungsspeicher, dermit gorilla/sessions kompatibel ist.

  1. Die Anwendung beginnt mit dem Import von Abhängigkeiten sowie dem Festlegen eines app-Typs für eine sessions.Store- und eine HTML-Vorlage und der Liste der Begrüßungen.

    
    // Command sessions starts an HTTP server that uses session state.
    package main
    
    import (
    	"context"
    	"fmt"
    	"html/template"
    	"log"
    	"math/rand"
    	"net/http"
    	"os"
    
    	"cloud.google.com/go/firestore"
    	firestoregorilla "github.com/GoogleCloudPlatform/firestore-gorilla-sessions"
    	"github.com/gorilla/sessions"
    )
    
    // app stores a sessions.Store. Create a new app with newApp.
    type app struct {
    	store sessions.Store
    	tmpl  *template.Template
    }
    
    // greetings are the random greetings that will be assigned to sessions.
    var greetings = []string{
    	"Hello World",
    	"Hallo Welt",
    	"Ciao Mondo",
    	"Salut le Monde",
    	"Hola Mundo",
    }
    
  2. Als Nächstes definiert die Anwendung eine main-Funktion, die eine neue app-Instanz erstellt, den Index-Handler registriert und den HTTP-Server startet. Die Funktion newApp erstellt die Instanz app durch die Initialisierung von sessions.Store mit der Funktion firestoregorilla.New.

    
    func main() {
    	port := os.Getenv("PORT")
    	if port == "" {
    		port = "8080"
    	}
    	projectID := os.Getenv("GOOGLE_CLOUD_PROJECT")
    	if projectID == "" {
    		log.Fatal("GOOGLE_CLOUD_PROJECT must be set")
    	}
    
    	a, err := newApp(projectID)
    	if err != nil {
    		log.Fatalf("newApp: %v", err)
    	}
    
    	http.HandleFunc("/", a.index)
    
    	log.Printf("Listening on port %s", port)
    	if err := http.ListenAndServe(":"+port, nil); err != nil {
    		log.Fatal(err)
    	}
    }
    
    // newApp creates a new app.
    func newApp(projectID string) (*app, error) {
    	ctx := context.Background()
    	client, err := firestore.NewClient(ctx, projectID)
    	if err != nil {
    		log.Fatalf("firestore.NewClient: %v", err)
    	}
    	store, err := firestoregorilla.New(ctx, client)
    	if err != nil {
    		log.Fatalf("firestoregorilla.New: %v", err)
    	}
    
    	tmpl, err := template.New("Index").Parse(`<body>{{.views}} {{if eq .views 1.0}}view{{else}}views{{end}} for "{{.greeting}}"</body>`)
    	if err != nil {
    		return nil, fmt.Errorf("template.New: %w", err)
    	}
    
    	return &app{
    		store: store,
    		tmpl:  tmpl,
    	}, nil
    }
    
  3. Der Index-Handler ruft die Sitzung des Nutzers ab. Bei Bedarf erstellt er eine Sitzung. Neuen Sitzungen werden eine zufällige Sprache und 0 Aufrufe zugewiesen. Anschließend wird die Anzahl der Aufrufe um eins erhöht, die Sitzung gespeichert und die HTML-Vorlage schreibt die Antwort.

    
    // index uses sessions to assign users a random greeting and keep track of
    // views.
    func (a *app) index(w http.ResponseWriter, r *http.Request) {
    	if r.RequestURI != "/" {
    		return
    	}
    
    	// name is a non-empty identifier for this app's sessions. Set it to
    	// something descriptive for your app. It is used as the Firestore
    	// collection name that stores the sessions.
    	name := "hello-views"
    	session, err := a.store.Get(r, name)
    	if err != nil {
    		// Could not get the session. Log an error and continue, saving a new
    		// session.
    		log.Printf("store.Get: %v", err)
    	}
    
    	if session.IsNew {
    		// firestoregorilla uses JSON, which unmarshals numbers as float64s.
    		session.Values["views"] = float64(0)
    		session.Values["greeting"] = greetings[rand.Intn(len(greetings))]
    	}
    	session.Values["views"] = session.Values["views"].(float64) + 1
    	if err := session.Save(r, w); err != nil {
    		log.Printf("Save: %v", err)
    		// Don't return early so the user still gets a response.
    	}
    
    	if err := a.tmpl.Execute(w, session.Values); err != nil {
    		log.Printf("Execute: %v", err)
    	}
    }
    

    Das folgende Diagramm veranschaulicht, wie Firestore Sitzungen für die App Engine-Anwendung verarbeitet.

    Diagramm der Architektur: Nutzer, App Engine, Firestore

Sitzungen löschen

firestoregorilla löscht alte oder abgelaufene Sitzungen nicht. Sie können in der Google Cloud Console 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. Erstellen Sie die Binärdatei sessions im Terminalfenster:

    go build
    
  2. Starten Sie den HTTP-Server:

    ./sessions
    
  3. 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 in Ihrem Browser http://localhost:8080 auf.

    Eine dieser fünf Begrüßungen wird angezeigt: "Hello World", "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 Google Cloud Console

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

In App Engine bereitstellen und ausführen

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

In dieser Anleitung wird der Server mithilfe der App Engine-Standardumgebung bereitgestellt.

Die Datei app.yaml enthält die Konfiguration der App Engine-Standardumgebung:

runtime: go112
  1. Stellen Sie die Anwendung in App Engine bereit:

    gcloud app deploy
    
  2. Geben Sie im Webbrowser die folgende URL ein:

    https://PROJECT_ID.REGION_ID.r.appspot.com

    Ersetzen Sie Folgendes:

Die Begrüßung wird nun von einem Webserver bereitgestellt, der in einer App Engine-Instanz ausgeführt wird.

Fehler in der Anwendung beheben

Wenn Sie keine Verbindung zu Ihrer App Engine-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 wie message=Build failed aufgetreten sind, beheben Sie diese und stellen Sie die App Engine-Anwendung noch einmal bereit.
  2. Rufen Sie in der Google Cloud Console die Seite Log-Explorer auf.

    Zur Seite „Log-Explorer“

    1. Klicken Sie in der Drop-down-Liste Kürzlich ausgewählte Ressourcen auf App Engine-Anwendung und dann auf Alle Werte für module_id. Es wird eine Liste der Anfragen abgerufen, die Sie beim Besuch Ihrer Anwendung 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 Google Cloud Console angezeigt werden, prüfen Sie, ob der Code Ihrer Anwendung mit dem Code im Abschnitt zum Schreiben der Webanwendung übereinstimmt.

    2. Prüfen Sie, ob die Firestore API aktiviert ist.

Bereinigen

Projekt löschen

  1. Wechseln Sie in der Google 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.

App Engine-Instanz löschen

  1. Rufen Sie in der Google Cloud Console die Seite Versionen für App Engine auf.

    Zur Seite "Versionen"

  2. Klicken Sie auf das Kästchen für die nicht standardmäßige Anwendungsversion, die Sie löschen möchten.
  3. Klicken Sie zum Löschen der Anwendungsversion auf Löschen.

Nächste Schritte