Pub / Sub — хороший инструмент, предоставляемый GCP. Это действительно удобно и может помочь вам с проблемами обмена сообщениями, с которыми может столкнуться ваше приложение. На самом деле, если вы работаете с GCP, вы можете использовать это решение для управляемого обмена сообщениями.
Как и ожидалось, работа с реальным решением Pub / Sub идет с определенной долей, поэтому для
развитие важно использовать то, что не будет стоить вам.

В этих случаях вы можете использовать эмулятор Pub / Sub. Для начала работы с эмулятором необходимо установить его
| 
 1 
 | 
gcloud components install pubsub-emulator | 
Это действительно удобно, но иметь изображение докера, так как оно более переносимо. К сожалению, официального изображения для этого нет в облаке Google, однако вы можете использовать одно из решений, доступных на Docker Hub.
Теперь давайте запустим это
| 
 1 
 | 
gcloud beta emulators pubsub start --project=test-project | 
После этого ваше приложение может подключиться к эмулятору pub / sub. Порт по умолчанию — 8085
Я буду использовать тестовый модуль Java в качестве примера для этого.
| 
 001 
002 
003 
004 
005 
006 
007 
008 
009 
010 
011 
012 
013 
014 
015 
016 
017 
018 
019 
020 
021 
022 
023 
024 
025 
026 
027 
028 
029 
030 
031 
032 
033 
034 
035 
036 
037 
038 
039 
040 
041 
042 
043 
044 
045 
046 
047 
048 
049 
050 
051 
052 
053 
054 
055 
056 
057 
058 
059 
060 
061 
062 
063 
064 
065 
066 
067 
068 
069 
070 
071 
072 
073 
074 
075 
076 
077 
078 
079 
080 
081 
082 
083 
084 
085 
086 
087 
088 
089 
090 
091 
092 
093 
094 
095 
096 
097 
098 
099 
100 
101 
102 
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
114 
115 
116 
117 
118 
119 
120 
121 
122 
123 
124 
125 
126 
127 
128 
129 
130 
131 
132 
 | 
package org.gkatzioura.pubsub;import java.io.IOException;import java.nio.charset.Charset;import org.junit.After;import org.junit.Assert;import org.junit.Before;import org.junit.Test;import com.google.api.gax.core.CredentialsProvider;import com.google.api.gax.core.NoCredentialsProvider;import com.google.api.gax.grpc.GrpcTransportChannel;import com.google.api.gax.rpc.FixedTransportChannelProvider;import com.google.api.gax.rpc.TransportChannelProvider;import com.google.cloud.pubsub.v1.Publisher;import com.google.cloud.pubsub.v1.SubscriptionAdminClient;import com.google.cloud.pubsub.v1.SubscriptionAdminSettings;import com.google.cloud.pubsub.v1.TopicAdminClient;import com.google.cloud.pubsub.v1.TopicAdminSettings;import com.google.cloud.pubsub.v1.stub.GrpcSubscriberStub;import com.google.cloud.pubsub.v1.stub.SubscriberStub;import com.google.cloud.pubsub.v1.stub.SubscriberStubSettings;import com.google.protobuf.ByteString;import com.google.pubsub.v1.ProjectSubscriptionName;import com.google.pubsub.v1.ProjectTopicName;import com.google.pubsub.v1.PubsubMessage;import com.google.pubsub.v1.PullRequest;import com.google.pubsub.v1.PullResponse;import com.google.pubsub.v1.PushConfig;import com.google.pubsub.v1.Subscription;import io.grpc.ManagedChannel;import io.grpc.ManagedChannelBuilder;public class LocalPubSubTest {    private static final String PROJECT = "test-project";    private static final String SUBSCRIPTION_NAME = "SUBSCRIBER";    private static final String TOPIC_NAME = "test-topic-id";    private static final String hostPort = "127.0.0.1:8085";    private ManagedChannel channel;    private TransportChannelProvider channelProvider;    private TopicAdminClient topicAdmin;    private Publisher publisher;    private SubscriberStub subscriberStub;    private SubscriptionAdminClient subscriptionAdminClient;    private ProjectTopicName topicName = ProjectTopicName.of(PROJECT, TOPIC_NAME);    private ProjectSubscriptionName subscriptionName = ProjectSubscriptionName.of(PROJECT, SUBSCRIPTION_NAME);    private Subscription subscription;    @Before    public void setUp() throws Exception {        channel = ManagedChannelBuilder.forTarget(hostPort).usePlaintext().build();        channelProvider = FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel));        CredentialsProvider credentialsProvider = NoCredentialsProvider.create();        topicAdmin = createTopicAdmin(credentialsProvider);        topicAdmin.createTopic(topicName);        publisher = createPublisher(credentialsProvider);        subscriberStub = createSubscriberStub(credentialsProvider);        subscriptionAdminClient = createSubscriptionAdmin(credentialsProvider);        subscription = subscriptionAdminClient.createSubscription(subscriptionName, topicName, PushConfig.getDefaultInstance(), 0);    }    @After    public void tearDown() throws Exception {        topicAdmin.deleteTopic(topicName);        subscriptionAdminClient.deleteSubscription(subscription.getName());        channel.shutdownNow();    }    @Test    public void testLocalPubSub() throws Exception {        final String messageText = "text";        PubsubMessage pubsubMessage = PubsubMessage.newBuilder()                                                   .setData(ByteString.copyFrom(messageText, Charset.defaultCharset()))                                                   .build();        publisher.publish(pubsubMessage).get();        PullRequest pullRequest = PullRequest.newBuilder()                                             .setMaxMessages(1)                                             .setReturnImmediately(true) // return immediately if messages are not available                                             .setSubscription(subscription.getName())                                             .build();        PullResponse pullResponse = subscriberStub.pullCallable().call(pullRequest);        String receiveMessageText = pullResponse.getReceivedMessages(0).getMessage().getData().toStringUtf8();        Assert.assertEquals(messageText, receiveMessageText);    }    private TopicAdminClient createTopicAdmin(CredentialsProvider credentialsProvider) throws IOException {        return TopicAdminClient.create(                TopicAdminSettings.newBuilder()                                  .setTransportChannelProvider(channelProvider)                                  .setCredentialsProvider(credentialsProvider)                                  .build()        );    }    private SubscriptionAdminClient createSubscriptionAdmin(CredentialsProvider credentialsProvider) throws IOException {        SubscriptionAdminSettings subscriptionAdminSettings = SubscriptionAdminSettings.newBuilder()                                                                                       .setCredentialsProvider(credentialsProvider)                                                                                       .setTransportChannelProvider(channelProvider)                                                                                       .build();        return SubscriptionAdminClient.create(subscriptionAdminSettings);    }    private Publisher createPublisher(CredentialsProvider credentialsProvider) throws IOException {        return Publisher.newBuilder(topicName)                        .setChannelProvider(channelProvider)                        .setCredentialsProvider(credentialsProvider)                        .build();    }    private SubscriberStub createSubscriberStub(CredentialsProvider credentialsProvider) throws IOException {        SubscriberStubSettings subscriberStubSettings = SubscriberStubSettings.newBuilder()                                                                              .setTransportChannelProvider(channelProvider)                                                                              .setCredentialsProvider(credentialsProvider)                                                                              .build();        return GrpcSubscriberStub.create(subscriberStubSettings);    }} | 
Вот и все. Теперь вы можете провести экономически эффективные юнит-тесты!
| 
 Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG. Смотреть оригинальную статью здесь: Pub / Sub local emulator Мнения, высказанные участниками Java Code Geeks, являются их собственными.  |