Service Mesh 的实现原理

简介: 【2月更文挑战第20天】

Service Mesh 是一种新型的用于处理服务与服务之间通信的技术,尤其适用以云原生应用形式部署的服务,能够保证服务与服务之间调用的可靠性。在实际部署时,Service Mesh 通常以轻量级的网络代理的方式跟应用的代码部署在一起,从而以应用无感知的方式实现服务治理。


Service Mesh 实现的关键就在于两点:一个是轻量级的网络代理也叫 SideCar,它的作用就是转发服务之间的调用;一个是基于 SideCar 的服务治理也被叫作 Control Plane,它的作用是向 SideCar 发送各种指令,以完成各种服务治理功能。

1、SideCar

在传统的微服务架构下服务调用的原理。可以看下面这张图,服务消费者这边除了自身的业务逻辑实现外,还需要集成部分服务框架的逻辑,比如服务发现、负载均衡、熔断降级、封装调用等,而服务提供者这边除了实现服务的业务逻辑外,也要集成部分服务框架的逻辑,比如线程池、限流降级、服务注册等。

image.png

而在 Service Mesh 架构中,服务框架的功能都集中实现在 SideCar 里,并在每一个服务消费者和服务提供者的本地都部署一个 SideCar,服务消费者和服务提供者只管自己的业务实现,服务消费者向本地的 SideCar 发起请求,本地的 SideCar 根据请求的路径向注册中心查询,得到服务提供者的可用节点列表后,再根据负载均衡策略选择一个服务提供者节点,并向这个节点上的 SideCar 转发请求,服务提供者节点上的 SideCar 完成流量统计、限流等功能后,再把请求转发给本地部署的服务提供者进程,从而完成一次服务请求。

image.png

可以把服务消费者节点上的 SideCar 叫作正向代理,服务提供者节点上的 SideCar 叫作反向代理,那么 Service Mesh 架构的关键点就在于服务消费者发出的请求如何通过正向代理转发以及服务提供者收到的请求如何通过反向代理转发。主要有两种实现方案。

  • 基于 iptables 的网络拦截。这种方案请见下图,节点 A 上服务消费者发出的 TCP 请求都会被拦截,然后发送给正向代理监听的端口 15001,正向代理处理完成后再把请求转发到节点 B 的端口 9080。节点 B 端口 9080 上的所有请求都会被拦截发送给反向代理监听的端口 15001,反向代理处理完后再转发给本机上服务提供者监听的端口 9080。

image.png

  • 采用协议转换的方式。这种方案请见下图,节点 A 上的服务消费者请求直接发给正向代理监听的端口 15001,正向代理处理完成后,再把请求转发到节点 B 上反向代理监听的端口 15001,反向代理处理完成后再发送给本机上的服务提供者监听的端口 9080。

image.png

可见,这两种方案最大的不同之处在于,一个是通过 iptables 网络拦截实现代理转发的,一个是靠直接把请求发送给代理来转发的。基于 iptables 网络拦截的方式,理论上会有一定的性能损耗,但它的优点是从网络层实现调用拦截,能做到完全的业务无感知,所以适合云原生应用。而直接把请求发送给代理的方式,要求代理层加入业务逻辑,才能把请求转发给对应的服务提供者监听的端口。


2、Control Plane

