文章目录
1. 概述
1.1 是什么
Bus支持两种消息代理: RabbitMQ 和Kafka
Spring Cloud Bus配合Spring Cloud Config使用可以实现配置的动态刷新
1.2 什么是总线
在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息。
1.3 基本原理
ConfigClient实例都监听MQ中同一个topic(默认是springCloudBus)。
当一个服务刷新数据自的时候,它会把这个信息放入到Topic中,这样其它监听同-Topic的服务就能得到通知,然后去更新自身的配置。
2. Springcloud Bus是什么能干嘛
2.1 两种设计思想
2.1.1 触发一个客户端
2.1.2 触发一个服务端
2.1.3 对比
-
触发服务端显然比客户端好
- 打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新职责
- 破坏了微服务各节点的对等性
- 有一定的局限性。
例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改
3. 动态刷新,全局广播
一处改动,处处生效,只要github上面的文件一改动,只需要刷新一下Config Server,就可以通知全部的客户端
使用configserver通知开始实现
3.1 服务端
第一步,maven配置
<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>
第二步 yml配置
server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
uri: git@github.com:Wang-QingLong/Springcloud-config.git
search-paths: #搜索路径,也就是你的仓库名字
- Springcloud-config
label: master #分支
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://admin:1234@eureka7001.com:7001/eureka/
#rabbitmq相关配置,暴露bus刷新配置的端点
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
3.2 客户端
1.第一步导入依赖
<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>
第二步改写yml 注意 yml是 bootstrap.yml
server:
port: 3355
spring:
application:
name: config-client
cloud:
config: #客户端配置
label: master #分支名称
name: config #配置文件名称
profile: dev #读取后缀名称
#上述综合: http://localhost:3344/master/config-dev
uri: http://localhost:3344
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://admin:1234@eureka7001.com:7001/eureka/
#暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
第三步:controller
@RefreshScope
@RestController
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/configInfo")
public String getConfigInfo(){
return configInfo;
}
}
3.3 修改配置
1.当github的yml修改时,只需要向服务总线configserver发送一个post请求即可
curl -X POST “http://localhost:3344/actuator/bus-refresh”
3.4 基本原理
ConfiqClient实例都监听MQ中同一个topic(默认是springCloudBus。
当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同-Topic的服务就能得到通知,然后去更新自身的配置。
动态刷新,定点刷新通知
效果: 不想全部通知,只想通知某个模块:比如只通知3366,不通知3355
简单一句话:
公式: http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}
/bus/refresh请求不再发送到具体的服务实列上,而是发给configserver并通过destination参数类
指定需要更新配置的服务或实列
destination 说白了就是 微服务模块名称+端口号
比如,举个列子,下面github上面做了修改,我只通过3366,不通知3355