Облако Spring Boot GCP не может подключиться к локальному эмулятору Google PubSub

Попытка подключения к локальному эмулятору Google PubSub из загрузочного приложения Spring для тестирования.

Используя приведенный ниже конфиг
spring.cloud.gcp.pubsub.emulator-host=localhost:8085

Эмулятор локально запустил успешно на 8085, также установили PUBSUB_EMULATOR_HOST=localhost:8085

Примечание. При подключении к актуальной теме Google PubSub все работает нормально.

3 ответа

  1. Создать файл под src/test/resources/application.properties
  2. Задавать spring.cloud.gcp.pubsub.emulator-host=localhost:8085 внутри тестового приложения. свойства.
  3. Аннотируйте ваш тестовый класс, чтобы Spring выбрал ваше тестовое приложение.properties:
@RunWith(SpringRunner::class)
@SpringBootTest

РЕДАКТИРОВАТЬ: я создал пример проекта, который показывает, как использовать Spring с эмулятором PubSub в тесте (который также требует создания темы и подписки): https://github.com/nhartner/pubsub-emulator-demo

При использовании эмулятора Pub/Sub используйте FixedTransportChannelProvider а также NoCredentialsProvider создать Publisher или же Subscriber, Это продемонстрировано в UsePubSubEmulatorSnippet.java:

String hostport = System.getenv("PUBSUB_EMULATOR_HOST");
ManagedChannel channel = ManagedChannelBuilder.forTarget(hostport).usePlaintext(true).build();
TransportChannelProvider channelProvider = FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel));

CredentialsProvider credentialsProvider = NoCredentialsProvider.create();

ProjectTopicName topicName = ...

// Use the channel and credentials provider when creating a Publisher or Subscriber.
Publisher publisher =
    Publisher.newBuilder(topicName)
        .setChannelProvider(channelProvider)
        .setCredentialsProvider(credentialsProvider)
        .build();

Мы можем использовать подход Testcontainers для использования всех поддерживаемых сервисов. Он предоставляет вам док-контейнер, в котором будут работать эмуляторы, и поможет использовать разные конфигурации для нескольких проектов и обновить настройки теста в соответствии с отдельным тестовым случаем. Для pubsub используйте приведенную ниже конфигурацию, которую вы можете создать для начальной настройки: т. е. темы и подписки.

      companion object {
    private val log = logger(GCPSetup::class.java)
    private val emulator: PubSubEmulatorContainer = PubSubEmulatorContainer(
        DockerImageName.parse("gcr.io/google.com/cloudsdktool/cloud-sdk:316.0.0-emulators")
    )

    init {
        emulator.start()
    }

    @Configuration
    class EmulatorConfiguration{
        @Bean
        fun credentialProvider() = NoCredentialsProvider()
    }
    @DynamicPropertySource
    fun emulatorProperties(registry:DynamicPropertyRegistry){
        registry.add("spring.cloud.gcp.pubsub.emulator-host") { emulator.emulatorEndpoint }
    }
}

Приведенный выше пример находится в Kotlin, но вы можете использовать приведенную выше конфигурацию в статическом блоке в java.

Другие вопросы по тегам