SpringCloud Bus消息总线
分布式自动刷新配置功能
Bus支持两种消息代理:RabbitMQ和Kafka
在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实力监听和消费,所以称它为消息总线。在总线上的各个势力,都可以方便的广播一些需要让其他连接在该主题上的实例都知道的消息
打开RabbitMQ,成功即可
SpringCloud Bus动态刷新全局广播
再建一个3366,和3355一样,这里巩固一下
写pom
<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>
<!--自定义的api包-->
<dependency>
<groupId>com.huangyy.cloud2021</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
写bootstrap.yml
server:
port: 3366
spring:
application:
name: config-client
cloud:
config:
label: main #分支名称
name: config #配置文件名称,如config-dev.yml的config
profile: dev #配置文件后缀名称,如config-dev.yml的dev
uri: http://localhost:3344 #配置中心地址
#综上http://config-3344.com:3344/main/config-dev.yml
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka
#暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
controller,将3355的也改为这样,方便看端口号
@RestController
@RefreshScope
public class ConfigClientController {
@Value("${server.port}")
private String serverPort;
@Value("${config.info}")
private String configInfo;
@GetMapping("/configInfo")
public String getConfigInfo(){
return "serverPort:"+serverPort+"\t\n\nconfigInfo:"+configInfo;
}
}
设计思想:
- 利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置
- 利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置
- 第二个设计明显更合适
给3344,3355,3366添加总线RabbitMQ的支持
3344:
写pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
yml:
# rabbitmq的配置spring.rabbitmq
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
#rabbitmq相关配置,暴露bus刷新配置的端点
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
3355、3366
写pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
yml
# rabbitmq的配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
此时,修改github中的数据,只需要POST3344即可curl -X POST "http://config-3344.com:3344/actuator/bus-refresh"
定点通知配置
不想全部通知,只通知3355curl -X POST "http://config-3344.com:3344/actuator/bus-refresh/config-client:3355"