统一配置中心简介
本文会带大家来了解Spring cloud config这个组件,首先,先带来一个问题。我们用这个组件的目的是什么呢?这么多人用,肯定是有原因的嘛。存在即合理。
一.为什么需要统一配置中心?
如果不使用统一配置中心,会带来很多问题,比如:
1.不方便维护
假如一个服务,由多人开发,其中a在开发的时候,修改了配置,b来开发的时候,需要测试别的一些功能,这个时候配置文件已经被a修改得面目全非了,这就造成了冲突。
2.配置内容的安全与权限
公司项目线上的配置基本是不对开发公开的,特别是数据库的账号密码这种,基本是只有运维才知道,把配置放在项目里面的话,每个开发人员都能看到,这种情况就需要对配置文件进行隔离。
3.更新配置项目需要重启
线上更新配置是经常发生的事情,比如更新一点小小的配置,难道都需要重启吗?使用spring cloud config就可以解决这一点。
二、如何搭建统一配置中心
配置中心到时候也会作为一个服务,这些配置,为了方便管理,我们都把它放到git上,使用git控制起来会比较方便。如下图所示:(说明:箭头代表数据流动的方向)
最开始呢,我们是把配置放在远端的git,如gitlab,github或者自己搭建的私服。config-server把配置从远端git拉下来之后,放到本地git。config-server与本地git之间是双向流动的。既会把远端的git放到本地中,假如远端git不能访问了,也会从本地git把配置拉出来,拿到配置之后,就可以给微服务来使用。product和order这两个服务,需要集成config-client这个组件。这就是统一配置中心整体的架构。
Config Server
步骤:
第一步:新建一个服务, 勾选Config Server
第二步: 做Eureka的配置(不包括下图, 具体看前面的文章)
第三步: 让它成为一个configServer端, 主方法加上@EnableConfigServer
此时启动会报错:
第四步: 因为配置文件会从git上读取,所以我们先去git上建一个项目
第五步: 创建之后, 把order的yml文件放进来
配置文件里面指定env为环境
第六步: 复制好仓库的地址后,在config服务里面配置好uri(此处是git上的地址和账号密码)
然后发现放在git上的配置文件已经可以访问了~
Config Client
步骤
第一步:导入依赖(启动类不用加注解)
第二步: 写config相关的配置
由于其他配置都放到git上了,因此可以删掉
我们发现运行后报错了:数据库连接失败
原因是本地服务从配置文件中指示去git找配置文件,但是配置文件却还没加载到本地git,因此出现这种情况
处理办法:将order服务的配置文件更名为bootstrap.yml
配置中心的高可用
因为本来就是一个微服务,因此直接把多个config的服务端往Eureka上注册就好
注意
- 在config的Client端, 如order服务, 关于Eureka的配置也应该放在本地而不是git上, 否则会读不到
把Eureka的配置放到order服务配置文件里面来, 这样他就会先去找这个地址, 然后再找config上的配置 - 配置中心在加载配置的时候, 除了加载order-test.yml这个配置文件, 还会加载order.yml, 将它们合起来
那我们就可以将通用的配置放到order.yml中, 这样可以避免所有环境都写相同的配置 - 我们发现, 要想配置生效还是得重启服务才行, 这就与最开始使用配置中心的初心相悖, 想要做到动态的配置刷新, 就需要用到后面的内容: SpringCloud Bus~
自动刷新配置—SpringCloud Bus
Bus这个词, 除了公交车的意思外, 还有信息通路, 总线, 在这里的意思就是"总线";
原理:
configServer会从远端git上拉取配置文件, 并在本地git存一份, 同时提供对外的配置服务
这里要注意: order这个服务在启动的时候, 访问configServer读取配置, 启动后修改git的配置, order服务这边的配置是不会变化的, 以为压根没人通知order服务, 因此, 自动刷新配置的关键点就是: 如何在修改了配置以后, configServer能通知到order这个服务
要实现这种通知, 我们需要一个载体—消息队列
常见的消息队列有很多, RabbitMQ, RocketMQ, kafka, ActiveMQ等, 我们此处用RabbitMQ
SpringCloud Bus就是来操作消息队列的组件
config-server和order服务通过消息队列来传递信息,
config-Server使用了bus之后, 会对外提供一个HTTP接口, 叫做"/bus-refresh"
使用这个接口, configServer就会把跟新配置的消息放入RabbitMQ, 这个接口由远端git访问
步骤
第一步: 在config的服务里引入依赖
启动成功后, RabbitMQ这边会有一个Bus创建的队列
第二步: 在oeder服务这边引入bus依赖
启动成功后, RabbitMQ这边又会有一个Bus创建的队列
第三步: 修改git上的配置
当然, 现在我们去项目刷新, 当然配置是没改的
现在消息队列已经准备好了, 这两个应用也分别跟消息队列打通了, 还差访问HTTP的接口
第三步: 访问bus-refresh接口
- 首先要将configServer服务的所有接口暴露出来, 当中包括bus-refresh
大坑: 远程git访问接口后, 两边都刷新了, 但是用的配置仍是以前的
解决办法:
需要在使用远程配置的地方加上一个注解: @RefreshScope
现在, 就可以实现, 修改git上的配置, 不用重启项目了~~
@RefreshScope使用实例
- 在order-test.yml里面配置关于girl的信息
- 新建一个配置类, 用于指向配置文件中的girl, 打上@RefreshScope注解 3. 在控制层输出配置文件里面girl的信息
然后, 当git上的配置文件修改后, 访问config的bus-refresh接口, 就可以不启动也能刷新girl的信息了
集成WebHook实现自动刷新
在git上使用WebHook
WebHook集成好之后,提交之后,就可以实现自动刷新配置!