Service Mesh是一个专门处理服务通信的基础设施层。它的职责是在由云原生应用组成服务的复杂拓扑结构下进行可靠的请求传送。在实践中,它是一组和应用服务部署在一起的轻量级的网络代理,且对应用服务透明,服务网格的出现带来了很多变化。
首先,微服务治理与业务逻辑的解耦。服务网格把SDK中的大部分功能从应用中剥离出来,拆解为独立进程,以Sidecar的模式进行部署。服务网格通过将服务通信及相关管控功能从业务程序中分离并下沉到基础设施层,使其和业务系统完全解耦,使开发人员更加专注于业务本身。在SDK中往往需要保留协议编解码的逻辑,甚至在某些场景下还需要一个轻量级的SDK来实现细粒度的治理与监控策略。例如,要想实现方法级别的调用链路追踪,服务网格就需要业务应用实现Trace ID的传递,而这部分实现逻辑也可以通过轻量级的SDK实现。因此,从代码层面来讲,服务网格并非零侵入的。
其次,异构系统的统一治理。随着新技术的发展和人员的更替,即使在同一家公司也会出现不同语言、不同框架的应用和服务。为了统一管控这些服务,以往的做法是为每种语言、每种框架都开发一套完整的SDK,不仅维护成本非常高,而且会给公司的中间件团队带来很大的挑战。有了服务网格之后,可以将主体的服务治理功能下沉到基础设施,多语言的支持就会轻松很多。只需提供一个非常轻量级的SDK,甚至在很多情况下都不需要一个单独的SDK,就可以轻松实现多语言、多协议的统一流量管控、监控等需求。
1、服务网格的优势
- 可观察性。因为服务网格是一个专用的基础设施层,所有的服务间通信都需要通过它,所以它在技术堆栈中处于独特的位置,以便在服务调用级别上提供统一的遥测指标。这意味着,所有服务都被监控为“黑盒”。服务网格捕获诸如来源、目的地、协议、URL、状态码、延迟、持续时间等线路数据。这在本质上等同于Web服务器日志可以提供的数据,但是服务网格可以为所有服务捕获这些数据,而不仅仅是单个服务的Web层。需要指出的是,收集数据只是解决微服务应用程序中可观察性问题的一部分。存储与分析这些数据则需要额外功能的机制补充,并作用于警报或实例自动伸缩等。
- 流量控制。服务网格可以为服务提供智能路由(蓝绿部署、金丝雀发布、A/B测试)、超时重试、熔断、故障注入、流量镜像等各种控制功能。以上这些是传统微服务框架所不具备的功能,但对系统来说是至关重要的功能。这是因为服务网格承载了微服务之间的通信流量,所以可以在服务网格中通过规则进行故障注入,模拟部分微服务出现故障的情况,对整个应用的健壮性进行测试。由于服务网格的设计目的是有效地将来源请求调用连接到其最优目标服务实例中,因此这些流量控制特性是面向目的地的。这正是服务网格流量控制功能的一大特点。
- 安全。在某种程度上,单体架构应用受其单地址空间的保护。然而,一旦单体架构应用被分解为多个微服务,网络就会成为一个重要的入侵面。更多的服务意味着更多的网络流量,这对黑客来说意味着拥有更多的机会来入侵信息流。而服务网格恰恰提供了保护网络调用的功能和基础设施。服务网格安全的相关好处主要体现在以下3个核心领域:服务的认证、服务间通信的加密,以及安全相关策略的强制执行。
2、服务网格的劣势
服务网格拥有极其强大的技术优势,带来了巨大变革,被称为“第二代微服务架构”。然而软件开发没有“银弹”,传统微服务架构有许多痛点一样,服务网格也有它的局限性。
- 增加了复杂度。服务网格将Sidecar代理和其他组件引入已经很复杂的分布式环境中,会极大地增加整体链路和操作运维的复杂性。
- 运维人员需要更专业。在容器编排工具(如Kubernetes)上添加Istio之类的服务网格,需要运维人员成为这两种技术的专家,以便充分使用二者的功能,以及定位环境中遇到的问题。
- 延迟。从链路层面来讲,服务网格是一种侵入性的、复杂的技术,可以为系统调用增加明显的延迟。虽然这个延迟是毫秒级别的,但是在特殊业务场景下,这个延迟可能是令人难以容忍的。
- 平台的适配。服务网格的侵入性迫使开发人员和运维人员适应平台并遵守平台的规则。