传统单体应用的局限性说明
- 传统单体应用代码体量庞大繁杂,不利于理解,也不利于团队合作开发,更不利于频繁更新和部署,增加服务宕机的风险。
- 耦合性高,功能代码块之前很容易造成强依赖,只要其中任何一个代码逻辑发生更改,将重新部署整个应用。
- 扩展性差,单体应用只能横向扩展,随着功能越来越多,单个应用代码会越来越臃肿冗余,扩展的时候也只能把整个代码部署多个实例。
- 不利于基础设施的资源分配,比如根据CPU密集型,IO密集型等不同类型应用类型资源消耗来进行单独扩展优化。
- 技术栈受限,可能会迫使开发人员长期专注于一种技术栈,如果后期要引入新的技术栈可能需要修改整个代码逻辑,工作量和技术难度巨大。
微服务架构的优点与不足
从单体应该的局限性看出,一个成熟健康的开发团队,不应该把业务逻辑都构建在一个应用中,随着技术架构的不断演化,就有了后来的微服务架构。
经过一系列复杂和长期的拆分之后,由多个微服务构建的复杂系统,彼此通过网络进行通信,很好地解决了单体应用的一系列难题。但是随着业务体量越来越大,业务逻辑也越来越复杂,微服务的弱点也随之显现。下面就总结了微服务架构的一些优点和缺点。
优点:
- 通过分解巨大单体式应用为多个服务方法解决了复杂性问题,每个微服务相对较小;
- 每个单体应用不局限于固定的技术栈,开发者可以自由选择开发技术,提供API服务;
- 每个微服务独立的开发,部署,方便灵活;
- 功能逻辑单一,很简单,只关注于一个业务模块;
- 易于团队协作,多个开发团队并行开发,每个团队负责一块业务模块;
- 服务之间耦合性低,一个服务宕机不会影响其他的服务。
缺点:
- 开发者需要应对创建分布式系统产生的额外的技术复杂度;
- 测试团队需要针对单个应用逐个测试,工作更加复杂;
- 需要采用服务间的通讯机制,需要提前规划好统一的接口规范;
- 需要保证复杂网络环境中微服务间的可靠通信,提高SLA的复杂度;
- 很难在不采用分布式事务的情况下跨服务实现业务功能;
- 跨服务实现要求功能要求团队之间的紧密协作;
- 部署复杂大量提升,对运维团队的技术水平也有所提高;
- 为了达到合理的业务健壮性,可能需要分配更多的基础设施资源。
什么是 Service Mesh
Service Mesh 最早使用由开发 Linkerd 的 Buoyant 公司提出,并在内部使用。2016 年 9 月 29 日第一次公开使用这个术语。2017 年的时候随着 Linkerd 的传入,Service Mesh 进入国内技术社区的视野。Service Mesh 的定义是由 Linkerd 的 CEO William 给出来的。Linkerd 是业界第一个 Service Mesh 服务,最早翻译为“服务啮合层”,这个词比较拗口。后来改成了服务网格。服务网格是一个基础设施层,处理服务间通信,实现请求的可靠传递。在实践中,服务网格通常实现为轻量级网络代理,通常与应用程序绑定在一起进行部署,但是对应用程序是透明的。客户端应用实例作为请求发起者,会首先使用远程调用方式将请求发送到本地的 Service Mesh 实例。Service Mesh 实例之间会完成完整的服务间调用流程,如服务发现,负载均衡,最后将请求发送给目标服务。这种应用程序和Service Mesh实例之间的部署方式称为 Sidecar 模式。Sidecar 这个词一般中文称为边车,一个开一个坐的那种。

应用服务之间调用时, Service Mesh 这一层被称之为服务间通讯专用基础设施层。Service Mesh 会接管整个网络,把所有的请求在服务之间做转发。在这种情况下,应用服务不再负责传递请求的具体逻辑,只负责完成业务处理。服务间通讯的环节就从应用里面剥离出来,呈现出一个抽象层。

