前言
当微服务部署上线后,修改服务的配置是很常见的。如何做到在不重新编译,不重新部署,甚至不重启微服务的情况下,让修改立即生效?
Spring Cloud为我们提供了一个监控模块:Actuator。该模块提供了一系列监控服务状态的服务端点,包括info,health,env等等,我们可以使用这些端点查看服务的信息,健康状况,运行环境参数等。
这个模块还提供了一个refresh端点,它就是本文将要介绍的用于刷新配置信息的端点。本文将详细介绍如何使用Actuator,在不重启微服务的情况下刷新配置。
1. 为服务添加刷新配置功能
首先,在上一篇
实现的account-service服务的pom.xml中引入actuator依赖。如下:
org.springframework.boot spring-boot-starter-actuator
引入这个依赖后,Spring在启动时就会自动为我们暴露一个/actuator端点,但默认情况下,它只提供了/actuator/info和/actuator/health两个端点,并没有暴露/actuator/refresh端点。
因此我们需要在application.yml中打开refresh端点。如下:
management:endpoints:web:exposure:include:refresh
由于本文只会用到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注解,如下:
importorg.springframework.beans.factory.annotation.Value;importorg.springframework.cloud.context.config.annotation.RefreshScope;importorg.springframework.context.annotation.Configuration;@Configuration@RefreshScopepublicclassServiceConfig{@Value("${config.vendor}")privateStringvendor;@Value("${config.accountType.default}")privateStringaccountType;publicStringgetVendor(){returnvendor;}publicvoidsetVendor(Stringvendor){this.vendor=vendor;}publicStringgetAccountType(){returnaccountType;}publicvoidsetAccountType(StringaccountType){this.accountType=accountType;}}
由于ServiceConfig类中注入了配置文件里的配置项,如果不添加@RefreshScope注解,当调用/actuator/refresh时,这些项的值不会被刷新。
请记住: 所有注入了配置项的类,都需要添加@RefreshScope注解。
2. 测试
至此,我们已经完成了配置,可见是多么的简单。
现在我们来测试一下。
启动配置服务器config-server,启动account-service服务。
首先,我们检查一下配置文件account-service.yml中的各个配置项的值。如下:
spring.jpa.database:"MYSQL"spring.datasource.platform:"org.hibernate.dialect.MySQL55Dialect"spring.jpa.show_sql:"true"spring.database.driverClassName:"com.mysql.jdbc.Driver"spring.datasource.url:"jdbc:mysql://localhost:3306/msproject?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8"spring.datasource.username:"msproject"spring.datasource.password:"msproject"spring.datasource.testWhileIdle:"true"spring.jpa.hibernate.ddl-auto:"update"spring.jpa.properties.hibernate.dialect:"org.hibernate.dialect.MySQL55Dialect"config.vendor:"yglong.com"config.accountType.default:"administrator"
config.vendor的值为yglong.com,我们访问http://localhost:8082/v1/account/vendor端点看看返回:
返回值与配置文件一致。
现在我们修改配置文件account-service.yml,将config.vendor的值改为如下:
config.vendor: "example.yglong.com"
修改保存后,提交Github。
提交后,我们调用/actuator/refresh端点为服务刷新配置,注意请求为POST。如下:
/actuator/refresh端点会返回一个list,代表哪些配置项的值被刷新了。从上面的返回可以看出,spring检测到了config.vendor的值的变化,且为服务刷新了该配置项的值。
我们再次访问http://localhost:8082/v1/account/vendor:
可以看到,返回值与配置文件中的值一致。
除了修改自定义的配置项外,同理,我们也可以修改访问数据库相关的配置项,如数据库密码配置项spring.datasource.password。
我们尝试将访问数据库的密码修改为一个错误的密码,如下:
spring.datasource.password: "msproject111"
然后调用/actuator/refresh:
返回表示spring.datasource.password的值被成功刷新了。
现在,我们尝试访问http://localhost:8082/v1/account从数据库中获取所有账户信息:
可以看到,访问失败了,从返回的message可以看出,连接数据库失败了。因为我们将密码改成了错误的密码。
我们将密码改回正确的:
spring.datasource.password: "msproject"
再次刷新:
再次访问http://localhost:8082/v1/account:
成功返回所有账户信息。
可以看到,Actuator不仅支持自定义配置项的刷新,也支持Spring内置的配置项的刷新,如连接数据库相关的配置项,无需重启服务。
3. 总结
Spring Actuator提供了强大的服务监控功能,本文仅使用了其中的/actuator/refresh端点,演示了如何为服务动态刷新配置信息的功能。
使用Actuator实现动态刷新配置的功能非常简单,只需简单的几项配置即可完成。
(完)
新码农客栈
有趣的灵魂在等你
微信长按扫码可关注
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容