Diamond主要提供持久配置的发布和订阅服务,最大特点是结构简单,稳定可靠。主要的使用场景:TDDL使用Diamond动态切换数据库,动态扩容等;业务使用Diamond推送系统开关配置。Diamond产品专注于高可用性,基于此在架构、容灾机制、数据获取模型上有一些与同类产品的不同之处——阿里巴巴Diamond介绍
diamond架构图
配置信息存放在哪里
gourp_info表存组的信息,组的概念是用来区分不同环境的(奇怪的是,阿里开源出来的Diamond并未使用到这个表~~)
config_info表用来存放具体的配置信息
数据保存逻辑
对应的AdminController的postConfig方法,保存顺序:数据库->更新md5cache->本地磁盘->通知其他节点更新;
md5cache是用ConcurrentHashMap
value是content的md5字符串,MD5类是单例的,对数据进行md5的算法加了锁。客户端来请求配置信息(带着group和dataId),服务端会查看内存中的md5cache是否有对应的配置信息(内存中取值,速度快)
通知其他节点更新的方式:首先获取node.properties保存的地址,然后通过http方式发送请求。
其它节点从数据库获取最新配置信息然后保存到本机磁盘上
客户端和服务端如何交互
- 利用工厂类DiamondClientFactory创建单例订阅者类。
- 将客户端创建的侦听器类添加到侦听器管理list中并注入到新创建的订阅者类中。
- 为订阅者设置dataId和groupId。
- 启动订阅者线程,开始轮询消息。
配置变更客户端如何感知
- 方法内部启动一个定时线程,客户端第一次启动60秒后执行一次获取最新配置信息,后续默认每隔15秒执行一次
方法内部实际上三个主方法分别是:
checkLocalConfigInfo:主要是检查本地数据是否有更新,如果没有则返回,有则返回最新数据,并通知客户端配置的listener。
checkDiamondServerConfigInfo:远程调用服务端,获取最新修改的配置数据并通知客户端listener。
checkSnapshot:主要是持久化数据信息用的方法。
Diamond缺陷及改进思路
- 界面过于简单、不够美观
- 权限控制不够精细
- 没有灰度发布功能
- 配置信息变更无法及时生效