本文首发于2017年,这次只是留存到公众号上,让自己记住当初那个没把告警治理当成自己的事情来做的我。
本期我们组的技术分享,打算跟大家讲讲服务治理。我在上篇文章中介绍了我们美团.点评北京总部用的OCTO框架,其实在上海点评部门用的是另一套Pigeon。这两套框架都很重。这是和我们的业务有关的,其实服务治理这个东西从创业公司到成熟的大公司都在用,只是做到的程度不同。
先说说服务治理的边界。本质上任何能提升服务可用性,性能,让服务更稳定等等,只要是能让服务运行的更好,都属于服务治理的范畴。服务治理比较常见的话题:服务发现,服务变更管理,服务监控,服务扩容缩容,服务自我保护,服务降级,服务授权防攻击,服务上线验证和灰度发布,服务问题定位和跟踪,服务负载,服务实例的调度等等。
说服务治理就要先聊聊服务。从业务角度而言,服务是一个可重复的任务。我是个做业务的,业务可以被粗粒度的划分为一系列粗粒度的服务和流程。这本质上符合SOA架构的风格,而现在比较流行的微服务出现实际上应当归功于SOA原则的成功。而微服务将服务划分的更细,更多,会导致出问题的概率变大。这时候,服务治理的手段没有进步的话,实际上服务的压力是变大了。所以大家在选择架构的时候,需要按照自己的业务发展现状和趋势合理的辩证的做决断。就好像我在上篇文章里举的例子:如果要建一间房子,可能随便建个土房子或者茅草房子就能用几十年,但是随着规模的扩大,建成四合院就要讲究格局,建成一个小区,建成一座城市,就需要运用各种工程学的知识更加统筹的规划。这就是为什么我要来美团。我在乐视其实过得很舒服,很自由。因为我家微微一笑很倾城的男神老大不仅英俊帅气,智商情商双高,而且管理风格open,很合适我这种有自己想法的下属。但是乐视各个部门更像是一个村落,大家都在各自建各自的房子,好处是有才能的人可以比较自由的发挥,缺点是格局不够统一,各个部门做了很多重复的工作。所以乐视出来的人有水平非常高的,也有水平非常一般的。我个人觉得如果你个人能力非常好,可以去乐视试一试,说不定可以发挥自己的潜能。但是对于我而言,我发现了自己格局的问题,如果我坚持还是要去阿里的话,到那边也是个拧螺丝的,平台很好,但是能不能发挥是个问题。而来美团,我至少能够得到的保证是:完成一个从对工作负责到对结果负责的转变。什么意思呢?我来这边,我们架构师说我来之前,他需要找各个开发去告诉他们我们的工作,每个开发都听明白了,然后回到工位完成了自己的那份工作。结果中间衔接的部分职责模糊的部分就很可能被漏掉了。我来了,我的工作是对结果负责,那么涉及到内部职责的划分,上下游的对接和业务了解。任何能让结果变得更好的事情都属于我的职责范围。这和服务治理的理念不谋而合,这就是为什么我要来研究服务治理。
我也自己创过业,做的最小的项目本质上也用到了服务治理相关的东西,就是nginx。nginx本身不处理业务逻辑。它做了什么事情呢?服务发现,负载均衡。我自己觉得与其将其归类为一个具体的服务组件,划分为服务治理组件更为合适。nginx的服务发现大家都知道是在upstream里配置的,可以做DNS动态解析。服务更变修改配置文件后用nginx -s reload让nginx发现最新的配置,可以说是一个轻巧简单的服务发现机制。nginx的负载均衡大家说的比较多了,我就不详述了。但是它做负载均衡的前提是它还实现了服务的分离。它可以将前端静态请求转发到静态服务上,动态api转发到api服务上,rpc调用转发到rpc服务上。nginx的服务治理能力还体现在所有这些分离的服务,请求的log都是走nginx服务,我们可以更方便的观察监控请求,所以相对于分散的服务有更好的治理能力的。
服务再大一些,就是用到另一个大家熟知的东西,就是zookeeper来做配置变更管理。有一本书叫做《从paxos到zookeeper》讲了zookeeper的内部实现,怎样保证其一致性和分区一致性。但是zookeeper的最大问题是网络抖动对其的影响。为了解决这个问题,美团.点评的OCTO服务治理框架采用了本地代理。
服务自动扩容缩容对于美团.点评这样的,交易时间高峰基本在中午11点到13点。这段时间交易量大,实际上是需要扩容来保证的。交易量低的时段机器闲置造成很大的资源浪费。这种自动扩容缩容需要区分是正常的请求扩容还是异常请求扩容。一个环节扩容会不会给其他环节造成更大的压力,反而压垮整个链路。如果是异常请求,这个时候应该采用的是拒绝请求。比如有数据库慢查询,显示调用结果是线程池满了,要排队。如果这时候采取了扩容,反而压垮数据库。这时候应该是报警而不是扩容。
在乐视的时候,阿里的阳哥自己开发了一个基于redis的异常日志收集器。这个其实也属于服务治理的范畴,这是一个统一的服务监控报警机制。报警是触发门槛很低的异常处理机制。所以我在乐视的时候邮件,手机短信报警太多了,我就想换了工作再也不用收这些报警了。结果,好吧,换工作后多了N倍。异常再达到一定量级,可能会触发过载保护。过载保护再不解决问题就要降级了。我之前博客里也提到的乐视用guava的RateLimiter做了限流,这就是过载保护的一种方式。