Проблемы с шиной / потоком Spring Cloud в Spring Cloud 2020.0.0

#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
 

Итак, у меня есть следующие вопросы

  1. Я что-то пропустил или должна быть лучшая документация о том, как поток / шина могут влиять друг на друга и переход на 2020.0.0?
  2. Правильно ли выглядит моя текущая конфигурация?
  3. Кажется неправильным включать сюда busConsumer — должна ли автоматическая настройка для него не иметь возможности «объединить его» с любой другой конфигурацией потока?
  4. В чем разница между 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");

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