当业务服务能力X调用Http服务能力A遇到异常时,服务能力实现框架会自动捕获异常信息,并将系统性异常(Timeout,SocketException等等)以及某些业务异常(基于策略)提交到服务注册中心,这个过程不必等到心跳周期到达而是立即触发的,从而服务注册中心可以实现对这些服务接口的快速隔离。
作者介绍
张真,宜信技术研发中心高级架构师,负责基础系统架构演进与优化、服务治理、监控平台、微服务建设、DevOps平台、自动化测试框架及电子签约、短信、邮件等应用系统。早年就职于IBM中国研发中心,负责IBM WebSphere应用服务器的设计与开发。目前主要关注微服务架构实施,微智能设计思想应用,虚拟化技术应用,共识计算研究。
本文将包括以下内容:
1、经典微服务架构的特点及问题
2、微服务计算平台的设计思想与抽象模型
3、打造微服务计算的基础三件事
4、总结
一、经典微服务架构的特点以及问题
经典的微服务架构一般包含两个部分:API网关,一组微服务。API网关是唯一的请求入口,它还要负责负载均衡,路由编排,失效切换等工作。
经典的微服务架构图(来源网络):
关于经典微服务架构的文章很多,这里重点想分享一些我们实践经典微服务架构的一些问题:
整体看来,经典微服务架构还不够“聪明和智能”,于是我们设计并着手研发新一代微服务计算平台,希望能够让其充分发挥微服务架构的优势和特性。
二、微服务计算平台的设计思想与抽象模型
1、“微智能”的设计思想
“微智能”这个概念起源于智能家居,是目前智能硬件领域的一股创新思想。在提到“智能”这个词,通常是相对人而言,智能家居通过“智”的体现,更好的服务人的生活。于是,我们就思考是否系统或者服务也能体现“智”,如果与微服务相结合,让其更加“聪明”的工作?
先来看看微智能的设计思想:
1)自动发现:即真实的反映现实世界,尽可能利用“自动化”手段捕获现实情况并提取有效”信息”。微服务实际上对原有的单体系统或”重”服务进行了拆分,意味着服务种类以及服务实例个数会成倍增加,依靠人工整理或编排的手段变得笨重滞后。自动发现实现了微服务生命周期管理初始环节的自动化。
2)自我维护:即形成“闭环”反馈回路,将“输入”或“中间”或“结果”信息再反馈到系统中,合并成新的“输入”或“中间”或“结果”信息。真实世界的信息变化很快,为了尽量趋近真实,需要不停的迭代。微服务架构除了更多的服务实例个数(规模增长),也意味着更加“多变复杂”的服务更迭(变更频率增长),自我维护实现了微服务生命周期管理更迭的自动化。
3)自动适应(适配):自动适应拓展了自动发现+自我维护的思想外延,是“智”的体现。根据自动发现的信息适配相应的处理(初次适应);根据自我维护的反馈,不断调整(迭代适应)。比如服务降级的阀值,其实不同时间不同资源使用情况下这个阀值是动态变化的,在数百服务实例的级别都已无法依靠人工来进行调整,而需要每个服务实例依据上下文的环境以及历史状态的分析自主的调节。
所以微智能设计思想的三个核心原则正是构建“智”的微服务计算平台的基础指导思想。
2、“拟社会化”的分布式设计
有了微智能的思想,我们还需要重新认识“服务”。什么是微服务,社群里有很多文章都分享了相关的内容。我们理解服务的“微”体现在:
这里引入一个很有意思的思考:社会是由人(个体)构成的相互协作的群体,每个人都可能具备几种技能,并使用这些技能参与到社会分工协作中去。具备同种技能的人可以一起协作来提高生产效率和提供可靠性高的生产输出;具备不同技能的人可以在某一件事情上进行分工协作,形成生产流水线。
其实可以发现微服务的特性跟人类社会的运作方式很像。服务实例就是个体,服务能力就是技能,允许服务实例具备几种服务能力,具备相同服务能力的实例可以看做同类型的实例,多个同类型实例构成的集群可以实现负载均衡和高可用,不同类型实例可以被编排在一起完成业务流程。我们把这种分布式设计称为“拟社会化”。
“拟社会化”分布式设计抽象图:
“拟社会化”分布式设计的特点:
这里可能有个疑问:为什么允许某个服务计算节点有多个服务能力,这是不是一种“倒退”,不符合微服务的原则?其实主要有两个方面的原因:
这里举两个例子对“拟社会化”分布式设计的应用加以说明。
实践实例一:短信系统是常见的高并发系统,在互联网环境下可能因为各种营销活动引起Peaktime,常规的做法是增加资源,但现实是资源池是有限的,而且多数时候Peaktime会波及整个营销活动链条的系统,这些系统都需要增加资源,很快资源池就分光了。在“拟社会化”的分布式设计下,可以通过服务能力的快速切换,把一些业务休眠或在当前时间段体量小的服务能力的计算资源向Peaktime的服务能力集中,在Peaktime过去以后,又能快速的恢复原集群。同时,可以发现另一个特性的体现:软件定义集群。这个特性会在以后的分享专题中专门说明。
实践实例二:在P2P业务中,线下签约通常是白天进行而晚上无业务,而签约数据的统计工作是T+1的模式,是在晚上进行。传统方式是部署两个完全独立的系统,而“拟社会化”的分布式系统通过复合能力节点,以服务能力切换的方式实现同一套计算资源的复用。
计算节点抽象模型
接下来,就是把微智能思想和拟社会化分布式设计统一起来,构建微服务计算平台的计算节点抽象模型。它遵循以下原则:
计算节点抽象模型:
服务能力是一种计算能力,分为基础服务能力和业务服务能力。
按照以上原则,服务计算节点还提供了三类基础支持:
值得注意的是,服务能力可以被装配或卸载,这个过程分为Soft模式和Hard模式。Soft模式是通过配置的方式,服务能力的实现(例如jar包)还存在;Hard模式就是配置与实现一起装配或卸载。实际应用中,Soft模式更加灵活,服务能力实现的变更可以交给节点升级来做。
当然计算节点自身管理包含工作有很多扩展,要根据实际需求定义。
三、打造微服务计算的基础三件事
微服务计算平台实现服务治理首先要解决三个基础:服务注册与发现,服务监控,服务调用控制。
1、服务注册与发现
1)服务注册
经典的服务注册方法有以下两种:
但它也有如下问题:
我们的服务注册过程是以心跳系统为基础的,服务注册是心跳事务中的一种。实际上服务注册中心是基础服务能力“心跳服务端”的功能,而它的载体是另一个计算节点(如图服务计算节点B),这也是计算节点的对等性体现,因为任何一个具备心跳服务端能力的计算节点都可以作为服务注册中心。
服务注册:常规模式
服务注册:“心跳级联代理”模式
在大规模部署服务计算节点时,往往还会遇到跨大网段,跨机房,跨IDC中心,白名单IP策略等问题。所以心跳系统还支持“心跳级联代理”模式,其作用是允许建立多级的心跳群,每个群由若干“代理”心跳服务端组成,它们只负责转发心跳信息,所以服务注册信息也依靠这个过程进行转发到服务注册中心。
服务注册:多级服务注册中心模式
在某些特殊业务场景下,对服务注册信息更新延迟容忍度较低,这时,让心跳级联的计算节点也作为服务注册中心。如下图,节点B是1级服务注册中心(以下简称1级中心),节点C是2级服务注册中心(以下简称2级中心)。1级中心会存储向自己提交的服务注册信息,也会把这些信息转发到上级服务注册中心。2级中心上可见所有下级中心的服务注册信息。这种模式可以获得更快的服务发现,因为同级的节点发现其他节点服务能力只需经过本级服务注册中心即可,下文会结合服务发现做详细解释。
服务注册中心依靠TTL的方式对服务接口注册信息进行生命周期管理。我们定义生命状态如下:
另一个关键点是服务接口名的定义,它应该是全局唯一的命名,因为在多个服务能力之间互相调用时是以服务接口名为目标的。在服务画像时,会自动生成服务接口名,它提取以下三类信息:
它们共同构成服务接口名,例如:
2)服务发现
服务发现的本质是通过服务接口名查询服务注册中心,服务注册中心基于某些策略返回服务接口可用地址列表,服务调用方也可以基于某些策略来使用地址列表。
微服务计算平台的服务发现过程如下:
在心跳级联代理模式下的服务发现与常规模式类似,这里不做详述。
多级服务中心模式下的服务发现:
上文提到在多级服务注册中心模式下,可以获得更快的服务发现。从心跳客户端的角度来看,其实没有差别,但是如果是查询同级的服务接口,在1级中心立刻查到,无须去2级中心;对于查询跨级的服务接口,则需要从2级中心获取,并会在1级中心缓存,从而加快跨级查询。有一点注意,1级中心的缓存也是TTL的,并且生存周期要短于2级中心,这是性能和时效性的互相适应的结果。因为从1级查缓存虽然快,但是1级中心无法判断跨级服务的存活,所以长时间的缓存可能是错误的信息,缩短TTL时长是为了更快更新跨级服务的地址信息。
服务接口失效的快速反馈:
当业务服务能力X调用Http服务能力A遇到异常时,服务能力实现框架会自动捕获异常信息,并将系统性异常(Timeout,SocketException等等)以及某些业务异常(基于策略)提交到服务注册中心,这个过程不必等到心跳周期到达而是立即触发的,从而服务注册中心可以实现对这些服务接口的快速隔离。而其他打算调用该服务接口的其他服务能力,通过心跳下行获得地址列表更新。这样的方式可以弥补TTL机制可能的延迟。
另外说明一下为什么没有使用Zookeeper类似的长连接(尽管时效性更好),主要有如下原因: