mq实现配置下发
原理
spring-cloud-config-server本身不包含自动刷新的功能,这里借助spring-bus消息总线结合rabbitmq的方法实现。其中bus中提供了/bus/refresh接口,调用该接口可以配置下发的功能(其原理就是借助mq的订阅发布功能),当调用该接口时,会向rabbimtmq队列中发布一条Event,所有订阅了该对列的config client收到推送的后,重新拉取配置,从而实现配置的动态刷新。
1、提交配置触发post请求给server端的bus/refresh接口
2、server端接收到请求并发送给Spring Cloud Bus总线
3、Spring Cloud bus接到消息并通知给其它连接到总线的客户端
4、其它客户端接收到通知,请求Server端获取最新配置
5、全部客户端均获取到最新的配置
git hook配置
在git仓库的hooks目录新建一个post-receive文件,写入执行脚本。本例中核心动作为发送一个post请求
[root@sdp-nj-msb-1 hooks]# cat post-receive
curl -X POST http://config.cop.com:8070/bus/refresh
注意使用时配置ssh免密登录。
服务端实现
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
application配置
server:
port: 8070
spring:
rabbitmq:
password: guest
username: guest
port: 5672
host: rabbitmq.cop.com
application:
name: ms-config
config:
server:
git:
#uri: git@config.mscop.com:/home/git/gitRepository/mscop_config.git
uri: file://home/git/config
search-paths: config-spring/
timeout: 30
其中uri的配置可以配置git仓库的地址(如何配置为git仓库,则 config服务端则会使用jgit自动拉一份配置到/tmp目录中)不过这里可以使用的方法是在服务器/home/git/config目录使用git clone命令单独拉取一份配置,直接将uri配置为该目录即可。
启动类实现
@EnableConfigServer
@SpringBootApplication
public class App {
public static void main(String[] args) throws Exception {
SpringApplication springApplication = new SpringApplication(App.class);
springApplication.addListeners((ApplicationListener<RefreshScopeRefreshedEvent>) event -> {
System.out.println("-----finish refreshed now will go to next step--------");
});
springApplication.run(args);
}
}
客户端实现
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
bootstrap配置
配置rabbit以及confgi地址即可。
spring:
#应用名称
application:
name: ms
rabbitmq:
password: guest
username: guest
port: 5672
host: rabbitmq.cop.com
cloud:
config:
uri: http://config.cop.com:8070
最后使用时在需要动态刷新的配置所在的Bean中使用@RefreshScope注解即可,这样当配置下发时会销毁该bean重新创建,特别注意有些bean只有在springboot启动时扫描有效,如(EnableScheduling任务类),不可以在该类Bean上随意使用@RefreshScope,会导致定时任务失效。