Apps lokal mit dem Emulator testen

Zum lokalen Entwickeln und Testen Ihrer Anwendung können Sie den Pub/Sub-Emulator verwenden, der eine lokale Emulation des Pub/Sub-Produktionsdienstes bereitstellt. Sie führen den Pub/Sub-Emulator mit dem gcloud-Befehlszeilentool aus.

Um Ihre Anwendung mit dem Emulator auszuführen, müssen Sie zuerst den Emulator starten und Umgebungsvariablen festlegen, damit Ihre Anwendung mit dem Emulator statt mit dem Produktions-Pub/Sub kommuniziert.

Vorbereitung

Zur Verwendung des Pub/Sub-Emulators benötigen Sie Folgendes:

Emulator installieren

Installieren Sie den Emulator über eine Eingabeaufforderung:

gcloud components install pubsub-emulator
gcloud components update

Emulator starten

Starten Sie den Emulator, indem Sie pubsub start über eine Eingabeaufforderung aufrufen. Bevor Sie den Befehl ausführen, ersetzen Sie PUBSUB_PROJECT_ID durch eine gültige Google Cloud-Projekt-ID. Zeichenfolge. Der String muss kein echtes Google Cloud-Projekt darstellen, da der Pub/Sub-Emulator lokal ausgeführt wird.

gcloud beta emulators pubsub start --project=PUBSUB_PROJECT_ID [options]

Unter gcloud beta emulators pubsub start finden Sie eine vollständige Liste der Optionen.

Nach dem Starten des Emulators wird eine Meldung wie die Folgende angezeigt:

...
[pubsub] This is the Pub/Sub fake.
[pubsub] Implementation may be incomplete or differ from the real system.
...
[pubsub] INFO: Server started, listening on 8085

Dies gibt an, dass der Pub/Sub-Server auf dem Emulatorendpunkt auf Ihrem lokalen Computer statt auf dem Google Cloud-Endpunkt ausgeführt wird. Alle Vorgänge erfolgen lokal, einschließlich:

  • Erstellen eines Themas oder Abos
  • Verlagswesen
  • Wird abonniert

Umgebungsvariablen festlegen

Nachdem Sie den Emulator gestartet haben, müssen Sie Umgebungsvariablen festlegen, damit Ihre Anwendung eine Verbindung zum Emulator statt zu Pub/Sub herstellt. Legen Sie die Umgebungsvariablen auf dem Computer fest, auf dem auch die Anwendung ausgeführt wird.

Sie müssen die Umgebungsvariablen bei jedem Start des Emulators festlegen. Die Umgebungsvariablen hängen von dynamisch zugewiesenen Portnummern ab, die sich beim Neustart des Emulators ändern können.

Variablen automatisch einstellen

Wenn die Anwendung und der Emulator auf demselben Computer ausgeführt werden, können Sie die Umgebungsvariablen automatisch festlegen:

Linux/MacOS

Führen Sie env-init mit Befehlsersetzung aus:

$(gcloud beta emulators pubsub env-init)

Windows

Erstellen Sie eine Batchdatei und verwenden Sie bei der Ausführung die Ausgabe von env-init:

gcloud beta emulators pubsub env-init > set_vars.cmd && set_vars.cmd

Ihre Anwendung stellt jetzt eine Verbindung zum Pub/Sub-Emulator her.

Variablen manuell einstellen

Wenn die Anwendung und der Emulator auf unterschiedlichen Computern ausgeführt werden, legen Sie die Umgebungsvariablen manuell fest:

  1. Führen Sie den Befehl env-init aus:

     gcloud beta emulators pubsub env-init

  2. Legen Sie auf dem Computer, auf der Ihre Anwendung ausgeführt wird, die Umgebungsvariable PUBSUB_EMULATOR_HOST und den Wert entsprechend der Ausgabe des Befehls env-init fest. Optional können Sie die Umgebungsvariable PUBSUB_PROJECT_ID für das Projekt festlegen, das Sie für den Emulator verwenden möchten. Sie müssen lediglich PUBSUB_EMULATOR_HOST festlegen, damit sich Ihre Anwendung mit dem Emulator verbindet. Beispiel:

    Linux/macOS
    export PUBSUB_EMULATOR_HOST=localhost:8432
    export PUBSUB_PROJECT_ID=my-project-id
    Windows
    set PUBSUB_EMULATOR_HOST=localhost:8432
    set PUBSUB_PROJECT_ID=my-project-id

