[关闭]
@gaoxiaoyunwei2017 2018-01-25T08:25:11.000000Z 字数 5874 阅读 442

小小配置中心释放大能量-张乐

黄晓轩


讲师 | 张乐
编辑 | 黄晓轩

讲师简介

张乐
携程中间件研发工程师

前言

为什么说配制中心很小呢。一方面是在配制上,我觉得很多人开发人员忽略配制,更多是专注于代码编写,而忽略配置怎么管理。另一方面配制中心是八大核心中间件里面是比较小的一个系统,但在行业内并没有一个能一统江湖的配制中心。释放大能量,就是我们开发者日常开发过程中可以通过配制中心做很多的事情,我觉得作为我们的运营,有时候也可以通过一些配制中心提供一些能力做一些管理。

一 被忽视的配置

image_1c4j35mcrpp21mtai2f3ari9s9.png-35.6kB

我觉得很多同学并没有时间对配制专门的进行研究和分析。这一句话是在这维基百科上,简单的讲配制就是做为程序初始化的一些配制文件。他的定义我觉得是有点过时了,现在基本上每个公司都有配制中心。如果有了配制中心,配制不仅仅是做为程序初始化应用启动的配制,也可以在应用运行时通过配置来做一些控制。

image_1c4j3c8r27ua5r49nq41idc2m.png-88.4kB

这里提到在一个项目开发过程中,配置是随处可见的。
第一个最简单的就是硬编码的方式。
第二个是项目里的配置文件。一个典型的JAVA的maven项目有一个resources目录,这个目录基本上都是放置配置文件的,那么硬编码方式跟配置文件方式是没有本质的区别,为什么这么说呢?其实这两种方式你的配置都是跟着你发布的程序包。如果你要修改一个配置,你都要重新修改源代码,或者修改配置文件,然后重新上传、打包、部署,这一个流程是很繁琐的。如果你修改错了一个很重要的配置,可能就出了一个大故障。
第三个文件系统上的配置文件。比如我的应用是集群部署的,我的配置文件不是放在项目包里面,而是在这台部署应用上面的文件系统上的某个配置。那这样相比前两种方式,有一个提升,就是我把配置已经从项目里面脱离出来了,就是把配置给隔离出来了,那这样做的好处是可以动态的修改配置,我不需要每次打包重新改配置,那么程序里面最简单的写一个定时器就可以更新配置。但这种方式有一个很大的问题,就是我改配置的时候假设这个应用有10台机器,需要登陆每一台机器一个一个去更改,这明显是不靠谱的。
第四种方式是网络上的配置文件。有两种方式,第一种就是大部分如果一个公司没有一个统一的配置中心的话,很多公司,很多项目团队都会自己把配置放在数据库里面。通过放在数据库里面,也可以做到第三种的方式。但是还有一个好处,如果你放在数据库里面的话,就相当于把配置文件集中化管理的,只需要改一下数据库,程序里面所有读到的配置也能一下子生效,就不需要一个个登机器修改配置了。那另外一种网络配置文件就是配置中心了。
除了应用的配置之外,还有很多其他的配置。比如说JVM参数,应用启动参数,另外操作系统的配置,可能也是运维更关心这方面的配置。

image_1c4j40h3516ka13g7cq1bv1jh213.png-250.6kB

我一开始讲到,很多开发人员是忽略配置的。我这两年一直做配置中心,所以对配置有过更深入的理解。
第一个配置是等于代码。配置应该像代码一样,也是需要review、测试、发布,一个环境一个环境走上去得,并不是改一下配置很简单而不重视。我相信很多公司都出现过因为配置的更改导致生产事故。
第二个配置又不等于代码,为什么这么说呢?首先,配置是没有逻辑的,不像代码可以通过上下文看代码的逻辑,猜测这行代码是什么意思。但是配置只能通过你的名字去辨别我的配置什么意思,所以说一旦你的配置不管理好的话,其实是很头疼的。其次,配置其实更多的是一种约定的规定,大家知道,不管学习任何一个框架,或者使用任何一个系统,换一个角度讲,我们大部分情况下是学习怎么配置这个系统。如果一个系统或者一个中间件它的配置定义的很不好,而且配置烦琐的话,那么他的使用门槛是很高的。所以说你是作为一个中间件的开发者,或者一个系统的研发者,一样管理好你的配置,让你的用户更好的配置你的系统,是非常重要的。说白了这是一种约定的规则,而不是逻辑。

