当前位置:网站首页>Bus消息总线
Bus消息总线
2022-07-07 02:40:00 【RB_VER】
概述
Spring Cloud Bus配合spring cloud config使用可以实现配置的动态刷新。
spring cloud bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架。
它整合了Java的事件处理机制和消息中间件的功能。
Bus支持两种消息代理:RabbitMQ和Kafka。
spring cloud bus能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改,事件推送等,也可以当作微服务间的通信通道。
总线:在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以被它称为消息总线。在总线上的各个实例,都可以方便的广播一些需要让其他连接在该主题上的实例都知道的消息。
基本原理:config client实例都监听MQ中同一个topic(默认是SpringCloudBus)。当一个服务刷新数据的时候,它会把这个信息放入到topic中,这样其他监听同一个topic的服务就能得到通知,然后去更新自身配置。
spring cloud bus动态刷新全局广播
设计思想:
利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的位置
利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置。
第二种架构更为合理,第一种不合理的原因:
- 打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责。
- 破坏了微服务各节点的对等性。
- 有一定局限性。
创建cloud-config-center-3344模块作为配置中心服务端。
具体配置参见【微服务】整合spring cloud config。
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
...
application.yml
server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
uri: [email protected]:zzyybs/springcloud-config.git
search-paths:
- springcloud-config
label: master
rabbit:
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
需要先配置rabbitmq。
新建cloud-config-client-3366模块。
pom.xml依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
bootstrap.yml
server:
port: 3366
spring:
application:
name: config-client
cloud:
config:
label: master # 分支名称
name: config # 配置文件名称
profile: dev # 读取后缀名称 上述三个综合:master分支上config-dev.yml的配置文件
uri: http://localhost:3344 # 配置中心地址
rabbit:
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defautZone: http://localhost:7001/eureka
management: # 监控暴露端点
endpoints:
web:
exposure:
include: "*"
ConfigClientMain3366
@EnableEurekaClient
@SpringBootApplication
public class ConfigClientMain3366{
public static void main(String[] args) {
SpringApplication.run(ConfigClientMain3366.class,args);
}
}
@RestController
@RefreshScope
public class ConfigClientController{
@Value("${server.port}")
private String serverPort;
@Value("${config.info}")
private String configInfo;
@GetMapping("/configinfo")
public String configInfo() {
return "serverPort: "+serverPort+" configInfo: "+configInfo;
}
}
同理新建cloud-config-client-3355模块。
测试:
修改GitHub上配置文件增加版本号:
config:
info: "master branch,springcloud-config/config-dev.yml version=2"
发送post请求:
curl -X POST "http://localhost:3344/actuator/bus-refresh"
访问http://localhost:3366/configinfo,获取配置信息,发现都已经刷新了。
spring cloud bus动态刷新定点通知
是指具体某一个实例生效而不是全部。
http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}
destination=微服务名:端口号
边栏推荐
- docker-compose启动redis集群
- Common problems of caching in high concurrency scenarios
- 哈趣投影黑馬之姿,僅用半年强勢突圍千元投影儀市場!
- Postgresql源码(60)事务系统总结
- 7天零基础能考证HCIA吗?华为认证系统学习路线分享
- Wechat applet hides the progress bar component of the video tag
- 剑指offer-高质量的代码
- mobx 知识点集合案例(快速入门)
- C interview encryption program: input plaintext by keyboard, convert it into ciphertext through encryption program and output it to the screen.
- Tkinter window selects PCD file and displays point cloud (open3d)
猜你喜欢
Stack and queue-p79-9
使用TCP/IP四层模型进行网络传输的基本流程
多个kubernetes集群如何实现共享同一个存储
Matlab / envi principal component analysis implementation and result analysis
ANR 原理及实践
Installing redis and windows extension method under win system
服装门店如何盈利?
品牌·咨询标准化
数据资产管理与数据安全国内外最新趋势
RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling `cublasCreate(handle)`问题解决
随机推荐
Answer to the first stage of the assignment of "information security management and evaluation" of the higher vocational group of the 2018 Jiangsu Vocational College skills competition
2022/07/04学习记录
Abnova 体外转录 mRNA工作流程和加帽方法介绍
Install mongodb database
2022年全国所有A级景区数据(13604条)
Ha Qu projection dark horse posture, only half a year to break through the 1000 yuan projector market!
BindingException 异常(报错)处理
Ant manor safety helmet 7.8 ant manor answer
How can I check the DOI number of a foreign document?
AddressSanitizer 技术初体验
面试中有哪些经典的数据库问题?
POI export to excel: set font, color, row height adaptation, column width adaptation, lock cells, merge cells
Abnova循环肿瘤DNA丨全血分离,基因组DNA萃取分析
华为机试题素数伴侣
C interview encryption program: input plaintext by keyboard, convert it into ciphertext through encryption program and output it to the screen.
肿瘤免疫治疗研究丨ProSci LAG3抗体解决方案
学术报告系列(六) - Autonomous Driving on the journey to full autonomy
哈趣投影黑马之姿,仅用半年强势突围千元投影仪市场!
一文带你了解静态路由的特点、目的及配置基本功能示例
How to install swoole under window