前面我们一起交流了Apollo配置中心的基本原理以及各种环境的搭建,今天我们进行springboot整合Apollo实现集中化配置、自动化更新
应用场景
任何没有业务应用场景的技术都是纸上谈兵,先说说应用场景
随着现在微服务技术越来越火爆热门,越来越普及,当单体服务升级为集群或者微服务的时候,服务变多变复杂,相关的配置也会呈几何倍数增长
拿springboot举例,我们开发环境的时候,数据库参数、缓存各种参数都写在application配置文件中,测试、生产环境通过启动参数-Dspring.datasource....之类的进行指定。或者有些通过application-env配置文件进行不同环境的不同参数进行配置,在启动的时候指定当前运行环境-Dspring.profile.active=dev等。但是服务变多以后,配置参数的检查,更新将会是一个灾难性的场景,而且还不支持配置参数的热更新,修改参数后必须重新打包、重启应用。
所以在这种情况下,配置中心这种中间件应运而生,目前主流的有携程的Apollo、netflux的config、ali的nacos,今天我们主要讨论Apollo
应用整合
首先创建一个springboot应用,具体创建过程不是本文重点(略)
整合改造过程
1.修改pom添加Apollo依赖,以支持Apollo配置中心
<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.4.0</version> </dependency>
2.填写Apollo信息配置
# 项目名称
app.id=${spring.application.name}
# Apollo配置中心地址
apollo.meta=http://localhost:8080
# 是否开启spring参数自动更新
apollo.autoUpdateInjectedSpringProperties=true
3.启动类上面添加注解
在启动类上加上apollo开启注解@EnableApolloConfig
4.创建配置项
项目改造完成以后,打开浏览器输入apollo控制台地址进行配置的管理
创建一个和刚才创建的应用同名的应用(配置中的spring.application.name),然后在里面新增一个配置(因为8080端口被apollo占用,所以增加一个服务绑定端口的配置)
test=9995
server.port=8085
然后在springboot中创建一个controller
@RestController public class HelloController { @Value("${test}") private String test; @GetMapping("hello") public Object say() { System.out.println(res); return "hello " + test; } }
5.启动程序,进行测试
启动程序后,打开浏览器访问http://localhost:8085/hello即可看到页面上显示的“hello 9995”
当我们在apollo上对这个参数进行修改test=555并发布后,再访问http://localhost:8085/hello即可看到页面上显示的“hello 555”
这样就实现了服务的集中化配置,以及自动化热更新
apollo集群配置
Apollo配置中心的四个维度其中有一个集群,默认都是没有配置集群的(default),如果有需要,可以这样添加
1.Apollo配置中心新增一个集群
打开Apollo控制台,进入项目,在界面左下方找到添加集群按钮并点击
然后在添加集群页面输入集群名称(我这里用的shanghai),勾选所要生效的环境确定即可
2.在springboot项目中使用
springboot中如果不指定集群配置,即使用默认的集群default,如果需要使用新的集群,可在配置文件或者启动参数中加这个配置
apollo.cluster=shanghai
最后再在shanghai这个集群中添加一些配置并发布,比如
test=8888 server.port=8003
再重启springboot即可看到服务端口变为8003,再打开浏览器访问http://localhost:8085/hello即可看到页面上显示的“hello 8888”
多环境配置
springboot使用Apollo配置中心的多环境配置时有些特殊
并不是通过指定某个env等于dev或者test来确定,而是指定apollo.meta=http://1111111:8080,这个地址为apollo配置中心对应环境的eurka地址
比如以上篇文章的环境为例,要使用dev环境就配置apollo.meta=http://localhost:8081,要使用uat环境就配置apollo.meta=http://localhost:8083
这里我们使用sit环境
apollo.meta=http://localhost:8082
springboot中配置好后,再在apollo的sit环境中添加相应配置并发布,然后重启springboot即可看到配置已生效
多namespace配置
在apollo配置中心里多namespace配置在项目配置界面左下角点击添加namespace按钮,然后在添加页面选择创建namespace,然后输入名称确定即可在项目配置页面看到新建的namespace空间
在这个空间里添加自己的配置
在springboot中指定项目所使用的命名空间稍微有点不同,这里支持同时配置多个namespace,多个用英文逗号隔开
apollo.bootstrap.namespaces=application,datasources,pay.yml
PS1:这里需要注意的是,如果这多个namespace中包含相同的配置,那么以配置靠前的namespace中的配置为准
PS2:如果apollo中添加的namespace配置格式为yml等非properties的时候,springboot中配置应该带上.后缀名,比如我的pay.yml
然后在各个环境中添加好相应的配置并发布,再重启springboot即可看到多namespace的配置已生效
几点个人建议
首先对于四个维度app,env,cluster,namespace的应用
application,即项目,每个springboot项目都要设置自己的名称spring.application,name,然后apollo配置中心中创建的项目名称尽量要和springboot的项目名称相同,这样在配置中指定app.id=${spring.appcation.name}即可,人员排查配置问题的时候也方便检查,其实重点就是人员肉眼观察起来方便,可读性强
env,环境,这个和springboot的env稍微有点差别,建议根据自己公司情况设置3-5个环境,自己公司有几个运行环境,springboot就配置几套配置文件(application-dev.yml,application-sit.yml....) apollo配置中心也相应的配置几个不同的环境(dev、sit....),在application-dev.yml中配置apollo.meta=http://apollo.dev.meta:8080,在application-sit.yml中配置apollo.meta=http://apollo.sit.meta:8080,这样来指定不同环境所读取的apollo配置
cluster,集群,这个配置可以根据自己项目实际,进行添加配置,目前中小型公司用到的不多,个人觉得作用不是很大,几乎可以忽略。但是在开发dev环境的时候倒是可以用一下,因为开发过程中,我们很多开发人员喜欢自己用自己单独部署的数据库或者其他配置信息,这样在启动参数中添加会很麻烦,改配置文件也涉及到代码提交分支切换等会很麻烦,可以考虑开发人员根据自己实际,在dev环境下新建一个属于自己专属的cluster,启动参数中专门指定自己dev模式下读取的cluster为自己专属的集群即可,-Dapollo.cluster=my-name,这样可以避免启动参数过于复杂以及配置文件有修改变动导致代码提交不方便
namespace,命名空间,这个配置是区分项目中不同类型的配置进行归类存放的,比如数据库信息的配置可以创建一个namespace名称为datasource在里面存放,缓存信息可以创建cache在里面存放,支付相关可以创建pay在里面存放等等。
另外,命名空间有区分共用还是私用,前面我们介绍的全部是私用的,关于共用的比如缓存信息配置,可能多个项目共用一个缓存服务器,这样可以创建一个public的namespace,里面存放缓存相关配置,任何项目都可以在namespace中写上这个cache以引入缓存配置,同时这个公共namespace已经不属于某个项目了,而是整个环境(env)中全局唯一了,所以需要注意命名
另外还有配置的继承玩法,个人觉得这个容易引起配置复杂混乱,所以没有过多研究,这里就不作交流了
以上几点是个人看法,如果有不同见解的还望在评论区中提出,大家共同学习,共同进步