中国企业数字化转型进入深水区,业务中台及下一代微服务Service Mesh(服务网格)被越来越多的人关注,本文结合网易轻舟微服务Service Mesh实践,解析业务中台为什么需要Service Mesh,以及实施Service Mesh的技术方案。
业务中台呼唤Service Mesh
当业务系统研发团队至少大几十人(含外包的),需求多变化快,系统又涉及多个领域(比如做ERP、电商的),业务逻辑比较复杂。这时业务中台可以把系统和业务领域划分清楚,提升软件复用能力,加快需求响应速度。
中台是一个独立的组织负责并为多个前台业务服务,因此需要一个标准的服务接口、成熟的服务治理能力和高效的敏捷研发技术,相对于传统的基于ESB(企业服务总线)的面向服务架构(SOA)技术,微服务架构成为业界的共同选择。微服务提供快速迭代、灰度发布、持续交付及声明式运维的特点,与业务中台的追求天然契合。
微服务化也是互联网软件产品发展的必然结果,以网易微服务演进的历程为例,最初的单体应用在业务规模、并发访问量不断增长时,都会被拆分成一些微服务,由不同的小团队维护,以获得研发、部署和运维上的便捷性。
在微服务演进的过程中,不少的企业已经引入Dubbo、Spring Cloud等传统的微服务框架,来解决服务通信的效率,以及服务治理相关的问题。然而,这种传统的微服务框架并不足以应对建设企业业务中台的挑战。作为前台共性业务能力,中台天然需要一个统一的技术栈,实现异构系统整合,以及微服务设施下沉,而这些,是Dubbo或者Spring Cloud力有未逮的。
首先,大型企业或多或少都有统一技术栈的需求,即便都是Java业务,所采用的技术栈也有Dubbo、Spring Cloud以及自研RPC框架之分。其次,有的老的业务采用.Net、C++或者其他语言,需要和新的Java业务整合,难度很大。另外,从架构上看,中台是一种基础设施的下沉,微服务框架则是一种不彻底的下沉,因为它还是在业务开发代码里面的。而这种对业务的侵入性,也造成了服务框架升级的困难。
微服务圈的新贵Service Mesh就是应对上述挑战的曙光。Service Mesh是用以处理服务与服务之间的通信的专用基础设施层,也就是说这种下沉使得服务治理不再和业务代码融合在一起,而是作为一层专用的微服务设施。
Service Mesh具有三个明显的优势:第一它是一个独立的进程,和业务是解耦的,对业务代码无侵入;第二,是具备跨语言特性,上文说的Dubbo和Spring Cloud其实都是Java技术栈,而Service Mesh具备整合一些C++、Golang之类的异构语言应用的能力,因为它没有进入到进程内;第三是它提供了熔断、限流等丰富的微服务服务治理功能。
这些优势,使得Service Mesh可以比较容易地解决中台架构下微服务化存在的问题。对于使用采购或外包模式的传统企业尤其如此。传统企业往往需要将后台的应用进行封装或者重构为中台,来支撑前台灵活的业务变化,自研系统还可以采用Spring Cloud来重构,但采购的系统只能使用封装的模式,而采购的不同系统一般采用.Net、Spring MVC、PHP、Python等不同的技术栈,如果没有Service Mesh,接入微服务体系就会是一场噩梦。
实施Service Mesh的技术方案
Service Mesh先进的理念,是否已经有相应的技术方案?
答案是肯定的。主流云原生Service Mesh框架是Istio,它是谷歌、IBM、Lyft联合开发的。Istio采用Go语言写的,与容器编排系统Kubernetes一脉相承,承载了服务治理方面的期待。因为Kubernetes在容器圈是无可争议的王者,大家比较看好Istio。
Istio提供了完整的Service Mesh的解决方案,数据面是一个叫Envoy的组件,控制面的组件包括Pilot、Mixer、Citadel和Galley等。在下图服务A调用服务B的流程中,支持这种调用的Sidecar就是用Envoy组件来实现的,下半部分是控制面的组件,最主要的是Pilot,其他是配合功能完整性的一些组件。
先看数据面核心组件Envoy。数据面跟微服务本身相关性非常大的,因为所有的流量以及大部分治理都需要经过它。
目前网易和业界不少探索Service Mesh的公司都采用Envoy作为数据面的标准组件,这源于它的七大优势。第一,它是基于现代C++开发的网络L4/L7的代理,这意味着它能够提供很高的性能。根据网易轻舟微服务团队的实测,使用经典的HTTP网络协议,Envoy的性能确实是比较强的。第二是流量管理,Envoy可以对服务流量做路由、分流等动态的管理。第三是服务治理方面的特性,包括熔断、限流,以及在里面注入一些故障。第四是多协议支持,Envoy除了支持比较经典的HTTP 1.x版本,还支持2.x版本,也支持gRPC、TCP、Web Socket等。它不仅可以对服务之间调用的流量进行管理,一些DB、缓存其实也可以做到,因为它是网络4-7层的。第五是负载均衡,Envoy支持的算法非常多。第六是动态配置API,作为一个数据面应该有接口可以动态去控制,让控制面来调用配置。第七是可观察性设计,作为一个数据面应该把经过它的流量和数据上报,让后端更庞大的监控系统看到整个微服务体系到底是一个怎样的状态。最后是支持自定义插件扩展能力的,企业对Envoy本身的功能如果不满足,还可以通过插件进行扩展。
Istio的控制面核心组件是Pilot,它最主要的功能是和Sidecar建立双向的gRPC连接,可以通过控制面实时下发配置或是服务发现的信息,包括服务发现和抽象,以及配置的转化和分发。
另外三个组件,Mixer主要是做策略检查跟遥测,包括检查一些权限,或者通过它上报监控数据。Citadel负责安全性方面,可以做证书与秘钥管理相关的分发。Galley是1.1版本正式引入的,主要做配置校验。这些组件中,业界诟病最多的是Mixer做策略检查操作的时候会有性能问题。