既然 SideCar 能实现服务之间的调用拦截功能,那么服务之间的所有流量都可以通过 SideCar 来转发,这样的话所有的 SideCar 就组成了一个服务网格,再通过一个统一的地方与各个 SideCar 交互,就能控制网格中流量的运转了,这个统一的地方就在 Sevice Mesh 中就被称为 Control Plane。Control Plane 的主要作用包括以下几个方面:


  • 服务发现。服务提供者会通过 SideCar 注册到 Control Plane 的注册中心,这样的话服务消费者把请求发送给 SideCar 后,SideCar 就会查询 Control Plane 的注册中心来获取服务提供者节点列表。
  • 负载均衡。SideCar 从 Control Plane 获取到服务提供者节点列表信息后,就需要按照一定的负载均衡算法从可用的节点列表中选取一个节点发起调用,可以通过 Control Plane 动态修改 SideCar 中的负载均衡配置。
  • 请求路由。SideCar 从 Control Plane 获取的服务提供者节点列表,也可以通过 Control Plane 来动态改变,比如需要进行 A/B 测试、灰度发布或者流量切换时,就可以动态地改变请求路由。
  • 故障处理。服务之间的调用如果出现故障,就需要加以控制,通常的手段有超时重试、熔断等,这些都可以在 SideCar 转发请求时,通过 Control Plane 动态配置。
  • 安全认证。可以通过 Control Plane 控制一个服务可以被谁访问,以及访问哪些信息。
  • 监控上报。所有 SideCar 转发的请求信息,都会发送到 Control Plane,再由 Control Plane 发送给监控系统,比如 Prometheus 等。
  • 日志记录。所有 SideCar 转发的日志信息,也会发送到 Control Plane,再由 Control Plane 发送给日志系统,比如 Stackdriver 等。
  • 配额控制。可以在 Control Plane 里给服务的每个调用方配置最大调用次数,在 SideCar 转发请求给某个服务时,会审计调用是否超出服务对应的次数限制。

image.png

Service Mesh 思想的孕育而生,一方面出于各大公司微服务技术的普及,增加了对跨语言服务调用的需求;另一方面得益于微服务容器化后,采用 Kubernetes 等云平台部署的云原生应用越来越多,服务治理的需求也越来越强烈。Service Mesh 通过 SideCar 代理转发请求,把服务框架的相关实现全部集中到 SideCar 中,并通过 Control Plane 控制 SideCar 来实现服务治理的各种功能,这种业务与框架功能解耦的思想恰好能够解决上面两个问题。

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
|
负载均衡 监控 Cloud Native
|
5月前
|
Kubernetes 网络协议 数据库
在Service Mesh内访问网格外的服务
阿里云服务网格ASM提供了访问外部服务的三种方式,包含设置外部服务访问策略、配置ServiceEntry和设置拦截对外访问的网段。本文介绍如何在服务网格ASM上访问外部服务。
58 0
|
5月前
|
Kubernetes 监控 Cloud Native
k8s 自身原理之 Service
k8s 自身原理之 Service
|
8月前
|
运维 监控 安全
什么是service mesh?
什么是service mesh?
|
10月前
|
Rust Kubernetes 负载均衡
Service Mesh 体系解析
Service Mesh(服务网格)诞生于云原生生态领域的潮流中,虽然大家对这一技术生态充满不确定性,甚至难以接受,然而,如果我们消除外面的“杂声”,细心洞察里面的细节,或许能有不一样的收获,毕竟,所有新技术的出现是为了解决业务痛点,而非是为了一些没用意义的炒作。
306 0
|
Kubernetes 前端开发 应用服务中间件
K8S 集群核心概念 Service_Service 介绍 | 学习笔记
快速学习 K8S 集群核心概念 Service_Service 介绍
103 0
K8S 集群核心概念 Service_Service 介绍 | 学习笔记
|
Kubernetes 监控 Devops
Service Mesh 介绍| 学习笔记
快速学习 Service Mesh 介绍
152 0
|
负载均衡 Kubernetes Cloud Native
对 Service Mesh 望而却步?可能都没理解这一点
Service Mesh 发展已经有 6-7年的时间,很多人对 Service Mesh 只停留在知道的水平上,特别是很多技术人第一次接触到 Service Mesh,看到服务网格的解释,看到 Istio 的架构,对这门技术仍然云里雾里。实际上,劝退大多数人的不是技术,而是概念本身。
175 0
对 Service Mesh 望而却步?可能都没理解这一点
|
负载均衡 监控 网络协议
Service Mesh具有如下优点
Service Mesh具有如下优点
539 0
|
网络协议 Java API
Service Mesh
Service Mesh
217 0