前面我们搭建了一个基于Github的配置中心,服务在启动的时候从Config组件获取资源,那假如我希望在程序运行期动态修改参数怎么办呢?这一节我们就来探讨一下参数动态刷新机制。
话说我们斧头帮的小弟们都比较放飞自我,自打获取到配置文件之后就再也不管了,任凭文件内容怎么修改也不会同步到本地,除非重启应用服务器。这还了得,帮主的话只能听一次?一点面子也不给。
配置文件动态刷新 - 图1
图片来自电影《羞羞的铁拳》,版权归原作者所有
喂!帮主喊你回家刷新属性!

动态刷新

斧头帮决定来一次整风运动,调动小弟们的积极性,要做到帮主随叫随到(是帮主叫你,不是他自己随叫随到),我们来看看怎么推广。
配置文件动态刷新 - 图2
很简单,这个过程分3个步骤进行:

  1. 发送刷新请求 我们选定一个服务节点,通过POST请求访问节点下的/actuator/refresh路径,这时节点会发送一个刷新请求到Config服务器
  2. 拉取文件 Config服务器会访问Github获取最新的内容,并把配置信息文件下载到本地
  3. 获取更新内容 接着服务节点从Config那里拿到变更内容,并将变动的属性配置到各个类中。

在第三步骤里还有个小前提,假如一个类中有需要进行运行期替换操作的属性,那就要把@RefreshScope注解加到这个类上,这样运行期参数修改才会在这个类上面生效。
在上面那个case里,“/actuator/refresh”就像帮主发给小弟的对讲机,只要一声令下就得前来报到。但是要使用这个对讲机还得先了解一下它的配置。

什么是Actuator

Actuator是一个轻巧的监控组件,通过REST接口的方式可以供外部调用,访问服务节点下的“/actuator”路径可以查看当前开放的服务。
Actuator也是一个相当贴心的组件,当你引入Spring Cloud的其他组件依赖到pom中以后(比如Config或BUS),这部分组件会通过Actuator Endpoint将自己的核心服务提供出去(比如Config和BUS的refresh功能)。
假如同学们访问“/actuator”后只能看到health和info这两个服务,那是因为Actuator的服务包含很多“机密”信息,为了安全考虑,默认只暴露几个无关痛痒的接口。我们可以通过改动默认配置项让它暴露指定的接口,为了方便演示,本课程中我们采用以下配置让Actuator暴露所有服务,这样你就可以通过“/actuator”路径查看当前可用的服务了。

  1. management.endpoints.web.exposure.include=*

老师这里还想给大家布置一个小任务,锻炼一下大家的文档阅读能力。很多新开源项目的第一手资料就是来自开源团队,如果你恰巧应用了一些cutting edge的新技术到项目中,就需要直接从官方文档入手,碰到棘手的问题甚至需要直接寻求社区的帮助,这就需要一定的英文文档阅读能力。接下来,希望大家能拿Actuator这个精巧的小组件入手,尝试从下面这个官方文档了解它的功能: https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/actuator-api//html/

小结

这一节讲了如何在运行期动态获取参数,接下来我们一起动手搭建一个demo。
学习Tips:很多大厂对开源项目都有深度定制,比如阿里甚至会对JDK大动手脚(原生jdk的某些功能有性能瓶颈,即便对其做微小的性能调优,在电商场景的巨大流量加持下也能转化为可观的收益),如果同学们有机会接触到这类项目,不妨了解一下他们做了哪些定制,解决了什么问题,为何原生组件无法满足需求,这对我们技术能力的提升也是有帮助的。