Ihre Anwendung stellt jetzt eine Verbindung zum Pub/Sub-Emulator her.

Hinweis: Wenn Sie den lokalen Entwicklungsserver Python App Engine Standard verwenden, müssen Sie Umgebungsvariablen in der Befehlszeile wie folgt übergeben:

Python

dev_appserver.py app.yaml --env_var PUBSUB_EMULATOR_HOST=${PUBSUB_EMULATOR_HOST}

Emulator verwenden

Wenn Sie den Emulator verwenden möchten, erstellen Sie eine Anwendung mit den Google Cloud-Clientbibliotheken. Der Emulator unterstützt weder Cloud Console noch gcloud pubsub-Befehle.

Das folgende Beispiel zeigt, wie Sie mithilfe des Emulators und einer Anwendung, die die Google Cloud Client-Bibliothek von Python verwendet, ein Thema erstellen, Nachrichten veröffentlichen und Nachrichten lesen können.

Führen Sie die folgenden Schritte auf dem Computer aus, auf dem Sie die Umgebungsvariablen für den Emulator festgelegt haben:

  1. Rufen Sie die Pub/Sub Python-Beispiele von GitHub ab. Klonen Sie dafür das vollständige Python-Repository. Die Pub/Sub-Beispiele befinden sich im Verzeichnis pubsub.

  2. Wechseln Sie in Ihrem geklonten Repository zum Verzeichnis pubsub/cloud-client. Die weiteren Schritte werden in diesem Verzeichnis ausgeführt.

  3. Installieren Sie im Verzeichnis pubsub/cloud-client die Abhängigkeiten, die zum Ausführen des Beispiels erforderlich sind:

    pip install -r requirements.txt
    
  4. Erstellen Sie ein Thema:

     python publisher.py PUBSUB_PROJECT_ID create TOPIC_ID
    
  5. (Optional) Wenn Sie keinen lokalen Push-Endpunkt zum Testen von Push-Abos im Emulator haben, führen Sie die folgenden Schritte aus, um ein auf http://localhost:3000/messages zu erstellen.

    1. Installieren Sie JSON-Server.
      npm install -g json-server
      
    2. Starten Sie JSON Server.
      json-server --port 3000 --watch db.json
      
      wobei db.json den folgenden Startcode enthält:
      {
         "messages": []
      }
      
    3. Notieren Sie sich im nächsten Schritt http://localhost:3000/messages für PUSH_ENDPOINT.
  6. Erstellen Sie ein Abo für das Thema:

    • Erstellen Sie ein Pull-Abo:

      python subscriber.py PUBSUB_PROJECT_ID create TOPIC_ID SUBSCRIPTION_ID
      
    • Push-Abo erstellen:

      python subscriber.py PUBSUB_PROJECT_ID create-push TOPIC_ID SUBSCRIPTION_ID \
      PUSH_ENDPOINT
      
  7. Veröffentlichen Sie Nachrichten zum Thema:

     python publisher.py PUBSUB_PROJECT_ID publish TOPIC_ID
    
  8. Lesen Sie die zu dem Thema veröffentlichten Nachrichten:

    • Nachrichten aus Ihrem Pull-Abo abrufen:

      python subscriber.py PUBSUB_PROJECT_ID receive SUBSCRIPTION_ID
      
    • Beobachten Sie die an Ihren lokalen Push-Endpunkt zugestellten Nachrichten. Nachrichten sehen beispielsweise so aus:

      {
        "messages": [
            {
                "subscription": "projects/PUBSUB_PROJECT_ID/subscriptions/SUBSCRIPTION_ID",
                "message": {
                    "data": "TWVzc2FnZSBudW1iZXIgMQ==",
                    "messageId": "10",
                    "attributes": {}
                },
                "id": 1
            },
            ...
        ]
      }
      

