五、总体设计
5.1 架构图
5.2 "配置中心" 设计
配置中心由以下几个核心部分组成:
- 1、管理平台:提供一个完善强大的配置管理平台,包含:环境管理、用户管理、项目管理、配置管理等功能,全部操作通过Web界面在线完成;
- 2、管理平台DB:存储配置信息备份、配置的版本变更信息等,进一步保证数据的安全性;同时也存储"管理平台"中多个模块的底层数据;
- 3、磁盘配置数据:配置中心在每个配置中心集群节点磁盘中维护一份镜像数据,当配置新增、更新等操作时,将会广播通知并实时刷新每个集群节点磁盘中的配置数据, 最终实时通知接入方客户端;
- 4、客户端:可参考章节 "5.3 客户端 设计" ;
5.3 "客户端" 设计
客户端基于多层设计,核心四层设计如下:
- 1、API层:提供业务方可直接使用的上层API, 简单易用, 一行代码获取配置信息;同时保证配置的实时性、高性能;
- 2、LocalCache层:客户端的Local Cache,极大提升API层的性能,降低对配置中心集群的压力;首次加载配置、监听配置变更、底层异步周期性同步配置时,将会写入或更新缓存;
- 4、Mirror-File层:配置数据的本地快照文件,会周期性同步 "LocalCache层" 中的配置数据写入到 "Mirror-File" 中;当无法从配置中心获取配置,如配置中心宕机时,将会使用 "Mirror-File" 中的配置数据,提高系统的可用性;
- 3、Remote层:配置中心远程客户端的封装,用于加载远程配置、实时监听配置变更,提高配置时效性;
得益于客户端的多层设计,以及 LocalCache 和 Mirror-File 等特性,因此业务方可以在高QPS、高并发场景下使用XXL-CONF的客户端, 不必担心并发压力或配置中心宕机导致系统问题。
5.4 配置中心 http 服务(多语言支持)
Java语言应用,可以直接通过依赖提供的Client包的方式,方便快速的接入和使用配置中心;可参考章节 "二、快速入门":
非Java语言,可借助 XXL-CONF 提供的 "配置中心http服务",获取配置、实时感知配置更新,从而实现多语言支持。
配置中心提供的 "配置中心http服务" 只会读磁盘配置数据,因此性能极高,而且配置中心支持通过集群无线横向扩展;
"配置中心http服务" 接口文档如下:
a、配置批量获取接口:
说明:用于批量查询配置数据;
// 接口地址格式
{配置中心跟地址}/conf/find?env={环境}&keys={配置Key}&keys={配置Key02}
// 示例
http://localhost:8080/xxl-conf-admin/conf/find?env=test&keys=default.key01&keys=default.key02
// 请求参数:get/post方式均可
accessToken : 配置中心接入验证TOKEN,选填,非空时启用,进行安全严重
env : 环境配置,必填;如"test、ppe、product"等,指定配置加载环境;
keys : 配置Key,支持传递多个,
// 响应数据格式:
{
"code": 200, // 200 表示正常、其他失败
"msg": null, // 错误提示消息
"data": { // 配置信息,KV格式
"default.key02": "22",
"default.key01": "111"
}
}
b、配置实时监控接口:
说明:用于实时监控配置数据更新,为 long-polling 接口,请求后将会立即阻塞,期间如若参数中配置Key有变动则立即响应通知请求方,否则将会一直阻塞,默认阻塞30s;
// 接口地址格式
{配置中心跟地址}/conf/monitor?env={环境}&keys={配置Key}&keys={配置Key02}
// 示例
http://localhost:8080/xxl-conf-admin/conf/monitor?env=test&keys=default.key01&keys=default.key02
// 请求参数:get/post方式均可
accessToken : 配置中心接入验证TOKEN,选填,非空时启用,进行安全严重
env : 环境配置,必填;如"test、ppe、product"等,指定配置加载环境;
keys : 配置Key,支持传递多个,
// 响应数据格式:
{
"code": 501, // 200 表示正常,一直阻塞到结束,说明配置数据没变动;501 表示配置数据有变化;其他标示请求失败
"msg": "Monitor key update." // 错误提示消息
}
接入方可以借助上面两个接口,获取配置、实时感知配置更新;
5.5 配置快照功能
客户端从配置中心获取到的配置数据后,会周期性缓存到本地快照文件中,当从配置中心获取配置失败时,将会使用使用本地快照文件中的配置数据;提高系统可用性;
5.6 多环境支持
单个配置中心集群,支持自定义多套环境,管理多个环境的的配置数据;环境之间相互隔离;
此处给出一些多环境配置的建议:
- 机器资源紧缺、系统规模较小时:建议部署单个配置中心集群,比如部署 "配置中心集群",通过定义多套环境,如 "dev、test、ppe、product" 隔离不同环境配置数据;优点是,可以同享配置中心资源;
- 机器资源充足、系统规模较大时:建议部署多个配置中心集群,比如部署 "配置中心集群A",定义环境 "ppe、product";部署 "配置中心集群B",定义环境 "dev、test"等;优点是,可以避免多个集群相互影响;
5.7 对象代理情况下配置获取
在配置所属对象存在代理(JDK、CGLib)的特殊情况下,推荐使用以下方式获取配置:(非代理情况下,可以忽略本章节)
- 1、采用“API方式”获取配置:最稳定的配置获取方式,API方式底层存在Local Cache不必担心性能问题;
- 2、为配置属性添加 get、set 方法,不要直接访问配置属性,而是通过配置属性相应的 get 方法获取;
5.8 容灾性
XXL-CONF拥有极高的容灾性,首先配置数据进行多级存储, 可分为以下几层:
- DB:完整的配置数据存储在数据库中,极大的方便配置数据的备份与迁移;
- 配置中心磁盘:配置中心在每个配置中心集群节点磁盘中维护一份镜像数据,并实时同步更新;
- Client-镜像文件:接入配置中心的客户端应用会自动对使用的配置生成镜像文件,远程配置中心故障时降级实用镜像文件;
- Client-LocalCache:接入配置中心的客户端引用,优先使用LocalCache内存中的配置数据,提高性能的同时,降低对底层配置服务的压力;
Client-Api:最后暴露给业务的API,用户可具体加载配置数据,完成业务;
鉴于以上基础,在配置服务故障时,可以快速进行配置服务降级与恢复:配置中心宕机时:对业务系统无影响,业务系统从配置中心磁盘与Client端镜像文件中获取配置数据;
- DB宕机:对业务系统无影响,业务系统从配置中心磁盘与Client端镜像文件中获取配置数据;
- 配置中心宕机 + DB宕机 + Client端镜像文件被删除:此时,只需要手动创建一份配置镜像文件,上传到Client端应用指定位置即可,业务无影响;