前言
当微服务部署上线后,修改服务的配置是很常见的。如何做到在不重新编译,不重新部署,甚至不重启微服务的情况下,让修改立即生效?
Spring Cloud为我们提供了一个监控模块:Actuator。该模块提供了一系列监控服务状态的服务端点,包括info,health,env等等,我们可以使用这些端点查看服务的信息,健康状况,运行环境参数等。
这个模块还提供了一个refresh端点,它就是本文将要介绍的用于刷新配置信息的端点。本文将详细介绍如何使用Actuator,在不重启微服务的情况下刷新配置。
1. 为服务添加刷新配置功能
首先,在上一篇
《深入浅出Spring Cloud系列》:Spring Cloud Config (2) - 获取服务配置信息mp.weixin.qq.com![54484b3a695ec909857940025c13d72e.png](https://img-blog.csdnimg.cn/img_convert/54484b3a695ec909857940025c13d72e.png)
实现的account-service服务的pom.xml中引入actuator依赖。如下:
<dependency>
引入这个依赖后,Spring在启动时就会自动为我们暴露一个/actuator端点,但默认情况下,它只提供了/actuator/info和/actuator/health两个端点,并没有暴露/actuator/refresh端点。
因此我们需要在application.yml中打开refresh端点。如下:
management
由于本文只会用到refresh端点,因此上面的配置中,我只开启了refresh端点。
当然,你也可以为actuator开启所有端点,只需要将refresh改为*,匹配所有即可。如下:
management:
endpoints:
web:
exposure:
include: "*"
我们也可以选择开启部分端点,可以像下面这样,指定具体的端点名称,以逗号分隔:
management:
endpoints:
web:
exposure:
include: info, health, refresh, env
要想知道Actuator具体支持哪些端点,你可以查阅Spring官方文档。
当然还有一个办法,可以将所有端点全部开启,然后启动服务,访问http://localhost:8082/actuator端点来查看,它将返回所有支持的服务端点。
配置好pom.xml后,我们还需要在代码中添加一项配置。即在ServiceConfig类上添加@RefreshScope注解,如下:
import
由于ServiceConfig类中注入了配置文件里的配置项,如果不添加@RefreshScope注解,当调用/actuator/refresh时,这些项的值不会被刷新。
请记住: 所有注入了配置项的类,都需要添加@RefreshScope注解。
2. 测试
至此,我们已经完成了配置,可见是多么的简单。
现在我们来测试一下。
启动配置服务器config-server,启动account-service服务。
首先,我们检查一下配置文件account-service.yml中的各个配置项的值。如下:
spring.jpa.database
config.vendor的值为“yglong.com”,我们访问http://localhost:8082/v1/account/vendor端点看看返回:
![2ae1fced24a65800b063226d5685adf8.png](https://img-blog.csdnimg.cn/img_convert/2ae1fced24a65800b063226d5685adf8.png)
返回值与配置文件一致。
现在我们修改配置文件account-service.yml,将config.vendor的值改为如下:
config.vendor: "example.yglong.com"
修改保存后,提交Github。
提交后,我们调用/actuator/refresh端点为服务刷新配置,注意请求为POST。如下:
![b58b9e8b8693a8f4b42304a8a68e52ad.png](https://img-blog.csdnimg.cn/img_convert/b58b9e8b8693a8f4b42304a8a68e52ad.png)
/actuator/refresh端点会返回一个list,代表哪些配置项的值被刷新了。从上面的返回可以看出,spring检测到了config.vendor的值的变化,且为服务刷新了该配置项的值。
我们再次访问http://localhost:8082/v1/account/vendor:
![77e99c082ea635549239d79f968f4c17.png](https://img-blog.csdnimg.cn/img_convert/77e99c082ea635549239d79f968f4c17.png)
可以看到,返回值与配置文件中的值一致。
除了修改自定义的配置项外,同理,我们也可以修改访问数据库相关的配置项,如数据库密码配置项spring.datasource.password。
我们尝试将访问数据库的密码修改为一个错误的密码,如下:
spring.datasource.password: "msproject111"
然后调用/actuator/refresh:
![6406f4734d65658915e299e7f9a74936.png](https://img-blog.csdnimg.cn/img_convert/6406f4734d65658915e299e7f9a74936.png)
返回表示spring.datasource.password的值被成功刷新了。
现在,我们尝试访问http://localhost:8082/v1/account从数据库中获取所有账户信息:
![3fcd8e293a409581ff943c6da4c512ff.png](https://img-blog.csdnimg.cn/img_convert/3fcd8e293a409581ff943c6da4c512ff.png)
可以看到,访问失败了,从返回的message可以看出,连接数据库失败了。因为我们将密码改成了错误的密码。
我们将密码改回正确的:
spring.datasource.password: "msproject"
再次刷新:
![6406f4734d65658915e299e7f9a74936.png](https://img-blog.csdnimg.cn/img_convert/6406f4734d65658915e299e7f9a74936.png)
再次访问http://localhost:8082/v1/account:
![5b65755de1ef4932eaabedd60fddae37.png](https://img-blog.csdnimg.cn/img_convert/5b65755de1ef4932eaabedd60fddae37.png)
成功返回所有账户信息。
可以看到,Actuator不仅支持自定义配置项的刷新,也支持Spring内置的配置项的刷新,如连接数据库相关的配置项,无需重启服务。
3. 总结
Spring Actuator提供了强大的服务监控功能,本文仅使用了其中的/actuator/refresh端点,演示了如何为服务动态刷新配置信息的功能。
使用Actuator实现动态刷新配置的功能非常简单,只需简单的几项配置即可完成。
(完)
![ba323af3dba4617797a17b15a14a01cd.png](https://img-blog.csdnimg.cn/img_convert/ba323af3dba4617797a17b15a14a01cd.png)
新码农客栈
有趣的灵魂在等你
微信长按扫码可关注