使用模擬器在本機上測試應用程式

如要在本機上開發及測試您的應用程式,您可以使用 Cloud Pub/Sub 模擬器,提供 Cloud Pub/Sub 實際工作環境的本機模擬。您可以使用 gcloud 指令列工具執行 Cloud Pub/Sub 模擬器。

如要針對模擬器執行應用程式,您需要先進行一些設定,例如啟動模擬器與設定環境變數。

必要條件

您必須具備下列條件才能使用 Cloud Pub/Sub 模擬器:

安裝模擬器

透過命令提示字元安裝模擬器:

gcloud components install pubsub-emulator
gcloud components update

啟動模擬器

透過命令提示字元叫用 pubsub start 來啟動模擬器:

gcloud beta emulators pubsub start [options]

其中 [options] 是提供給 gcloud 指令列工具的指令列引數。如需完整的選項清單,請參閱 gcloud beta emulators pubsub start

啟動模擬器之後,您應該會看到類似以下內容的訊息:

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

如要測試推送訂閱,請使用能夠處理 HTTP POST 要求的有效本機推送端點。舉例來說,您可以使用 JSON 伺服器http://localhost:3000 中啟動假的 REST API 伺服器,並以 http://localhost:3000/receive_messages 作為資源。

設定環境變數

啟動模擬器之後,您需要設定環境變數,使您的應用程式可以連接到模擬器,而非 Cloud Pub/Sub。在您用來執行應用程式的相同機器中設定這些環境變數。

每次啟動模擬器時,您都需要設定環境變數。環境變數取決於動態指派的通訊埠編號,這些編號可能會在您重新啟動模擬器時變更。

自動設定變數

如果您的應用程式與模擬器在相同機器上執行,可自動設定環境變數:

Linux / macOS

使用替代指令執行 env-init

$(gcloud beta emulators pubsub env-init)

Windows

使用 env-init 的輸出建立及執行批次檔案:

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

您的應用程式現在將連線至 Cloud Pub/Sub 模擬器。

手動設定變數

如果您的應用程式與模擬器在不同機器上執行,可手動設定環境變數:

  1. 執行 env-init 指令:

     gcloud beta emulators pubsub env-init

  2. 在執行應用程式的機器上,設定由 env-init 指令輸出引導的 PUBSUB_EMULATOR_HOST 環境變數與值。您可以選擇針對要用於模擬器的專案設定 PUBSUB_PROJECT_ID 環境變數,但您只需針對應用程式設定 PUBSUB_EMULATOR_HOST 就可以連線至模擬器。例如:

    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

您的應用程式現在將連線至 Cloud Pub/Sub 模擬器。

附註:如果您使用 Python App Engine Standard 本機開發伺服器,則必須如下所示在指令列中傳送環境變數:

Python

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

使用模擬器

如要使用模擬器,你必須使用 Google Cloud 用戶端程式庫建立應用程式。模擬器並不支援 GCP 主控台或 gcloud pubsub 指令。

下列範例示範如何使用模擬器及使用 Python Google Cloud 用戶端程式庫的應用程式建立主題、發佈訊息以及讀取訊息。

在您設定模擬器環境變數的機器中完成下列步驟:

  1. 複製完整的 Python 存放區,由 GitHub 取得 Cloud Pub/Sub Python 範例。Cloud Pub/Sub 範例位於 pubsub 目錄中。

  2. 在您複製的存放區中,瀏覽到 pubsub/cloud-client 目錄。您將在這個目錄中完成其餘步驟。

  3. pubsub/cloud-client 目錄中,安裝執行範例所需的依附元件:

    pip install -r requirements.txt
    
  4. 建立主題:

    python publisher.py PUBSUB_PROJECT_ID create TOPIC_ID
    
  5. 為主題建立訂閱:

    • 建立提取訂閱:
    python subscriber.py PUBSUB_PROJECT_ID create TOPIC_ID SUBSCRIPTION_ID
    
    • 請針對推送訂閱在本機伺服器設定端點作為資源。這可作為「PUSH_ENDPOINT」的有效值,如 http://localhost:3000/receive_messages。接著,請建立推送訂閱:
    python subscriber.py PUBSUB_PROJECT_ID create-push TOPIC_ID SUBSCRIPTION_ID
    PUSH_ENDPOINT
    
  6. 將訊息發佈至主題:

    python publisher.py PUBSUB_PROJECT_ID publish TOPIC_ID
    
  7. 讀取發佈到主題的訊息:

    python subscriber.py PUBSUB_PROJECT_ID receive SUBSCRIPTION_ID
    

