在前面文章基础上进行,请参考:
Spring Cloud config ------ 基础使用
Spring Cloud config ------ 认证和安全
一 动态更新
spring cloud config配置中心客户端,会去服务端进行请求配置。服务端及客户端启动后,在配置仓库中更改了客户端的配置后,客户端不会主动再次请求最新配置,而是使用缓存到本地的原来的配置信息,怎么才能使用更改后的配置?
方法一:
重启大法,重启服务后,可以得到最新配置,但线上环境一般不允许此操作。
方法二:
动态更新,客户端pom添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
客户端获取配置的类上添加@RefreshScope注解即可。
启动客户端,可以看到启动信息里已经暴露出actuator的health及info端点(默认只暴露出这两个),可在application.properties中配置如下暴露出所有actuator端点:
management.endpoints.web.exposure.include=*
再次启动,可以看到已经暴露出/actuator/refresh接口,修改配置仓库中的相关客户端的配置项,调用相关客户端实例的/actuator/refresh接口,就实现了不重启应用的配置热更新。注意:此种热更新和配置中心服务端没什么关系。
二 spring cloud bus优化动态更新
上面的缺点是:一般微服务实例会分布式部署的,服务实例会有多个,如果更改了客户端的某个配置,需要把客户端的/actuator/refresh接口挨个调用遍才可以,很显然是不合理的。
所以需要集成spring cloud bus进行优化,这里配置中心服务端就参与进来了。
服务端pom添加依赖(使用rabbitmq,也可以使用kafka,rabbitmq的安装自行百度)(无需添加actuator依赖):
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
application.properties里要配置相应的rabbitmq信息,如下:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
可以看到启动信息里暴露出了/actuator/bus-refresh端点,待会就是通过调用服务端的此接口进行客户端所有服务实例的配置动态更新。
客户端pom文件同样添加spring-cloud-starter-bus-amqp依赖,application.properties中同样添加rabbitmq配置信息。
到此为止,优化完毕。
例如config-client启动n个实例,配置仓库中改变了改服务的配置项,只需要调用配置中心服务端的一个实例的/actuator/bus-refresh即可,服务端会通知config-client所有服务端进行更新配置。同样,如果服务端是多实例,多个实例也会同步配置更改。
项目中,就无需关注客户端,只对服务端进行更新即可。
具体代码参考:github