1.开篇
微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题。
SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
SpringCloud Config分为服务端和客户端两部分。
服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。
服务配置Config能干嘛?
· 不同环境有着不同配置,比如:dev、test、prod、beta、release等,需要动态化的配置更新。
· 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息。
· 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置。
· 将配置信息以REST接口的形式暴露。
2.项目源码
github源码地址:https://github.com/2656307671/SpringCloud-Hoxton-Config
gitee源码地址:https://gitee.com/szh-forever-young/SpringCloud-Hoxton-Config
具体步骤如下:👇👇👇
首先,我这里考虑到访问github是外网,有的时候比较慢,所以我使用gitee来做模拟。其实效果都是一样的。
在github/gitee上创建一个仓库,然后向仓库中添加几个文件(使用git命令)。添加内容参考:https://gitee.com/szh-forever-young/springcloud-config
这里不再说git命令了,可以参考我的分栏:https://blog.csdn.net/weixin_43823808/category_11047727.html
2.1 Config服务端配置与测试
对应的是源码中的 cloud-config-center-3344 模块,大家可以自行查看。
有关配置细节如下:👇👇👇
其中,label是分支,application是配置文件前缀名,profile是配置文件后缀名。
也就是说,先启动7001,再启动 cloud-config-center-3344 微服务模块测试,测试url:http://localhost:3344/master/config-dev.yml
这里根据该模块的application.yml配置文件中找到gitee中的springcloud-config仓库,master分支,config-dev.yml文件,读取其中的内容。
2.2 Config客户端配置与测试(动态刷新)
对应的是源码中的 cloud-config-client-3355 模块,大家可以自行查看。
先启动7001,再启动 3344,最后启动 3355。
测试url:http://localhost:3355/configInfo,这里直接通过controller中的请求路径访问。此时是可以正常访问拿到数据的,但是有一个问题:当前我们启动了7001、3344、3355,如果说我们修改了配置文件config-dev中的内容,将版本号修改了,那么此时3344是可以直接刷新拿到最新的数据,因为它是直接和gitee仓库相连的;但是3355经过测试是无法拿到最新数据的,只能通过重启3355微服务才可以。这就很麻烦了,难道修改一次就要重启一次吗?后面的微服务会越来越多,重启肯定耗费资源时间。
解决方法如下:👇👇👇
首先在3355的pom中添加 actuator 起步依赖。
其次在yml中添加内容暴露监控端口:
management:
endpoints:
web:
exposure:
include: "*"
在业务类controller上方添加 @RefreshScope 注解,支持动态刷新。
以上三步完成之后,我们重启3355微服务,然后将gitee仓库中的config-dev文件做个小修改。
3344可以正常拿到最新的数据。
此时,需要使用curl命令来为3355进行一次动态刷新,即可拿到最新的数据。
这里可以看到3344Config服务端、3355Config客户端都已经实现了动态刷新拿到最新的数据。
但是还是存在问题的,这里只有3355这一个Config客户端,如果有多个呢?每个微服务都要执行一次curl -X POST请求,这样手动刷新岂不是耗时耗力。可不可以广播、一次通知、处处生效呢?答案是当然可以,我在下一篇文章:Bus服务总线中再说。