配置的最佳实践:

二 配置中心概述

image_1c4k6pqi2agf1ppb6spk2rvnk9.png-74.7kB

第二部分就是刚才提到的配置中心。配置中心有哪些能力,怎么更好的管理我们的配置,怎么更好的去解决上述提到的,就是前面几种方式配置的一些痛点呢?

image_1c4k8jdc41g8i1lpgr9q16iv17js9.png-42.9kB

配置的坐标维度有哪些呢?

通过这四个维度可以精确的定位到一个配置。

配置中心客户端都有哪些功能?

image_1c4k92tcqqo4aq7vjr13h0rl79.png-59.8kB

配置中心第二个核心特性就是热发布。就是配置实时生效。如果没有配置中心,大家每个业务自己做一个配置中心的话,把配置放到数据库里面,最简单的方式就是写一个轮询,比如1分钟到数据库load一下配置。如果有了配置中心之后,可以做到实时,比如一秒钟之内,配置就能下发到这个应用下的所有机器,所以是非常核心的功能。

三 配置中心在实际场景中启到的大作用

场景一:功能开关

image_1c4ka2um11he91pme1or51tk41b7nm.png-56.3kB

我统计了一下在携程内部,它的配置的类型,发现60%、70%都是开关类的配置。我以前也是做业务开发的,这个也是非常好理解。举个最简单例子,比如在携程页面上,新增加了携程的酒店详情页,新增加了业务模块,然后我的做法就是加一个开关,一旦发现有问题有投诉,我立马到配置中心把这个开关关掉,我的页面上马上这块功能就消失掉了,就回退掉了,所以这个是很常见的一个场景。所以在以前点评的时候,就发现很多这种开关,其实这几行代码都是没用的代码,换句话说有了便利就任意妄为了,就带来其他的问题。

场景二:就是ABTest、业务灰度

image_1c4ka3ftd1ffoj11lmm98b1h1113.png-104.3kB

大一点的公司,他公司内部可能有单独的一套ABTest的框架,如果没有的话,通过配置中心也是很好做的。比如说以携程酒店为例,如果这是新增加了一个功能,但这个功能不想一下子全国都铺广开来。那在配置中心上面增加一个配置项叫“开放的城市列表”,我可以先让部分城市生效,如果发现有问题了,立马关掉,都回退了。如果发现还不错,那我就扩大开放的城市。这样做的好处就是说开通这种城市,不需要重新发布我的应用,只需要在配置中心上面点一下发布按纽就OK了,这个效率其实是非常高的。

场景三:动态数据源

image_1c4ka3valg9edga1tde1oof1vl71g.png-103.1kB

动态数据源也是很常见的一个通过配置中心应用的例子。携程最近也在做。比如业务的数据库,发现性能不行了,或者硬件某个磁盘坏了,传统的方式就是通过一堆十几分钟的操作才解决这个问题,可能十几分钟都算快的。如果有了动态数据源就很方便,我把我的数据源切到DBA新起的一个数据库实例,通过配置中心把连接串更改,所有的流量都导到新的库里面去,这个操作对业务来说也是透明的,也是非常方便。最简单的做法,就是我刚才提到在配置变更的时候,重新初始化一个数据库连接池,然后把新的流量都导到新的连接池,等老的连接池所有的流量都释放干净之后,才把老的连接池给释放掉,这是最简单的一种做法。

场景四:服务注册发现