存取環境變數

在除了 Java 和 C# 以外的所有語言中,如果您已遵循設定環境變數一節所述設定 PUBSUB_EMULATOR_HOST,Cloud Pub/Sub 用戶端程式庫就會自動呼叫在本機執行個體 (而不是 Cloud Pub/Sub) 中執行的 API。

但是,C# 與 Java 用戶端程式庫需要您修改程式碼才能使用模擬器:

C#

在嘗試這個範例之前,請至 Cloud Pub/Sub 快速入門導覽課程:使用用戶端程式庫,按照 C# 設定說明進行操作。詳情請參閱 Cloud Pub/Sub C# API 參考說明文件

// Copyright 2017 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

using Google.Apis.Logging;
using Google.Cloud.PubSub.V1;
using Google.Cloud.Translation.V2;
using static Google.Apis.Http.ConfigurableMessageHandler;
using Grpc.Core;
using System;
using Google.Api.Gax.ResourceNames;

namespace Google.Cloud.Tools.Snippets
{
    public class FaqSnippets
    {
        public void Emulator()
        {
            // Sample: Emulator
            // For example, "localhost:8615"
            string emulatorHostAndPort = Environment.GetEnvironmentVariable("PUBSUB_EMULATOR_HOST");

            Channel channel = new Channel(emulatorHostAndPort, ChannelCredentials.Insecure);
            PublisherServiceApiClient client = PublisherServiceApiClient.Create(channel);
            client.CreateTopic(new TopicName("project", "topic"));
            foreach (var topic in client.ListTopics(new ProjectName("project")))
            {
                Console.WriteLine(topic.Name);
            }
            // End sample
        }

        public void RestLogging()
        {
            // Sample: RestLogging
            // Required using directives:
            // using static Google.Apis.Http.ConfigurableMessageHandler;
            // using Google.Apis.Logging;
            // using Google.Cloud.Translation.V2;

            // Register a verbose console logger
            ApplicationContext.RegisterLogger(new ConsoleLogger(LogLevel.All));

            // Create a translation client
            TranslationClient client = TranslationClient.Create();

            // Configure which events the message handler will log.
            client.Service.HttpClient.MessageHandler.LogEvents =
                LogEventType.RequestHeaders | LogEventType.ResponseBody;

            // Make the request
            client.ListLanguages();
            // End sample
        }
    }
}

Java

在嘗試這個範例之前,請至 Cloud Pub/Sub 快速入門導覽課程:使用用戶端程式庫,按照 Java 設定說明進行操作。詳情請參閱 Cloud 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());

  ProjectTopicName topicName = ProjectTopicName.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();
}

停止模擬器

如要停止模擬器,請按下 Control+C

停止模擬器之後,請執行下列指令來移除 PUBSUB_EMULATOR_HOST 環境變數,以便應用程式連線至 Cloud Pub/Sub:

Linux / macOS
unset PUBSUB_EMULATOR_HOST
Windows
set PUBSUB_EMULATOR_HOST=

模擬器指令列引數

如要瞭解 Cloud Pub/Sub 模擬器的指令列引數,請參閱 gcloud beta emulators pubsub

已知的不足之處

  • 您無法透過程式碼啟動或停止發佈者或訂閱者。
  • 目前不支援 IAM 作業。

如要提出問題,請造訪 Cloud Pub/Sub 論壇

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Pub/Sub 說明文件