微信公众号:内核小王子前言 日常开发中我们的应用中一般都会有数据库相关的配置,redis相关的配置,log4j相关的配置 等常用配置,这些我们称为静态配置,在应用启动的时候就需要加载,修改配置需要重启应用,这类配置一般是针对相关资源的访问地址和访问权限,还有一类配置和业务密切相关,应用在运行过程中需要监听这些配置的变化以方便修改运行模式或者响应对应的策略,例如并发控制数,业务开关等,可以用来做服务降级和限流,例如在数据库新老表做迁移的时候,我们可以用来配置进行动态切换模式:同步双写读老表,同步双写读新表,写新表读新表。如果这些配置不能进行集中式管理,那么当我们的服务部署有成千上万的实例后,即使借助ansible这些运维工具,那么修改配置也将是一件超级麻烦而且极容易出错的事情,在做发布的时候也不在敏捷。
关注可了解更多关于数据库,JVM内核相关的知识;
如果你有任何疑问也可以加我pigpdong[^1]
所以,微服务架构下,我们需要一个集中式的配置管理系统,那么这个系统需要提供哪些功能才能解决上面的问题呢
- 1.权限控制,当然不能所有的人都可以修改配置,如果能够继承公司的SSO或者LDAP当然更好
- 2.审计日志,所有的修改需要记录操作日志,方便后续出现异议能够找到对应的操作人,也可以提供审批流程
- 3.环境管理,开发,测试,生成环境下的配置肯定要做隔离,相同group内的配置可能大多相同,例如同一个IDC机房的应用也可以有namespace做区分
- 4.配置回滚,当发现配置错误,或者在该配置下程序发生异常可以立即回滚到之前的版本,这需要该系统能够有版本管理的功能
- 5.灰度发布,有时候我们新上线一个功能,想先通过少部分流量测试下,这个时候我们可以随机只修改部分应用的配置,当测试正常后在推送到所有的应用
- 6.高可用,配置中心需要高可用,所以最好能支持集群部署,同时配置中心系统挂了之后最好能不影响应用,应用能够继续使用本地缓存的配置
- 7.配置中心,应该能够在配置发生变更后实时通知到应用,应用端可能是一个监听器,配置也可能就是一个普通bean里面的属性,需要自动监听到变化并进行调整
目前已经开源的集中式配置管理中间件里面有携程的apollo和百度的disconf,已经阿里的diamond和spring cloud生态下地config系统,下面我们主要分析下disconf和apollo的实现
其中客户端有以下几个模块
- scan模块
扫描所有的disconf注解,注解有两种,一张是标示这个bean是一个配置可以和具体的配置文件做管理,bean里面的属性就是配置文件里面的key-value,当服务端配置修改后,这个bean会自动通过反射调用对应属性的set方法,将这个bean里面属性的value值变更为最新的配置的值,另一个注解是标示这是一个配置监听器,当配置变更后,会调用监听器里的方法,当有业务需要关联到配置变化进行改变策略的时候可以加上这种注解
- store模块
将从远程服务端拉取到的配置文件存储到本地,store模块有一个后台线程会定期扫描存储在本地的配置文件是否有变化,如果有变化就会通知scan模块扫描到得javabean和对应的监听器
- fetch模块
当watch模块监控到节点变化后,通过http调用远程restful接口,获取最新配置,然后调用store模块存储
- 【轻松构建微服务之分布式配置中心】watch模块
监控zookeeper上node的变动,当有变化后会会调用fetch模块获取配置,服务端在做配置修改的时候会将ZOOKEEPER里面相关的临时节点删除,然后所有watch该node的应用都会收到通知,所有需要监听配置变化的应用都需要和zookeeper维护一个长连接
文章图片
apollo 相比于disconf长期没有维护,而且只提供了较为简单的分组管理功能,apollo社区目前比较活跃,而且功能更为完善,不仅仅提供了权限审计等安全措施,还提供了灰度发布,版本回滚等,在高可用方面将服务拆分了3个独立的模块,每个模块都可以独立集群化部署,也不用依赖zookeeper,而且有很多大公司做背书。不过disconf部署简单,而apollo就复杂的多
四个核心系统
- 1.客户端
- 2.ConfigService
- 3.AdminService
- 4.portal
我们可以从两条线来看这个架构
- 配置管理人员发布修改配置,在portal登陆后,修改配置需要调用AdminService的接口将配置变更保持到数据库
- 配置变更厚通知客户端,configService通过和AdminService共用一个数据库,来感知到配置变化后通过长连接来通知客户端,configService和AdminService之间并没有rpc调用
- 1.Eureka
- 2.MetaService
- 3.NginxLB
所以portal节点和metaservice节点的增加和删除都需要在nginx上做对应的更改,而configService和AdminService则的弹性扩容则不需要
文章图片
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)