当前位置:网站首页>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=微服务名:端口号
边栏推荐
- C interview 24 (pointer) define a double array with 20 elements a
- 多学科融合
- 算法---比特位计数(Kotlin)
- MySQL(十)
- LM small programmable controller software (based on CoDeSys) Note 23: conversion of relative coordinates of servo motor operation (stepping motor) to absolute coordinates
- POI导出Excel:设置字体、颜色、行高自适应、列宽自适应、锁住单元格、合并单元格...
- Can't you really do it when you are 35 years old?
- Leetcode T1165: 日志分析
- [start from scratch] detailed process of deploying yolov5 in win10 system (CPU, no GPU)
- 面试中有哪些经典的数据库问题?
猜你喜欢

精准时空行程流调系统—基于UWB超高精度定位系统

MYSQL----导入导出&视图&索引&执行计划

Ha Qu projection dark horse posture, only half a year to break through the 1000 yuan projector market!

联合索引ABC的几种索引利用情况

途家、木鸟、美团……民宿暑期战事将起

ICML 2022 | explore the best architecture and training method of language model

学术报告系列(六) - Autonomous Driving on the journey to full autonomy

2022 Android interview essential knowledge points, a comprehensive summary

服装门店如何盈利?

华为机试题素数伴侣
随机推荐
MySQL的安装
Matlab / envi principal component analysis implementation and result analysis
What books can greatly improve programming ideas and abilities?
How to install swoole under window
JWT certification
网络基础 —— 报头、封装和解包
Postgresql源码(60)事务系统总结
dolphinscheduler3.x本地启动
LM11丨重构K线构建择时交易策略
Force deduction 62 different paths (the number of all paths from the upper left to the lower right of the matrix) (dynamic planning)
SolidWorks的GB库(钢型材库,包括铝型材、铝管等结构)安装及使用教程(生成铝型材为例)
[start from scratch] detailed process of deploying yolov5 in win10 system (CPU, no GPU)
当前发布的SKU(销售规格)信息中包含疑似与宝贝无关的字
ViewModelProvider.of 过时方法解决
Unable to debug screen program with serial port
mobx 知识点集合案例(快速入门)
MOS管参数μCox得到的一种方法
HKUST & MsrA new research: on image to image conversion, fine tuning is all you need
MySQL installation
Abnova 免疫组化服务解决方案