【Springcloud】(10)Bus消息总线
(1)消息总线是什么?配置中心动态刷新的问题和分析
(1)可否广播,一次通知,处处生效
消息总线bus就是广播型的自动版的动态刷新,可以实现差异管理,全自动的动态刷新。让config和bus配合,可以实现配置的动态刷新,强强联合
(2)Bus是什么?
只支持RabbitMQ和Kafka,如果用Alibaba支持Rocketive
(3)能干嘛?
(4)什么是总线?
在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个公用的消息主题(类似于订阅号),并让系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线,在总线上的各个实例,都可以方便地广播一些需要让其他链接在该主题上的实例都知道的消息
(5)基本原理
ConfigClient实例都监听MQ中同一个topic(默认是SpringCloudBus),当一个服务刷新数据的时候,它会把这个信息放入到topic中,这样其他监听同一个Topic的服务就能得到通知,然后去更新自身的配置
(2)RabbitMQ环境配置
(1)安装RabbitMQ的环境
(3)Bus动态刷新全局广播的设计、动态刷新全局广播配置实现
(1)设计思想
有两种方式实现消息总线
1)通知一个客户端:利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置
这种方式并不合适,原因如下:
1-打破了微服务的职责单一性,因为微服务本身就是业务模块,本不应该承担配置刷新的职责
2-破坏了微服务各节点的对等性
3-有一定的局限性。例如:微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动摔性能,那就会增加更多的修改
2)通知一个服务端:利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置
(2)第一步:照着3355的模板再创建一个3366子模块,并且修改pom
<dependencies>
<!--添加消息总线RabbitMQ支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<!--config配置中心client端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--表示把这个模块注册到注册中心里去-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<!--引入自己定义的API通用包,可以使用Payment支付的Entity-->
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!--devtools-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
(3)第二步:修改yml文件
server:
port: 3366
spring:
application:
name: config-client
cloud:
# config客户端配置
config:
label: master # 分支名称
name: config # 配置文件名称
profile: dev # 读取后缀名称
uri: http://localhost:3344 # 配置中心地址()先让3344拿到,然后3355到3344上去拿
#rabbitMQ相关配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
# 服务注册到eureka注册中心
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
#暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
(4)第三步:创建主启动类
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain3366 {
public static void main(String[] args) {
SpringApplication.run(ConfigClientMain3366.class,args);
}
}
(5)第四步:创建业务类
@RestController
@RefreshScope//实现动态刷新
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@Value("${server.port}")
private String configPort;
@GetMapping("/configInfo")
public String getConfigInfo(){
return "configInfo:"+configInfo+",configPort:"+configPort;
}
}
(6)第五步:给3344配置中心服务端添加消息总线的支持
修改pom,添加消息总线rabbitMQ支持
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
修改yml,添加rabbitMQ配置和端口暴露。rabbitMQ配置可以访问到rabbitMQ,端口暴露可以让运维工程师通过这个端口通知进行刷新
#rabbitMQ相关配置
rabbitmq:
host: localhost
port: 5672
username: guset
password: guest
#rabbitMQ相关配置,暴露bus刷新配置的端点
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
(7)第六步:给3355配置中心客户端添加消息总线的支持
修改pom,添加消息总线rabbitMQ支持
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
修改yml,添加rabbitMQ配置和端口暴露。rabbitMQ配置可以访问到rabbitMQ,端口暴露可以让运维工程师通过这个端口通知进行刷新
#rabbitMQ相关配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
#暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
(8)第七步:启动端口并且测试
依次启动7001注册中心,3344服务端,3355和3366两个客户端。
测试3344的地址:http://localhost:3344/config-dev.yml
测试3355的地址:http://localhost:3355/configInfo
测试3366的地址:http://localhost:3366/configInfo
(9)第八步:修改github上的内容,并且模拟运维人员发送post请求,然后再测试
修改github上的配置文件内容,12.5改成2,5,并且保存。
使用PostMan发送一个post请求:http://localhost:3344/actuator/bus-refresh,通知服务端进行刷新
刷新刚才的3344/3355/3366这三个测试页面,可以看到都已经刷新了。
(4)Bus动态刷新定点通知
不想全部通知,指向定点通知,也就是说只通知3355,不通知3366