#spring-cloud #spring-cloud-stream #spring-cloud-function #spring-cloud-bus
#spring-cloud #spring-cloud-stream #spring-cloud-функция #spring-cloud-bus
Вопрос:
У нас есть микросервис Spring Boot, который, помимо наличия конечных точек HTTP, использует Spring Cloud Bus для получения событий обновления (от rabbit), а также имеет приемник потока Spring Cloud, который принимает пользовательские сообщения из другой темы rabbit.
После обновления до Spring Boot 2.4.1 и Spring Cloud 2020.0.0 все, казалось, работало, пока мы не обнаружили, что Spring Cloud Bus больше не собирает события. Изучая это, оказалось, что некоторые внутренние каналы Spring Cloud Bus не создаются.
Этого не происходило в другом сервисе, у которого также не было потоковой функции, поэтому мы протестировали отключение этого, и затем функциональность шины начала работать. Так что, очевидно, это было какое-то вмешательство между моделью stream старого стиля и более новой шиной Spring Cloud.
После обновления нашего приемника для использования новой функциональной модели у меня все еще были проблемы, и в итоге оба заработали, включив в наше приложение следующие строки.yml:
spring:
cloud:
stream:
bindings.mySink-in-0.destination: mytopic
function.definition: busConsumer;mySink
Итак, у меня есть следующие вопросы
- Я что-то пропустил или должна быть лучшая документация о том, как поток / шина могут влиять друг на друга и переход на 2020.0.0?
- Правильно ли выглядит моя текущая конфигурация?
- Кажется неправильным включать сюда busConsumer — должна ли автоматическая настройка для него не иметь возможности «объединить его» с любой другой конфигурацией потока?
- В чем разница между
spring.cloud.stream.function.definition
иspring.cloud.function.definition
? Я видел как в документации, так и в Spring Cloud Bus, похоже, также настраиваетсяspring.cloud.function.definition=busConsumer
Комментарии:
1. Это
spring.cloud.stream.function.definition
только для обратной совместимости. Это то жеspring.cloud..function.definition
самое, что и . Кроме того, это, по-видимому, скорее вопрос облачной шины, так что, надеюсь, кто-нибудь последует его примеру2. @OlegZhurakousky прав. Spring Cloud Bus после обработки свойства spring.cloud. function.definition (не другое) добавляет потребителя шины, поэтому вы должны использовать это свойство. Также примите во внимание, что, насколько я знаю, spring-cloud-bus больше не совместим с устаревшим подходом spring-cloud-stream.
Ответ №1:
В org.springframework.cloud.stream.function.FunctionConfiguration
нем выполняется поиск @EnableBinding
.
if (ObjectUtils.isEmpty(applicationContext.getBeanNamesForAnnotation(EnableBinding.class)))
Если он найден, функциональная привязка отключается. Видишь это
logger.info("Functional binding is disabled due to the presense of @EnableBinding annotation in your configuration");
После обновления нам необходимо преобразовать наши классы прослушивателей для использования функционального интерфейса, чтобы активировать функциональную привязку. После этого также будет создана привязка потребителя облачной шины.