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.definition
和spring.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工程