Umgebungsvariablen aufrufen

In allen Sprachen außer Java und C# wird von den Pub/Sub-Clientbibliotheken anstelle von Pub/Sub automatisch die in der lokalen Instanz ausgeführte API aufgerufen, wenn Sie PUBSUB_EMULATOR_HOST wie unter Umgebungsvariablen festlegen beschrieben festgelegt haben.

Bei C#- und Java-Clientbibliotheken müssen Sie jedoch den Code ändern, um den Emulator zu verwenden:

C#

Folgen Sie der Einrichtungsanleitung für C# im Pub/Sub-Schnellstart zur Verwendung von Clientbibliotheken, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zu Pub/Sub C# API.

// For example, "localhost:8615"
string emulatorHostAndPort = Environment.GetEnvironmentVariable("PUBSUB_EMULATOR_HOST");

PublisherServiceApiClient client = new PublisherServiceApiClientBuilder
{
    Endpoint = emulatorHostAndPort,
    ChannelCredentials = ChannelCredentials.Insecure
}.Build();
client.CreateTopic(new TopicName("project", "topic"));
foreach (var topic in client.ListTopics(new ProjectName("project")))
{
    Console.WriteLine(topic.Name);
}

Java

Folgen Sie der Einrichtungsanleitung für Java im Pub/Sub-Schnellstart zur Verwendung von Clientbibliotheken, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zu Pub/Sub Java API.

String hostport = System.getenv("PUBSUB_EMULATOR_HOST");
ManagedChannel channel = ManagedChannelBuilder.forTarget(hostport).usePlaintext().build();
try {
  TransportChannelProvider channelProvider =
      FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel));
  CredentialsProvider credentialsProvider = NoCredentialsProvider.create();

  // Set the channel and credentials provider when creating a `TopicAdminClient`.
  // Similarly for SubscriptionAdminClient
  TopicAdminClient topicClient =
      TopicAdminClient.create(
          TopicAdminSettings.newBuilder()
              .setTransportChannelProvider(channelProvider)
              .setCredentialsProvider(credentialsProvider)
              .build());

  TopicName topicName = TopicName.of("my-project-id", "my-topic-id");
  // Set the channel and credentials provider when creating a `Publisher`.
  // Similarly for Subscriber
  Publisher publisher =
      Publisher.newBuilder(topicName)
          .setChannelProvider(channelProvider)
          .setCredentialsProvider(credentialsProvider)
          .build();
} finally {
  channel.shutdown();
}

Emulator beenden

Drücken Sie zum Beenden des Emulators Strg+C.

Nachdem Sie den Emulator beendet haben, führen Sie den folgenden Befehl aus, um die Umgebungsvariable PUBSUB_EMULATOR_HOST zu entfernen, damit Ihre Anwendung eine Verbindung zu Pub/Sub herstellt:

Linux/macOS
unset PUBSUB_EMULATOR_HOST
Windows
set PUBSUB_EMULATOR_HOST=

Befehlszeilenargumente des Emulators

Weitere Informationen zu Befehlszeilenargumenten für den Pub/Sub-Emulator finden Sie unter gcloud beta emulators pubsub.

Bekannte Einschränkungen

  • UpdateTopic- und UpdateSnapshot-RPCs werden derzeit nicht unterstützt.
  • IAM-Vorgänge werden derzeit nicht unterstützt.
  • Die konfigurierbare Nachrichtenaufbewahrung wird nicht unterstützt. Alle Nachrichten werden auf unbestimmte Zeit aufbewahrt.
  • Der Ablauf von Abos wird nicht unterstützt. Abos laufen nicht ab.

Probleme können Sie im Pub/Sub-Forum melden.