Sitzungen mit Cloud Firestore verarbeiten

Viele Anwendungen benötigen eine Sitzungsverarbeitung zur Authentifizierung und für Nutzereinstellungen. Sinatra enthält eine speicherbasierte Implementierung, um diese Funktion auszuführen. Diese Implementierung eignet sich jedoch nicht für eine Anwendung, die von mehreren Instanzen bereitgestellt werden kann, da sich die auf einer Instanz aufgezeichnete Sitzung von anderen Instanzen unterscheiden kann. In dieser Anleitung wird gezeigt, wie Sitzungen in App Engine verarbeitet werden.

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.

Hinweis

  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. Bereite deine Entwicklungsumgebung vor.

Projekt einrichten

  1. Beginnen Sie im Terminalfenster in einem Verzeichnis Ihrer Wahl und erstellen Sie ein neues Verzeichnis mit dem Namen sessions. Der gesamte Code für diese Anleitung befindet sich im Verzeichnis sessions.

  2. Wechseln Sie in das Verzeichnis sessions:

    cd sessions
    
  3. Initialisieren Sie Gemfile:

    bundle init
    
  4. Hängen Sie Folgendes an das resultierende Gemfile an:

    gem "google-cloud-firestore", "~> 2.0"
    gem "sinatra", "~> 2.0"

    Das Gemfile listet alle nicht standardmäßigen Ruby-Bibliotheken auf, die App Engine zum Laden von App Engine benötigt:

    • google-cloud-firestore ist der Ruby-Client für die Firestore API.

    • Sinatra ist das Ruby-Web-Framework, das für die Anwendung verwendet wird.

  5. Installieren Sie die Abhängigkeiten:

    bundle install
    

Webanwendung schreiben

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

  • Erstellen Sie mit einem Texteditor im Verzeichnis sessions eine Datei namens app.rb mit folgendem Inhalt:

    require "sinatra"
    
    require_relative "firestore_session"
    
    use Rack::Session::FirestoreSession
    
    set :greetings, ["Hello World", "Hallo Welt", "Ciao Mondo", "Salut le Monde", "Hola Mundo"]
    
    get "/" do
      session[:greeting] ||= settings.greetings.sample
      session[:views] ||= 0
      session[:views] += 1
      "<h1>#{session[:views]} views for \"#{session[:greeting]}\"</h1>"
    end

Sitzungsspeicher erstellen

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. Das folgende Diagramm veranschaulicht, wie Firestore Sitzungen für die App Engine-Anwendung verarbeitet.

Diagramm der Architektur: Nutzer, App Engine, Firestore

Sinatra unterstützt das Speichern von Sitzungsdaten in einem Cookie. Wenn Sie stattdessen in Firestore speichern möchten, müssen Sie Ihr eigenes Rack::Session - Objekt definieren.

  • Erstellen Sie im Verzeichnis sessions eine Datei namens firestore_session.rb mit folgendem Inhalt:

    require "google/cloud/firestore"
    require "rack/session/abstract/id"
    
    module Rack
      module Session
        class FirestoreSession < Abstract::Persisted
          def initialize app, options = {}
            super
    
            @firestore = Google::Cloud::Firestore.new
            @col = @firestore.col "sessions"
          end
    
          def find_session _req, session_id
            return [generate_sid, {}] if session_id.nil?
    
            doc = @col.doc session_id
            fields = doc.get.fields || {}
            [session_id, stringify_keys(fields)]
          end
    
          def write_session _req, session_id, new_session, _opts
            doc = @col.doc session_id
            doc.set new_session, merge: true
            session_id
          end
    
          def delete_session _req, session_id, _opts
            doc = @col.doc session_id
            doc.delete
            generate_sid
          end
    
          def stringify_keys hash
            new_hash = {}
            hash.each do |k, v|
              new_hash[k.to_s] =
                if v.is_a? Hash
                  stringify_keys v
                else
                  v
                end
            end
            new_hash
          end
        end
      end
    end

Sitzungen löschen

Wie bereits erwähnt, löscht diese App keine alten oder abgelaufenen Sitzungen. Sie können in der Google Cloud Console Sitzungsdaten löschen oder eine Strategie zum automatischen Löschen implementieren.

Lokal ausführen

  1. Starten Sie den HTTP-Server:

    bundle exec ruby app.rb
    
  2. Sehen Sie sich die App in Ihrem Webbrowser an:

    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 aufrufen und bearbeiten.

  3. 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.

  1. Erstellen Sie im Terminalfenster eine app.yaml-Datei und fügen Sie Folgendes in die Datei ein:

    runtime: ruby25
    entrypoint: bundle exec ruby app.rb
  2. Stellen Sie die Anwendung in App Engine bereit:

    gcloud app deploy
    
  3. Rufen Sie die Live-Anwendung unter der folgenden URL auf, wobei PROJECT_ID Ihre Google Cloud-Projekt-ID ist:

    https://PROJECT_ID.appspot.com

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 dem Code im Abschnitt zum Schreiben der Webanwendung entspricht.

    2. Die Firestore API muss aktiviert sein.

Bereinigen

Projekt löschen

  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.

App Engine-Instanz löschen

  1. In the Google Cloud console, go to the Versions page for App Engine.

    Go to Versions

  2. Select the checkbox for the non-default app version that you want to delete.
  3. Klicken Sie zum Löschen der Anwendungsversion auf Löschen.

Weitere Informationen