玩转apollo配置中⼼——springboot整合Apollo实现集中配置⾃
动化更新
前⾯我们⼀起交流了Apollo配置中⼼的基本原理以及各种环境的搭建,今天我们进⾏springboot整合Apollo实现集中化配置、⾃动化更新
应⽤场景
任何没有业务应⽤场景的技术都是纸上谈兵,先说说应⽤场景
随着现在微服务技术越来越⽕爆热门,越来越普及,当单体服务升级为集或者微服务的时候,服务变多变复杂,相关的配置也会呈⼏何倍数增长
拿springboot举例,我们开发环境的时候,数据库参数、缓存各种参数都写在application配置⽂件中,测试、⽣产环境通过启动参数-之类的进⾏指定。或者有些通过application-env配置⽂件进⾏不同环境的不同参数进⾏配置,在启动的时候指定当前运⾏环境-Dspring.profile.active=dev等。但是服务变多以后,配置参数的检查,更新将会是⼀个灾难性的场景,⽽且还不⽀持配置参数的热更新,修改参数后必须重新打包、重启应⽤。
所以在这种情况下,配置中⼼这种中间件应运⽽⽣,⽬前主流的有携程的Apollo、netflux的config、ali的nacos,今天我们主要讨论Apollo
应⽤整合
⾸先创建⼀个springboot应⽤,具体创建过程不是本⽂重点(略)
整合改造过程
1.修改pom添加Apollo依赖,以⽀持Apollo配置中⼼
<dependency>
<groupId&ip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.4.0</version>
</dependency>
2.填写Apollo信息配置
# 项⽬名称
app.id=${spring.application.name}
# Apollo配置中⼼地址
# 是否开启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.启动程序,进⾏测试
这样就实现了服务的集中化配置,以及⾃动化热更新
apollo集配置
Apollo配置中⼼的四个维度其中有⼀个集,默认都是没有配置集的(default),如果有需要,可以这样添加
1.Apollo配置中⼼新增⼀个集
打开Apollo控制台,进⼊项⽬,在界⾯左下⽅到添加集按钮并点击
然后在添加集页⾯输⼊集名称(我这⾥⽤的shanghai),勾选所要⽣效的环境确定即可
2.在springboot项⽬中使⽤
springboot中如果不指定集配置,即使⽤默认的集default,如果需要使⽤新的集,可在配置⽂件或者启动参数中加这个配置
apollo.cluster=shanghai
最后再在shanghai这个集中添加⼀些配置并发布,⽐如
test=8888
server.port=8003
多环境配置
springboot使⽤Apollo配置中⼼的多环境配置时有些特殊
这⾥我们使⽤sit环境
springboot中配置好后,再在apollo的sit环境中添加相应配置并发布,然后重启springboot即可看到配置已⽣效
多namespace配置
在apollo配置中⼼⾥多namespace配置在项⽬配置界⾯左下⾓点击添加namespace按钮,然后在添加页⾯选择创建namespace,然后输⼊名称确定即可在项⽬配置页⾯看到新建的namespace空间
在这个空间⾥添加⾃⼰的配置
在springboot中指定项⽬所使⽤的命名空间稍微有点不同,这⾥⽀持同时配置多个namespace,多个⽤英⽂逗号隔开
apollo.bootstrap.namespaces=application,l
PS1:这⾥需要注意的是,如果这多个namespace中包含相同的配置,那么以配置靠前的namespace中的配置为准
PS2:如果apollo中添加的namespace配置格式为yml等⾮properties的时候,springboot中配置应该带上.后缀名,⽐如我的l
然后在各个环境中添加好相应的配置并发布,再重启springboot即可看到多namespace的配置已⽣效
⼏点个⼈建议
⾸先对于四个维度app,env,cluster,namespace的应⽤
spring boot选择题application,即项⽬,每个springboot项⽬都要设置⾃⼰的名称spring.application,name,然后apollo配置中⼼中创建的项⽬名称尽量要和springboot的项⽬名称相同,这样在配置中指定app.id=${spring.appcation.name}即可,⼈员排查配置问题的时候也⽅便检查,其实重点就是⼈员⾁眼观察起来⽅便,可读性强
cluster,集,这个配置可以根据⾃⼰项⽬实际,进⾏添加配置,⽬前中⼩型公司⽤到的不多,个⼈觉得作⽤不是很⼤,⼏乎可以忽略。但是在开发dev环境的时候倒是可以⽤⼀下,因为开发过程中,我们很多开发⼈员喜欢⾃⼰⽤⾃⼰单独部署的数据库或者其他配置信息,这样在启动参数中添加会很⿇烦,改配置⽂件也涉及到代码提交分⽀切换等会很⿇烦,可以考虑开发⼈员根据⾃⼰实际,在dev环境下新建⼀个属于⾃⼰专属的cluster,启动参数中专门指定⾃⼰dev模式下读取的cluster为⾃⼰专属的集即可,-Dapollo.cluster=my-name,这样可以避免启动参数过于复杂以及配置⽂件有修改变动导致代码提交不⽅便
namespace,命名空间,这个配置是区分项⽬中不同类型的配置进⾏归类存放的,⽐如数据库信息的配置可以创建⼀个namespace名称为datasource在⾥⾯存放,缓存信息可以创建cache在⾥⾯存放,⽀付相关可以创建pay在⾥⾯存放等等。
另外,命名空间有区分共⽤还是私⽤,前⾯我们介绍的全部是私⽤的,关于共⽤的⽐如缓存信息配置,可能多个项⽬共⽤⼀个缓存服务器,这样可以创建⼀个public的namespace,⾥⾯存放缓存相关配置,任何项⽬都可以在namespace中写上这个cache以引⼊缓存配置,同时这个公共namespace已经不属于某个项⽬了,⽽是整个环境(env)中全局唯⼀了,所以需要注意命名
另外还有配置的继承玩法,个⼈觉得这个容易引起配置复杂混乱,所以没有过多研究,这⾥就不作交流了
以上⼏点是个⼈看法,如果有不同见解的还望在评论区中提出,⼤家共同学习,共同进步
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论