分布式配置中心 Disconf实践-概念片

     目前公司在处理分布式方案使用,使用了Disconf 作为分布式配置中心服务,所以利用这个机会整理了Disconf实践的过程,包括在使用和搭建中遇到的问题.

技术背景

      在一个分布式环境中,同类型的服务往往会部署很多实例。这些实例使用了一些配置,为了更好地维护这些配置就产生了配置管理服务。通过这个服务可以轻松地管理成千上百个服务实例的配置问题。

     提出了基于zooKeeper的配置信息存储方案的设计与实现[1], 它将所有配置存储在zookeeper上,这会导致配置的管理不那么方便,而且他们没有相关的源码实现。淘宝的diamond[2]是淘宝内部使用的一个管理持久配置的系统,它具有完整的开源源码实现,它的特点是简单、可靠、易用,淘宝内部绝大多数系统的配置都采用diamond来进行统一管理。他将所有配置文件里的配置打散化进行存储,只支持KV结构,并且配置更新的推送是非实时的。百度内部的BJF配置中心服务[3]采用了类似淘宝diamond的实现,也是配置打散化、只支持KV和非实时推送。

同构系统是市场的主流,特别地,在业界大量使用部署虚拟化(如JPAAS系统,SAE,BAE)的情况下,同一个系统使用同一个部署包的情景会越来越多。但是,异构系统也有一定的存在意义,譬如,对于“拉模式”的多个下游实例,同一时间点只能只有一个下游实例在运行。在这种情景下,就存在多台实例机器有“主备机”模式的问题。目前国内并没有很明显的解决方案来统一解决此问题。 

功能特点与设计理念

  disconf是一套完整的基于zookeeper的分布式配置统一解决方案。

它的功能特点是

·         支持配置(配置项+配置文件)的分布式化管理

o    配置发布统一化

o    配置发布、更新统一化(云端存储、发布):配置存储在云端系统,用户统一在平台上进行发布、更新配置。

o    配置更新自动化:用户在平台更新配置,使用该配置的系统会自动发现该情况,并应用新配置。特殊地,如果用户为此配置定义了回调函数类,则此函数类会被自动调用。

·         配置异构系统管理

o    异构包部署统一化:这里的异构系统是指一个系统部署多个实例时,由于配置不同,从而需要多个部署包(jar或war)的情况(下同)。使用Disconf后,异构系统的部署只需要一个部署包,不同实例的配置会自动分配。特别地,在业界大量使用部署虚拟化(如JPAAS系统,SAE,BAE)的情况下,同一个系统使用同一个部署包的情景会越来越多,Disconf可以很自然地与他天然契合。 异构主备自动切换:如果一个异构系统存在主备机,主机发生挂机时,备机可以自动获取主机配置从而变成主机。

o    异构主备机Context共享工具:异构系统下,主备机切换时可能需要共享Context。可以使用Context共享工具来共享主备的Context。

·         注解式编程,极简的使用方式:我们追求的是极简的、用户编程体验良好的编程方式。通过简单的标注+极简单的代码撰写,即可完成复杂的配置分布式化。

·    需要Spring编程环境

详细设计

架构设计

disconf服务集群模式:

image0

disconf的模块架构图:

image1

每个模块的简单介绍如下:

  • Disconf-core

    • 分布式通知模块:支持配置更新的实时化通知

    • 路径管理模块:统一管理内部配置路径URL

  • Disconf-client

    • 配置仓库容器模块:统一管理用户实例中本地配置文件和配置项的内存数据存储

    • 配置reload模块:监控本地配置文件的变动,并自动reload到指定bean

    • 扫描模块:支持扫描所有disconf注解的类和域

    • 下载模块:restful风格的下载配置文件和配置项

    • watch模块:监控远程配置文件和配置项的变化

    • 主备分配模块:主备竞争结束后,统一管理主备分配与主备监控控制

    • 主备竞争模块:支持分布式环境下的主备竞争

  • Disconf-web

    • 配置存储模块:管理所有配置的存储和读取

    • 配置管理模块:支持配置的上传、下载、更新

    • 通知模块:当配置更新后,实时通知使用这些配置的所有实例

    • 配置自检监控模块:自动定时校验实例本地配置与中心配置是否一致

    • 权限控制:web的简单权限控制

  • Disconf-tools

    • context共享模块:提供多实例间context的共享。

流程设计

image2

  官网介绍:

                 http://disconf.readthedocs.io/zh_CN/latest/design/src/%E5%88%86%E5%B8%83%E5%BC%8F%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0Disconf.html#id5