Облако 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 ответа
- Создать файл под
src/test/resources/application.properties
- Задавать
spring.cloud.gcp.pubsub.emulator-host=localhost:8085
внутри тестового приложения. свойства. - Аннотируйте ваш тестовый класс, чтобы 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.