当前位置:网站首页>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=微服务名:端口号
边栏推荐
- SolidWorks的GB库(钢型材库,包括铝型材、铝管等结构)安装及使用教程(生成铝型材为例)
- Stack and queue-p78-8 [2011 unified examination true question]
- ViewModelProvider.of 过时方法解决
- 一文带你了解静态路由的特点、目的及配置基本功能示例
- 7天零基础能考证HCIA吗?华为认证系统学习路线分享
- Google Chrome browser released patch 103.0.5060.114 to fix the 0-day vulnerability
- Which foreign language periodicals are famous in geology?
- How to use wechat cloud hosting or cloud functions for cloud development of unapp development applet
- 分布式id解决方案
- Apache ab 压力测试
猜你喜欢

Jmeter 5.5版本发布说明

快速定量,Abbkine 蛋白质定量试剂盒BCA法来了!

面试中有哪些经典的数据库问题?

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

Learning notes | data Xiaobai uses dataease to make a large data screen

The difference between string constants and string objects when allocating memory

unity3d学习笔记

Go straight to the 2022ecdc fluorite cloud Developer Conference: work with thousands of industries to accelerate intelligent upgrading

Linear algebra (1)

循环肿瘤细胞——Abnova 解决方案来啦
随机推荐
POI export to excel: set font, color, row height adaptation, column width adaptation, lock cells, merge cells
POI导出Excel:设置字体、颜色、行高自适应、列宽自适应、锁住单元格、合并单元格...
程序员的日常 | 每日趣闻
循环肿瘤细胞——Abnova 解决方案来啦
Navicat importing 15g data reports an error [2013 - lost connection to MySQL server during query] [1153: got a packet bigger]
场馆怎么做体育培训?
ANR 原理及实践
偏执的非合格公司
RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling `cublasCreate(handle)`问题解决
使用net core优势/为什么使用
二十岁的我4面拿到字节跳动offer,至今不敢相信
如何给目标机器人建模并仿真【数学/控制意义】
如何解决数据库插入数据显示SQLSTATE[HY000]: General error: 1364 Field ‘xxxxx‘ doesn‘t have a default value错误
Abnova 免疫组化服务解决方案
化工园区危化品企业安全风险智能化管控平台建设四大目标
Crudini profile editing tool
docker-compose启动redis集群
MYSQL binlog相关命令
unity3d学习笔记
哈趣投影黑马之姿,仅用半年强势突围千元投影仪市场!