image_1c4ka4h2ktpo11u8spptn1om51t.png-102.3kB

在阿里,他的服务发现跟配置中心是绑定在一起的。一个团队他会既提供配置中心,又提供服务发现,在组织架构上也是在一起的。因为现在服务注册发现说白了就是配置变更和下发,这件事情只要在我配置中心上面封装一下,就能很简单的做到服务注册发现。比如说像点评服务注册发现,就基于配置中心去实现的。

场景五:通知

image_1c4ka99vi1l23ks31rit1f701u482a.png-143.8kB

在做配置中心的时候有业务同学找我说,因为你的配置中心不是有能实时生效的功能,换句话说就是一个通知的场景了。我就问他,你为什么不用MQ,他就说,MQ太烦琐了,还不如通过配置中心去做这个通知。换个角度讲这是不是我们的MQ做的不够易用,对应用接入成本是不是太高。换句话说配置中心做这个通知的场景也是挺顺的,当时我就在想,在配置中心的API上面封装一层,在界面上封装一层,一个场景用来专门做通知的,用户只需要一个配置和一行代码就能做到通知,不需要一堆一堆流程上面的事情来提升效率。

四 配置中心基本实现原理

image_1c4kale2v171e1mg5a501efec3n2n.png-60.7kB

大部分配置中心很多是用ZK做的,所以你问你的同事你的配置中心是不是ZK做的,我觉得这是一个误解。大家为什么喜欢用ZK呢?因为ZK天然具有通知功能的。某台应用的机器和ZK的节点有一个长连接,当这个节点发生变更的时候ZK会替它通知,另外一个是ZK选举机制是可以保证节点间的数据是一致的。所以这两个也是作为配置中心需要解决的一些问题。所以很多配置中心都是基于ZK做的。另外一种就基于数据库。数据库其实也很好理解,相比大家可能仔细理解一下配置的场景,配置是典型的更改次数比较少,但是读多写少的场景,所以数据一致性,我通过一些机制很容易保证数据的一致性。而且利用Http Long Polling方式做通知,成本也很低。所以ZK的优势通过这两种技术手段可以去实现。

image_1c4kaufkmdsonms14cjncchcm34.png-35kB

ZK和数据库相比有什么利弊
- 可靠性
有一次携程内部在做IDC切换的时候,所有流量就导到另外一个IDC。这时候如果这种场景下ZK一下子连接进来很多之后,ZK很可能就垮掉了。像Dubbo的ZK是跟所有的服务都建立一个长连接的,也就是说在连接数很多,并且一下子涌过来的时候ZK是不可靠的。我们公司就踩过无数次这种坑,所以现在都提倡去掉ZK。
- 可维护性
一方面是公司一般很少有专门的专业的ZK的管理员。如果你是数据库的话,肯定是有一套很完善的体系去维护,但ZK的话不一定就有。
- 可扩展性
数据库有很多工具去做,比如说主从同步等等很多的容灾机制。另外数据库提供了一套很完善的CIUD的一些很成熟的通过代码方式去操作数据库的查询和其他的。所以从这个角度讲,数据库的可扩展性也是比ZK高的,所以很多时候如果是基于ZK搭建的配置中心的话,也会整一个数据库,让所有的配置变更都是在数据库上做的。然后在配置发布的时候,将这个配置写到ZK里面去,让ZK推到客户端。这个其实是没有必要的。

image_1c4kbfdhq2d61o48j8g1eff1ch43h.png-64.7kB

最后讲一下市面上一些开源的配置中心。阿里在云栖大会上发布了ACM,基于阿里云的SaaS配置中心云服务。我在做开源的时候也在想,像配置中心这种场景,如果你要搭一套配置中心是很麻烦的,完全是可以做到放到阿里云上通过SAAS这个服务做的,我接入就不需要自己搭建了,然后应用接入也是很方便的。我相信这种SAAS云服务配置中心,肯定是下一代的配置中心。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注