当前位置:网站首页>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;![在这里插入图片描述](https://img-blog.csdnimg.cn/1bd0130034f44a7ca19f9923e72157e6.png#pic_center)

	@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=微服务名:端口号

原网站

版权声明
本文为[RB_VER]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_41242680/article/details/125632089