Spring Cloud 2020.0.0 中的 Spring Cloud Bus/Stream 问题

问题描述

我们有一个 Spring Boot 微服务,除了有 HTTP 端点使用 Spring Cloud Bus 来获取刷新事件(来自 rabbit),还有一个 Spring Cloud Stream Sink 可以从另一个 rabbit 主题获取自定义消息。

更新到 Spring Boot 2.4.1 和 Spring Cloud 2020.0.0 后,一切似乎都在工作,直到我们发现 Spring Cloud Bus 不再接收事件。 对此进行了调查,结果发现一些 Spring Cloud Bus 内部通道没有被创建。

这在另一个没有流功能的服务中没有发生,所以我们测试了禁用它,然后总线功能开始工作。 所以这显然是旧式流模型和新式 Spring Cloud Bus 之间的某种干扰。

在更新我们的接收器以使用新的函数模型后,我仍然遇到了问题,最终通过在我们的 application.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.deFinitionspring.cloud.function.deFinition 有什么区别?我在文档和 Spring Cloud Bus 中都看到过似乎也在设置 spring.cloud.function.deFinition=busConsumer

解决方法

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");

升级后,我们需要将我们的 Listener 类转换为使用函数式接口,以激活函数式绑定。之后,也会创建云总线消费者绑定。