目前的confit-client只有在启动的时候,才回去config-server获取配置,不太方便,现在进行改造,实现项目运行时刷新配置。
有两种方式,单个客户端刷新和多个客户端同时刷新,继续使用之前的工程。
一.单个客户端刷新
1.在config-client工程中增加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> |
---|
2. 在需要刷新配置的类上,使用注解:@RefreshScope
3. 在config-client的配置文件中,加入:
#关闭鉴权,这样才能post请求访问 当前项目/refresh 接口的时候更新配置文件,否则需要Authorization头 management.security.enabled=false |
---|
4. 现在启动config-server和config-client,调用config-client的接口,获取到的值如下:
现在不停止项目,在git中修改配置文件:
然后使用post请求,调用http://localhost:8881/refresh接口,刷新配置文件:
再次调用config-client的同一个接口,可以发现配置已经刷新:
但此方式有个问题,就是如果有很多个客户端,比如分布在不同机器上的服务,那么需要每个客户端都调用一次refresh接口,不方便,于是可以使用 spring cloud bus 进行改造,实现只需要调用任一客户端的接口一次,便刷新所有客户端的配置。
二. 使用spring cloud bus + rabbitmq 实现多个客户端刷新
1.新建一个工程config-client2,和config-client仅端口号不同,用于在本机模拟多个客户端的情况。
2.在config-client 和 config-client2中增加依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> |
---|
3.安装rabbitmq并运行,具体步骤百度即可。我这里使用的rabbitmq的docker镜像。rabbitmq的作用是调用某一客户端的刷新接口后,发送消息通知spring cloud bus,然后spring cloud bus通知其他客户端刷新配置。
4.在config-client 和 config-client2的配置中,增加关于rabbitmq的配置:
#使用rabitMQ结合spring-cloud-bus,更新所有客户端配置 spring.rabbitmq.host=192.168.110.128 spring.rabbitmq.port=5672 |
---|
5. 此时启动config-client 和 config-client2,会在日志中出现下图,表明可以通过post方式请求/bus/refresh接口更新配置:
6.此时,分别调用config-client 和 config-client2的接口,获取的内容如下:
7.然后修改git中的配置文件:
8.使用post方式请求任一客户端的/bus/refresh接口,就会更新所有客户端的配置:
9.分别调用config-client 和 config-client2的接口,都获取到了最新的配置:
10.同时,也可以使用 /refresh来仅仅刷新单个客户端的配置。
至此,完成了刷新多个客户端的功能。