如果有大量的应用服务,就会表现出来网格的形态。图中左边绿色方格是应用,右边蓝色的方框是 Service Mesh,蓝色之间的线条是表示服务之间的调用关系。sidecar 之间的连接就会形成一个网络,这个就是服务网格名字的由来。
为什么要用Service Mesh
Service Mesh作为透明代理,它几乎可以运行在任何基础设施环境,跟应用绑定在一起,功能非常强大。
- Service Mesh使得微服务运行时具有下列性能。
- 可见性(visiblity):运行时指标、分布式跟踪。
- 可管理性(manageablity):服务发现、负载均衡、运行时动态路 由。
- 健壮性(resilience):超时重试、请求最后期限、熔断机制。 ·安全性(security):服务间访问控制、TLS加密通信。
- 安全性(security):服务间访问控制、TLS加密通信。
下面针对这些特性分别介绍:
负载均衡
实际运行环境中服务实例通常处于动态变化状态,比如在代码发布,硬件故障,网络变动,访问压力增加等情况都有可能导致个别或者部分实例不能正常提供服务的情况。但由于所有网络请求对Service Mesh来说都是可见的,因此可以通过提供高级负载均衡算法来实现更加智能、高效的流量分发,提高可靠性。
服务发现
以微服务模式运行的应用变更非常频繁,应用实例的频繁增加或减少带来的问题就是如何精确地发现新增实例以及避免将请求发送给已不存在的实例变得更加复杂。Service Mesh可以提供简单、统一、 平台无关的多种服务发现机制,如基于DNS、K/V键值对存储的服务发现机制。
熔断
服务实例中断或者不健康导致服务中断可能时有发生,这就要求应用或其他工具具有快速监测并从负载均衡池中移除不提供服务实例的能力,这种能力也称熔断,以此使得应用无需消耗更多不必要的资源不断地尝试,而是快速失败或者降级,甚至这样可避免一些 潜在的关联性错误。
动态路由
随着服务提供商以提供高稳定性、高可用性以及高SLA 服务为主要目标,为了实现所述目标,出现各种应用部署策略尽可能从技术手段达到无服务中断部署,例如蓝绿部署和金丝雀部署,但是传统部署框架实现这些高级部署策略通常非常困难。
Service Mesh提供的动态路由机制和特定的部署策略让上述目标的实现变得更加容易。维人员可以轻松地将应用流量从staging环境切换到产线环境,一个版本切换到另外一个版本,甚至可以通过一个中心控制层控制多少比例的流量被切换。
安全通信
无论何时,安全在整个公司、业务系统中都有着举足轻重的位置,也是非常难以实现和控制的部分。而微服务环境中,不同的服务实例间通信变得更加复杂,那么如何保证这些通信是在安全、有授权的情况下进行就非常重要。通过将安全机制如TLS加解密和授权实现在 Service Mesh上,不仅可以避免在不同应用上的重复实现,而且很容易在整个基础设施层更新安全机制,甚至无需对应用做任何操作。
多语言支持
由于Service Mesh作为独立运行的透明代理,跟应用程序编程语言无关,可以支持任何一种编程语言。
多协议支持
不通框架支持的协议不一样,Istio支持:HTTP/1.1、HTTP/2、gRPC、TCP等,Linkerd支持HTTP/2和gRPC等。
指标和分布式追踪
Service Mesh对整个基础设施层的可见性使得它不仅可以暴露单个服务的运行指标,而且可以暴露整个集群的运行指标。
重试和最后期限
Service Mesh的重试功能避免将其嵌入到业务代码,同时最后期限使得应用允许一个请求的最长生命周期,而不是无休止的重试。
常见Service Mesh产品
1、Linkerd
Linkerd是Buoyant公司2016年率先开源的高性能网络代理程序,是业界的第一款Service Mesh产品,甚至可以说Linkerd的诞生即Service Mesh时代的开始,其引领后来Service Mesh的快速发展。其主要用于解决分布式环境中服务之间通信面临的一些问题,比如网络不可靠、不安全、 延迟丢包等问题。Linkerd具有快速、轻量级、高性能等特点,每秒以最小的时延及负载处理万级请求,易于水平扩展,经过产线测试及验证,可运行任何平台的产线级Service Mesh工具。Linkerd除了具有上述所阐述的Service Mesh的功能外,还具有下列特性。
- 支持多平台,可运行于多种平台,比如Kubernetes、DC/OS、 Docker甚至虚拟机或者物理机。
- 无缝集成多种服务发现工具。
- 支持多协议,如gRPC、HTTP/2、HTTP/1.x。
- 支持与第三方分布式追踪系统Zipkin。
- 灵活性、扩展性高,可通过其提供的接口开发自定义插件。
除此之外,据不完全统计,超过50家公司在产线使用Linkerd,应该 是目前产线使用最多的Service Mesh产品。还有,Linkerd是CNCF官方支持的项目之一。
2、Envoy
Envoy也是一款高性能的网络代理程序,于2016年10 月份由Lyft公司开源,为云原生应用而设计,可作为边界入口,处理外部流量,当然,也作为内部服务间通信代理,实现服务间可靠通信。Envoy 的实现借鉴现有产线级代理及负载均衡器,如Nginx、HAProxy、硬件负载 均衡器及云负载均衡器的实践经验,基于Lyft公司产线实 践证明,Envoy性能非常优秀、稳定。Envoy既可用作独立代理层运行,也可作为Service Mesh架构中数据平面层,因此通常Envoy跟服务运行在一 起,将应用的网络功能抽象化,Envoy提供通用网络功能,实现平台及语言无关。作为Service Mesh工具,Envoy除了支持上述Service Mesh的功能外,还有下列特性。
- 大规模负载下,Envoy保证P99延时非常低。
- 优先支持HTTP/2和gRPC,同时支持Websocket和TCP代理。
- API驱动的配置管理方式,支持动态管理、更新配置以及无连接和 请求丢失的热重启功能。
- L3/L4层过滤器形成Envoy核心的连接管理功能。
- 通过与多种指标收集工具及分布式追踪系统集成,实现运行时指标 收集,分布式追踪,提供整个系统及服务的运行时可见性。
- 内存资源使用率低,sidecar是Envoy最常用的部署模式。
目前,Envoy已经在Lyft及其他公司如腾讯、Stripe、Twilio等运行于生产环境。 基于Envoy实现的另一款Service Mesh工具Istio可能更广为人知。而且 Envoy也是CNCF官方支持的项目之一。
3、Istio
Istio作为一款开源的为微服务提供服务间连接、管理以及安全保障的平台软件,支持运行在Kubernetes、Mesos等容 器管理工具,但不限于Kubernetes、Mesos,其底层依赖于Envoy。Istio 提供一种简单的方法实现服务间的负载均衡、服务间认证、监控等功能, 而且无需应用层代码调整。其控制平面由Mixer、Pilot及Citadel组成, 数据平面由Envoy实现,通常情况下,数据平面代理Envoy以sidecar模式部署,使得所有服务间的网络通信均由Envoy实现,而Istio的控制平面则 负责服务间流量管理、安全通信策略等功能。由于其底层是Envoy,Envoy 支持的各种功能以及Service Mesh要求的功能Istio均支持,除此之外还 有以下功能。
- 完善的流量管理机制,如故障注入。
- 增强服务间安全保障,如服务身份认证,密钥管理和基于RBAC的访 问控制策略。
- 支持多平台部署。
相对Linkerd和Envoy,Istio在2017年5月才发布,目前处于快速开发及迭代过程中,很多功能还不是很稳定。Istio社区非常活跃,有 Google、IBM、Lyft及其他公司如RedHat的大力支持及推广。
4、Conduit
Conduit于2017年12月发布,作为由 Buoyant继Linkerd后赞助的另一个开源项目。Conduit旨在彻底简化用户在Kubernetes使用服务网格的复杂度,提高用户体验,而不是像Linkerd 一样针对各种平台进行优化。Conduit的主要目标是轻量级、高性能、安 全并且非常容易理解和使用。同Linkerd和Istio,Conduit也包含数据平面和控制平面,其中数据平面由Rust开发,使得Conduit使用极少的内存 资源,而控制平面由Go开发。Conduit依然支持Service Mesh要求的功能,而且还包括以下功能。
- 超级轻量级及极快的性能,亚毫秒级P99延迟。
- 专注于支持Kubernetes平台,提高运行在Kubernetes平台上服务的 可靠性、可见性及安全性。
- 支持gRPC、HTTP/2和HTTP/1.x请求及所有TCP流量。
Conduit以极简主义架构,以零配置理念为中心,旨在减少用户与 Conduit的交互,实现开箱即用。作为Buoyant公司的第二款Service Mesh 软件,其设计依据Linkerd在产线的实际使用经验而设计,其设计目标即专为解决用户管理产线环境运行的分布式应用程序所面临的挑战,并以最 小复杂性作为设计基础。 Conduit正处于不断开发的过程中,目前不建议在生产环境中使用。