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

Posted

技术标签:

【中文标题】Spring Cloud 2020.0.0 中的 Spring Cloud Bus/Stream 问题【英文标题】:Spring Cloud Bus/Stream Issues in Spring Cloud 2020.0.0 【发布时间】:2021-04-20 19:36:03 【问题描述】:

我们有一个 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

所以我有以下问题

    我是否遗漏了什么,或者是否应该有更好的文档来说明流/总线如何相互影响以及迁移到 2020.0.0? 我当前的配置看起来正确吗? 似乎不应该在此处包含 busConsumer - 它的自动配置是否不能与任何其他流配置“组合”? spring.cloud.stream.function.definitionspring.cloud.function.definition 有什么区别?我在文档中都看到过,Spring Cloud Bus 似乎也在设置spring.cloud.function.definition=busConsumer

【问题讨论】:

spring.cloud.stream.function.definition 仅用于向后兼容。与spring.cloud..function.definition 相同。此外,这似乎更像是一个云总线问题,所以希望有人会跟进 @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");

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

【讨论】:

以上是关于Spring Cloud 2020.0.0 中的 Spring Cloud Bus/Stream 问题的主要内容,如果未能解决你的问题,请参考以下文章

迁移 Feign Load Balancer 实现以兼容 Spring cloud 2020.0.0

Netflix之后,如何用Spring Cloud 新组件构建微服务架构?

Spring Cloud Bus 不再支持对 /actuator/bus-refresh 的 POST 请求

Spring Cloud Spring Boot mybatis分布式微服务云架构使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程

spring.cloud.config.server.native.search-locations 不适用于 Spring Cloud Config 服务器中的占位符

Spring Cloud Spring Boot mybatis分布式微服务云架构使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程