一、简介
Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来。它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控。本文要讲述的是用Spring Cloud Bus实现通知微服务架构的配置文件的更改。
本章案例 源码下载:链接: https://pan.baidu.com/s/1D9lW7b_Ht-ekVDli8KQtyQ 提取码: qcug
二、前期工作
本文还是基于上一篇文章来实现。按照官方文档,我们只需要在配置文件中配置 spring-cloud-starter-bus-amqp ;这就是说我们需要装rabbitMQ。
新机安装rabbitMQ之前,需要先安装Erlang,检查对应的系统环境变量ERLANG_HOME;之后安装rabbitMQ记得激活和启用服务,具体安装方式百度下,后面有时间再整。
需要注意:默认安装的RabbitMQ 监听端口是5672
三、改造config-client
在pom文件加上起步依赖spring-cloud-starter-bus-amqp,完整的配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.liujun</groupId>
<artifactId>config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>config-client</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<parent>
<groupId>com.liujun</groupId>
<artifactId>sc-finchley-demo8</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
在配置文件bootstrap.yml中加上RabbitMq的配置,包括RabbitMq的地址、端口,用户名、密码。并需要加上spring.cloud.bus的三个配置,具体如下:
server:
port: 8002
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: demo-config # 文件名(真实文件名即为:demo-config-XXX.properties)
cloud:
config:
profile: dev #文件模式(真实文件名即为:XXX-dev.properties)
discovery:
enabled: true
serviceId: config-server # 配置中心的服务名
bus:
enabled: true
trace:
enabled: true
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
management:
endpoints:
web:
exposure:
include: bus-refresh
ConfigClientApplication启动类加@RefreshScope代码如下:
@SpringBootApplication
@EnableEurekaClient
@RestController
@RefreshScope
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
@Value("${demoConfigV}")
String demoConfigV;
@RequestMapping(value = "/hi")
public String hi(){
return demoConfigV;
}
}
依次启动eureka-server、config-server或config-server-git、config-client。
访问 http://localhost:8002/hi, 显示:
这时我们去代码仓库将demoConfigV的值改为“10.0.2”,即改变配置文件demoConfigV的值。如果是传统的做法,需要重启服务,才能达到配置文件的更新。此时,我们只需要发送post请求:http://localhost:8002/actuator/bus-refresh,你会发现config-client会重新读取配置文件
这时我们再访问http://localhost:8002/hi ,显示:
当配置文件更改的时候,通过pc端用post 向端口为8002的config-client发送请求/bus/refresh/;此时80022端口会发送一个消息,由消息总线向其他服务传递,从而使整个微服务集群都达到更新配置文件。
四、拓展
/actuator/bus-refresh接口可以指定服务,即使用"destination"参数,比如 “/actuator/bus-refresh?destination=customers:**” 即刷新服务名为customers的所有服务。