Spring Cloud Bus使用轻量级消息代理将分布式系统的节点链接起来。这代理可以用于广播状态更改(例如配置更改)或其他管理指令。一个关键的想法是,Bus就像一个扩展出去的Spring Boot应用程序的分布式执行器。同时也可以用作应用程序之间的通信渠道。本项目提供AMQP或Kafka作为传输工具。

1. 快速开始

Spring Boot的自动配置会自动扫描依赖中是否有Spring Cloud Bus。要启用Bus,只要添加依赖spring-cloud-starter-bus-amqpspring-cloud-starter-bus-kafka,Spring Cloud负责其余部分。确保代理(RabbitMQ或Kafka)可用和配置好。在本地主机上运行您不用做任何事情。但如果您远程运行,请使用Spring Cloud Connectors或Spring Boot定义的凭据,例如Rabbit:
application.yml

spring:rabbitmq:host: mybroker.comport: 5672username: userpassword: secret

总线当前支持向所有监听中的节点发送消息,也可向特定服务(由Eureka定义)所有实例发送消息。/bus/*路径下有目前有两个http接口。第一个是/bus/env,发送键值对来更新每个节点的Spring Environment。第二个是/bus/refresh,将重新加载每个应用程序的配置,就像他们都调用了/refresh接口一样。

Bus涵盖了Rabbit和Kafka,因为这是两个最常见的实现。但Spring Cloud Stream非常灵活,binder可以和spring-cloud-bus结合使用。

2. Bus接口

Spring Cloud Bus 有两个接口,/actuator/bus-refresh/actuator/bus-env,分别和Spring Cloud的常用actuator接口/actuator/refresh/actuator/env对应。

2.1 Refresh接口

/actuator/bus-refresh接口清理RefreshScope缓存,并重新绑定@ConfigurationProperties

要暴露/actuator/bus-refresh接口,需要添加以下配置:

management.endpoints.web.exposure.include=bus-refresh

2.2 Env接口

/actuator/bus-env会更新所有包含指定键值对的实例。
要暴露/actuator/bus-env接口,需要添加以下配置:

management.endpoints.web.exposure.include=bus-env

/actuator/bus-env接口授受的post请求格式如下:

{"name": "key1","value": "value1"
}

3. 定位实例

每个应用实例都会有一个服务ID,它可以通过属性spring.cloud.bus.id设置,其值通常是由多个以冒号分隔的id组成。短id的默认值由spring.application.nameserver.port(或者是spring.application.index,如果设置了的话)组成。长ID的默认值是app:index:id,其中:

  • app:是vcap.application.name,如果没有设置,则是spring.application.name
  • index:是vcap.application.instance_index,如果没设置,依次取spring.application.index、
    local.server.port、server.port或0
  • id:是vcap.application.instance_id,如果没有设置,则取随机值。

HTTP接口可以添加“目的地”路径参数,如/bus-refresh/customers:9000,其中customers:9000是服务ID。如果ID由Bus上的一个实例拥有,那么它将处理消息,所有其他实例将忽略它。

4. 寻址服务的所有实例

在Spring PathMatcher(路径分隔符为冒号:)中使用“destination”路径参数来确定实例是否处理该消息。使用上面的示例,“/bus-env/customers:**”将定位“customers”服务的所有实例。

5. 应用程序ID必须唯一

总线尝试消除一个事件两次,一次从队列中消除,一次从原来的ApplicationEvent中。为此,它会对比发送的服务id和当前的服务ID。如果服多个实例具有相同的ID,则不会处理事件。在本地机器上运行,每个服务将在不同的端口上,端口是服务ID的一部分。Cloud Foundry提供了区分的索引。为了确保服务ID是唯一的,请将spring.application.index设置为服务的每个实例唯一的值。例如,在application.properties中设置spring.application.index=${INSTANCE_INDEX}(如果使用configserver,请设置bootstrap.properties)。

6. 自定义Message Broker

Spring Cloud Bus使用 Spring Cloud Stream广播消息。因此,为了获取消息流,只需要在类路径中包含您选择的binder实现。有对应AMQP(RabbitMQ)和Kafka的starter,spring-cloud-starter-bus-[amqp,kafka]。一般而言,Spring Cloud Stream遵守Spring Boot自动配置约定,因此例如可以使用spring.rabbitmq.*配置属性更改AMQP代理地址。Spring Cloud Bus在spring.cloud.bus.*中具有少量本机配置属性(例如,spring.cloud.bus.destination是使用外部中间件的主题的名称)。通常,默认值就足够了。

要更多地了解如何自定义消息代理设置,请参阅Spring Cloud Stream文档。

7. 追踪Bus事件

Bus事件(RemoteApplicationEvent的子类)可以通过设置spring.cloud.bus.trace.enabled=true进行跟踪。如果这样做,则Spring Boot TraceRepository(如果存在)将显示每个服务实例发送的所有事件和所有的ack。示例(来自/trace接口):

{"timestamp": "2015-11-26T10:24:44.411+0000","info": {"signal": "spring.cloud.bus.ack","type": "RefreshRemoteApplicationEvent","id": "c4d374b7-58ea-4928-a312-31984def293b","origin": "stores:8081","destination": "*:**"}},{"timestamp": "2015-11-26T10:24:41.864+0000","info": {"signal": "spring.cloud.bus.sent","type": "RefreshRemoteApplicationEvent","id": "c4d374b7-58ea-4928-a312-31984def293b","origin": "customers:9000","destination": "*:**"}},{"timestamp": "2015-11-26T10:24:41.862+0000","info": {"signal": "spring.cloud.bus.ack","type": "RefreshRemoteApplicationEvent","id": "c4d374b7-58ea-4928-a312-31984def293b","origin": "customers:9000","destination": "*:**"}
}

这个迹象表明RefreshRemoteApplicationEvent已从customers:9000发送,广播到所有服务,并被customers:9000和stores:8081收到(确认)。

要处理ack信号,您可以向您的应用添加AckRemoteApplicationEvent和SentApplicationEvent类型的@EventListener(并启用跟踪)。或者您可以利用TraceRepository并从中挖掘数据。

任何Bus应用程序都可以跟踪ack。但有时在一个可以对数据进行更复杂查询的中央服务中这样做是有用的,或将其转发到专门的跟踪服务。

8. 广播自己的事件

Bus可以携带任何类型为RemoteApplicationEvent的事件。传输格式是JSON,并且反序列化时需要知道使用的是哪些类型。要注册一个新的类型,需要把它放在org.springframework.cloud.bus.event的子包中。

要自定义事件名称,您可以在自定义类上使用@JsonTypeName,或者使用默认策略(使用类的简单名称)。

请注意,生产者和消费者都需要访问类定义。

8.1. 在自定义包中注册事件

如果您不能或不想为自定义事件使用org.springframework.cloud.bus.event的子包,则必须使用@RemoteApplicationEventScan指定要扫描的包,扫描类型为RemoteApplicationEvent的事件。用@RemoteApplicationEventScan指定的包包括子包。

例如,如果您有一个名为MyEvent的自定义事件:

package com.acme;public class MyEvent extends RemoteApplicationEvent {...
}

您可以通过以下方式注册事件与解串器:

package com.acme;@Configuration
@RemoteApplicationEventScan
public class BusConfiguration {...

如果没有指定值,将把使用@RemoteApplicationEventScan的类的包进行注册。在这个例子中,将使用BusConfiguration的包com.acme注册。

您还可以使用@RemoteApplicationEventScan上的value,basePackages或basePackageClasses属性明确指定要扫描的软件包。例如:

package com.acme;@Configuration
//@RemoteApplicationEventScan({"com.acme", "foo.bar"})
//@RemoteApplicationEventScan(basePackages = {"com.acme", "foo.bar", "fizz.buzz"})
@RemoteApplicationEventScan(basePackageClasses = BusConfiguration.class)
public class BusConfiguration {...
}

@RemoteApplicationEventScan的所有示例都是等效的,因为com.acme包将通过在@RemoteApplicationEventScan上明确指定包来注册。

请注意,您可以指定要扫描的多个基本软件包。

9. 属性列表

请查看 所有属性列表

Spring Cloud Bus 使用说明相关推荐

  1. 原 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f8-bus/ 本文出自方志朋的博客 转载请标明出处: Spr ...

  2. Spring Cloud(十一)高可用的分布式配置中心 Spring Cloud Bus 消息总线集成(RabbitMQ)

    上一篇文章,留了一个悬念,Config Client 实现配置的实时更新,我们可以使用 /refresh 接口触发,如果所有客户端的配置的更改,都需要手动触发客户端 /refresh ,当服务越来越多 ...

  3. Spring Cloud第八篇:Spring Cloud Bus刷新配置

    Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来.它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控.本文要讲述的是用Spring Cloud Bus实现通知微服务 ...

  4. 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)

    首先:欢迎各位学习java和大数据的程序员朋友们加入Java交流学习群: 721506929,群内提供免费的架构学习资料,有需要的朋友可以进群来学习. https://www.fangzhipeng. ...

  5. (八)java版spring cloud+spring boot 社交电子商务平台-消息总线(Spring Cloud Bus)

    电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来.它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控.本文要 ...

  6. (十六)java springcloud版b2b2c社交电商spring cloud分布式微服务-使用spring cloud Bus刷新配置...

    b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.我们使用spring cloud分布式微服务云架构做了b2b2c的电子商务系统,除了架构本身自带的系统服务外,我们将b2b2c的业务服 ...

  7. (十六) 整合spring cloud云架构 -使用spring cloud Bus刷新配置

    2019独角兽企业重金招聘Python工程师标准>>> 我们使用spring cloud分布式微服务云架构做了b2b2c的电子商务系统,除了架构本身自带的系统服务外,我们将b2b2c ...

  8. 消息总线(Spring Cloud Bus)

    spring CloudBus 将分布式的节点和轻量的消息代理连接起来.这可以用于广播配置文件的更改或者其他的管理工作.一个关键的思想就是,消息总线可以为微服务做监控,也可以作为应用程序之间相互通讯. ...

  9. java版spring cloud+spring boot+redis社交电子商务平台(八)消息总线(Spring Cloud Bus)

    B2B2C电子商务平台源码请加企鹅求求:一零三八七七四六二六.Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来.它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控. ...

  10. SpringCloud微服务云架构构建B2B2C电子商务平台之-(八)消息总线(Spring Cloud Bus)...

    Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来.它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控.本文要讲述的是用Spring Cloud Bus实现通知微服务 ...

最新文章

  1. png库结合zlib库使用出现的一个链接问题的解决
  2. 春招不迷茫,模板刷题101实验室上线啦
  3. 神策数据荣登《中国企业家》2019 中国科创企业百强榜
  4. linux centos6.5 ftp网页vsftpd配置
  5. 编译tensorflow的小小记录
  6. Android Weekly Notes Issue #230
  7. 华为EMUI 10系统内测截图曝光:基于Android 10.0
  8. PowerPC VxWorks BSP分析(4.2)——BSP定制
  9. 【转】C++11 标准新特性: 右值引用与转移语义
  10. 中国防毒软件市场深度研究分析报告
  11. Java实现 LeetCode 707 设计链表(环形链表)
  12. 科学-建筑学:建筑学百科
  13. 系列篇|单目结构光三维成像系统的标定方法
  14. 最新《播布客李明新概念C语言作品》
  15. 第五届安洵杯网络挑战赛WP
  16. Android Fragment 从源码的角度去解析(上)
  17. 事后诸葛亮(葫芦娃队)
  18. MOOS-ivp 实验五 MOOS编程进阶(2)
  19. 大数据多租户的概念_大数据平台 多租户
  20. 【电脑桌面不见了怎么办】

热门文章

  1. 智能运维|AIRIOT智慧光伏管理解决方案
  2. python结构方程模型_SEM结构方程模型分析的数据需要至少多少样本量
  3. 【web前端】前端性能优化指南,还不来看看?
  4. 暴走英雄坛服务器维护到什么时候,暴走英雄坛在4月25日更新了什么 最新维护内容介绍...
  5. 感受野的含义及计算方法
  6. oracle从11.0.2.4.0打PSU 11.0.2.4.8
  7. 广义表(Generalized Lists)
  8. 肠道核心菌属——巨单胞菌属(Megamonas)
  9. 深度学习之学习(3-4)YOLOV4
  10. SpringBoot整合JpaMapper实现基于mybatis的快速开发