特性\产品 | Apollo | Xdiamond | Super-diamond | xxl-conf | disconf | Spring-Cloud-Config |
配置存储 | 最终持久化在mysql | 存储在mysql | 存储在mysql | 同时在ZK与MySQL中存储和备份 | 存储在mysql | Git、svn、native三种存储模式 |
更新模式 | 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。 客户端还会定时从Apollo配置中心服务端拉取应用的最新配置。 | 客户端通过watch监听结节 | 定时拉取 | 客户端通过watch监听结节 | 基于Zookeeper的推模型,实时推送 | 客户端watch |
配置读写 | 只读 | 只读 | 只读 | 只读 | 只支持实例对配置读 | 只读 |
容灾 | 会在配置client缓存一份配置文件。只要local文件存在,配置中心宕机不会影响到应用的启动和运行。 | 多级容灾模式,配置数据会dump在本地,避免中心服务挂机时无法使用 | 无 | 配置中心基于Zookeeper集群, 只要集群节点保证存活数量大于N/2+1, 就可保证服务稳定, 避免单点风险。 客户端从配置中心获取到的配置数据后,会周期性缓存到本地快照文件中,当从配置中心获取配置失败时,将会使用使用本地快照文件中的配置数据。 | 多级容灾模式,优先读取本地配置文件 | 依赖配置服务器的健康运行。当配置服务器宕机,不会影响在运行中的服务,但会导致新服务无法启动。 |
配置数据模型 | 支持properties、xml、yml格式输出 | 支持KV模式输出(直接注解到bean)、properties和json格式配置文件输出 | 支持properties | 支持KV模式输出(直接注解到bean),xml配置 | 支持KV模式输出(直接注解到bean),xml配置 | 直接通过client加载properties或yml文件注入到BeanFactory里。 |
集群数据同步 | Apollo多出一个集群的tag,用来给同一功能的系统在不同的集群里使用其相应的配置(例如,在应用跨数据中心部署时)。在多数据中心部署时,数据完全同步,Meta Server/Portal域名通过slb自动切换到其它存活的数据中心。 | 基于数据库和本地文件 1、server写数据时,先将数据写入mysql,然后写入本地文件 2、client订阅数据时,访问的是本地文件,不查询数据库,这样即使数据库出问题了,仍然不影响client的订阅 3、通过比较client和server的数据的MD5值感知数据变化 | (暂无相关资料) | 客户端基于多层设计,核心四层设计如下: 1、API层:提供业务方可直接使用的上层API, 简单易用, 一行代码获取配置信息;同时保证配置的实时性、高性能; 2、Ehcache层:客户端的Local Cache,极大提升API层的性能,降低对ZK集群的压力;首次加载配置、监听配置变更、底层异步周期性同步配置时,将会写入或更新缓存; 3、ZK-Client层:ZK远程客户端的封装,用于加载远程配置、通过NodeDataChanged监听配置变更,提高配置时效性; 4、Mirror-File层:配置数据的本地快照文件,会周期性同步 "Ehcache层" 中的配置数据写入到 "Mirror-File" 中;当无法从配置中心获取配置,如ZK宕机时,将会使用 "Mirror-File" 中的配置数据,提高系统的可用性; | 基于zookeeper实现对配置更改的实时推送 全局分布式一致性锁来实现主备统一部署、系统异常时的主备自主切换 | 通过注册中心,提供配置服务器的集群实现。集群统一指向同一类配置存储模式(官方推荐git或svn;另外采用native的方式时,需要把native模式下的文件路径指向高可用的文件系统目录) |
配置中心安全 | 完备的权限管理,支持Namespace的概念 | 基于Spring-shiro支持Ldap。 | 无 | 以项目为维度进行配置权限控制,管理员拥有全部项目权限,普通用户只有分配才拥有项目下配置的查看和管理权限 | 简单的用户权限管理 | 仅支持用户名、密码,和Vault的token方式来管理配置服务器的安全。 |
多环境 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
历史版本 | 支持 | 不支持 | 不支持 | 支持10个历史版本 | 支持 | 支持 |
灰度发布 | 支持 | 支持 | 不支持 | (未研究) | (未研究) | (未研究) |
SDK支持语言 | Java、.net等,并支持开放的HTTP接口 | Java,支持Restful接入 | Java | Java | Java | Java |
SDK接入难易程度 | 需按sdk实现框架所需的@Configuration注解类。 | 需按sdk实现框架所需的@Configuration注解类。 | (无研究) | 需按sdk实现框架所需的@Configuration注解类。 | 暂未找到直接使用@Configuration进行配置注入的实现。 | SpringCloud子项目,轻松接入当前框架,只需在pom文件引入相关依赖,并在应用启动配置文件加上spring.cloud.config的相关配置即可。 |
作者 | 携程 | 个人开源(思路源自淘宝开源的diamond配置中心) | 个人开源(思路源自淘宝开源的diamond配置中心) | 个人开源 | 百度 | SpringCloud |
其他 | 注册中心也是用Eureka ~\(≧▽≦)/~ | 无注册中心 | 无注册中心 | 使用zookeeper作为注册中心 | 使用zookeeper作为注册中心 | 完全匹配项目所使用的注册中心 |
综上分析,从国内应用登记情况来看,Apollo和disconf是最为热门的两个。
从功能的完备性来看,携程Apollo的功能在配置管理上是最为完备;其二就是Xdiamond,其参考maven的package管理而特别提出了思路相似的配置依赖概念,且增加了一些针对配置中心的metrics、apidocs、webssh和druid监控或运维工具等。
最后,Spring-Cloud-Config由于其官方特性,接入成本最低,但当前配置功能最弱、且没有配置界面(运维难度将会较大),另外如想把配置持久化到数据库,需额外实现。