Tester des applications localement avec l'émulateur

Pour développer et tester votre application en local, vous pouvez vous servir de l'émulateur Cloud Pub/Sub, qui fournit une émulation locale de l'environnement de production Cloud Pub/Sub. L'exécution de l'émulateur Cloud Pub/Sub s'effectue à l'aide de l'outil de ligne de commande gcloud.

Pour exécuter votre application sur l'émulateur, vous devez d'abord configurer quelques paramètres, tels que le démarrage de l'émulateur et la définition de variables d'environnement.

Prérequis

Afin d'utiliser l'émulateur Cloud Pub/Sub, vous devez remplir les conditions suivantes :

  • Configurer correctement l'environnement de développement Python (consultez ce guide pour en savoir plus)

  • Avoir installé Java JRE (version 7 ou ultérieure)

  • Avoir installé le SDK Google Cloud (contient l'outil de ligne de commande gcloud)

  • Disposer d'une application développée à l'aide des bibliothèques clientes Google Cloud

Installer l'émulateur

Installez l'émulateur depuis une invite de commande :

gcloud components install pubsub-emulator
gcloud components update

Démarrer l'émulateur

Démarrez l'émulateur en appelant pubsub start depuis une invite de commande :

gcloud beta emulators pubsub start [options]

[options] correspond aux arguments de ligne de commande fournis à l'outil de ligne de commande gcloud. Pour obtenir la liste complète des options, consultez la page gcloud beta emulators pubsub start.

Une fois l'émulateur démarré, un message semblable aux lignes suivantes doit s'afficher :

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

Pour tester les abonnements push, servez-vous d'un point de terminaison push local valide qui peut gérer les requêtes HTTP POST. Par exemple, utilisez un serveur JSON afin de démarrer un faux serveur d'API REST à l'adresse http://localhost:3000 avec http://localhost:3000/receive_messages comme ressource.

Définir des variables d'environnement

Une fois l'émulateur démarré, vous devez définir des variables d'environnement pour que votre application se connecte à l'émulateur au lieu de Cloud Pub/Sub. Définissez ces variables d'environnement sur la même machine que celle utilisée pour exécuter votre application.

Les variables d'environnement doivent être définies chaque fois que vous démarrez l'émulateur. Elles dépendent des numéros de port attribués de manière dynamique, qui sont susceptibles d'être modifiés lorsque vous redémarrez l'émulateur.

Définir les variables automatiquement

Si votre application et l'émulateur s'exécutent sur la même machine, vous pouvez définir les variables d'environnement automatiquement comme suit :

Linux/macOS

Exécutez env-init à l'aide de la substitution de commande :

$(gcloud beta emulators pubsub env-init)

Windows

Créez et exécutez un fichier batch à l'aide du résultat de la commande env-init :

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

Votre application se connecte alors à l'émulateur Cloud Pub/Sub.

Définir les variables manuellement

Si votre application et l'émulateur s'exécutent sur des machines différentes, définissez les variables d'environnement manuellement :

  1. Exécutez la commande env-init :

     gcloud beta emulators pubsub env-init

  2. Sur la machine qui exécute votre application, définissez la variable d'environnement PUBSUB_EMULATOR_HOST, ainsi que sa valeur comme indiqué par le résultat de la commande env-init. Vous pouvez également définir la variable d'environnement PUBSUB_PROJECT_ID pour le projet que vous souhaitez utiliser dans l'émulateur, mais vous devez alors uniquement définir PUBSUB_EMULATOR_HOST pour que votre application se connecte à l'émulateur. Exemple :

    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

Votre application se connecte alors à l'émulateur Cloud Pub/Sub.

Remarque : Si vous utilisez le serveur de développement local standard Python App Engine, vous devez transmettre les variables d'environnement via la ligne de commande comme suit :

Python

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

Utiliser l'émulateur

Pour utiliser l'émulateur, vous devez disposer d'une application créée à l'aide des bibliothèques clientes Google Cloud. L'émulateur n'est pas compatible avec les commandes de la console GCP ou de gcloud pubsub.

L'exemple ci-dessous illustre la procédure à suivre pour créer un sujet, publier des messages et consulter des messages à l'aide de l'émulateur et d'une application utilisant la bibliothèque cliente Google Cloud pour Python.

Suivez les étapes ci-dessous sur la machine sur laquelle vous avez défini les variables d'environnement de l'émulateur :

  1. Récupérez les fichiers d'exemple Python pour Cloud Pub/Sub depuis GitHub en clonant l'intégralité du dépôt Python. Les fichiers d'exemple pour Cloud Pub/Sub se trouvent dans le répertoire pubsub.

  2. Dans votre dépôt cloné, accédez au répertoire pubsub/cloud-client. Vous allez effectuer les étapes restantes dans ce répertoire.

  3. Depuis le répertoire pubsub/cloud-client, installez les dépendances nécessaires à l'exécution de l'exemple :

    pip install -r requirements.txt
    
  4. Créez un sujet :

    python publisher.py PUBSUB_PROJECT_ID create TOPIC_ID
    
  5. Créez un abonnement associé au sujet :

    • Créez un abonnement pull :
    python subscriber.py PUBSUB_PROJECT_ID create TOPIC_ID SUBSCRIPTION_ID
    
    • Pour les abonnements push, configurez un point de terminaison en tant que ressource sur votre serveur local. Ce point de terminaison peut servir de valeur valide pour PUSH_ENDPOINT (exemple : http://localhost:3000/receive_messages). Créez ensuite l'abonnement push :
    python subscriber.py PUBSUB_PROJECT_ID create-push TOPIC_ID SUBSCRIPTION_ID
    PUSH_ENDPOINT
    
  6. Publiez des messages dans le sujet :

    python publisher.py PUBSUB_PROJECT_ID publish TOPIC_ID
    
  7. Consultez les messages publiés sur le sujet :

    python subscriber.py PUBSUB_PROJECT_ID receive SUBSCRIPTION_ID
    

Accéder aux variables d'environnement

Dans tous les langages, à l'exception de Java et C#, les bibliothèques clientes Cloud Pub/Sub appellent automatiquement l'API s'exécutant dans l'instance locale plutôt que Cloud Pub/Sub, si vous avez défini PUBSUB_EMULATOR_HOST tel que décrit dans la section Définir des variables d'environnement.

Toutefois, afin d'utiliser l'émulateur, vous devez modifier votre code pour les bibliothèques clientes pour C# et Java :

C#

Avant d'essayer cet exemple, suivez les instructions de configuration de C# décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour C#.

// 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

Avant d'essayer cet exemple, suivez les instructions de configuration de Java décrites dans le Guide de démarrage rapide de Cloud Pub/Sub – Utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud Pub/Sub pour Java.

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

Arrêter l'émulateur

Pour arrêter l'émulateur, appuyez sur les touches Ctrl+C.

Une fois l'émulateur arrêté, exécutez la commande suivante pour supprimer la variable d'environnement PUBSUB_EMULATOR_HOST, afin que votre application se connecte à Cloud Pub/Sub :

Linux/macOS
unset PUBSUB_EMULATOR_HOST
Windows
set PUBSUB_EMULATOR_HOST=

Arguments de ligne de commande de l'émulateur

Pour en savoir plus sur les arguments de ligne de commande de l'émulateur Cloud Pub/Sub, consultez la page gcloud beta emulators pubsub.

Limitations connues

  • Vous ne pouvez pas démarrer ni arrêter l'éditeur ou l'abonnement depuis votre code.
  • Les opérations IAM ne sont actuellement pas compatibles.

Pour signaler les éventuels problèmes rencontrés, consultez le forum de Cloud Pub/Sub.

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Documentation sur Cloud Pub/Sub