配置中心Lion


先说下我自己理解的什么是配置中心。究其本质是我们人类无法掌控和预知一切,映射到软件领域上,我们总是需要对系统的某些功能特性预留出一些控制的线头,以便我们在未来需要的时候,可以人为的拨弄这些线头从而控制系统的行为特征,我把它叫做 “系统运行时(runtime)飞行姿态的动态调整“。具体可以参考阿里中间件团队的这篇文章一篇好TM长的关于配置中心的文章。简明扼要,一个配置中心必须要做到能动态的获取配置参数,并且当配置发生变更了,能及时准确无误的获取最新的配置。阿里用的配置中心叫diamon,我们点评用的是自研的Lion,本篇文章我们来阅读下Lion的源码。

Lion架构

获取配置流程

上面流程图右边部分就是获取配置的流程,流程图上基本说的很清楚了,这里总结下。

  • 本地缓存:先判断是否允许从本地缓存获取,如果可以,从缓存获取,缓存没有的话就从本地配置文件获取
  • 本地配置文件:默认文件名applicationContext.properties,没有的话,就从zk获取
  • zk:从zk获取,然后更新本地缓存和/data/appdatas/lion/lastWorkingConfig,并注册一个对该zk node的监听watcher。当然如果zk也失败,
    就从机器/data/appdatas/lion/lastWorkingConfig获取,另外Lion后台会启动一些线程池来异步的同步或者上传数据。

变更配置流程

上面流程图左边部分是变更配置的流程。
开始在Lion.get(“xxx”)的时候,如果最终是通过获取zk node value,则会注册一个对该node监听的watcher。当该节点的value发生变化时候,会更新该key对应的本地缓存和/data/appdatas/lion/lastWorkingConfig,最终会调用客户端Lion.addConfigListener添加的listener的configChanged方法。

Lion的高可用相关

数据冗余

配置信息显然是很重要的,作为一个分布式配置中心,保存了那么多应用的配置信息,所以数据必须要持久化。我们配置信息不光存在zk上,上面也提到了,每个应用会在自己的/data/appdatas/lion/lastWorkingConfig下面保存应用用到的所有的配置,有多少个key,就有多少个对应的文件名,文件的内容就是key的value。另外后台会开启一个线程池lion-upload-stat-thread:定期把应用使用到的所有配置同步到lion-server端,估计可以作为zk挂了,本地应用磁盘挂了的另外一种备份吧

本地缓存

为了提高性能,减少不必要的访问zk,应用会缓存所有使用的key值,当然也不必担心数据不一致的情况。每次zk节点变化通知到客户端,客户端都会更新本地缓存

推拉结合

配置在发生变更时候,我们需要能及时的获取变更后的配置。目前是依赖zk的push,我们知道zk对网络比较敏感,有可能会发生zk的值变了,但是客户端没有收到通知。Lion客户端也会开启一个线程来定时主动去从zk pull最新的值。


文章作者: 叶明
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 叶明 !
评论
 上一篇
数据库访问层中间件Zebra 数据库访问层中间件Zebra
zebra是一个基于JDBC API协议上开发出的高可用、高性能的数据库访问层解决方案。类似阿里的tddl,zebra是一个smart客户端,提供了诸如动态配置、监控、读写分离、分库分表等功能。下图是zebra的整体架构图 zebra整体架
2017-11-29
下一篇 
Hystrix源码分析 Hystrix源码分析
前两篇文章我们已经讲解了Hystrix的一些基本概念,并举了一些demo说明如何使用Hystrix,这篇文章我们更深一步,通过阅读一些源码来看下Hystrix是怎么工作的。我们主要根据官方文档上的一个流程图,对其中几个主要的过程从源码层面来
2017-10-01
  目录