Service Mesh是什么:
Service Mesh是一个基础设施,处理服务间通信,提供服务间通信的各种功能(服务路由,熔断降级,监控上报等)。
Service Mesh诞生的背景:
1.微服务之间的调用关系越来越复杂,服务治理也越来越困难
2.微服务之间存在跨语言调用场景,现有RPC框架支持多语言的情景成本较高(比如Thrift为每种语言都实现了相应的客户端,Dubbo干脆不支持多语言)
3.微服务框架的客户端逻辑越来愈重
4.容器技术的不断普及
Service Mesh解决的问题:
1.中间件和业务绑定在一起,制约着彼此迭代,升级困难。服务治理逻辑的升级迭代应该对业务服务是透明的
2.跨语言成本高,服务治理逻辑、通信逻辑还要实现一遍
3.治理决策比较分散
你会发现Service Mesh真的很像K8S
Service Mesh的规范
Service Mesh 1.0规范通常只包括数据平面,2.0规范通常包括数据平面和控制平面。
service Mesh架构,对比传统RPC架构可以发现,服务化的相关逻辑下沉至了一个独立进程,并增加了负责全局控制的控制平面
SideCar数据平面:
数据平面可以理解为业务服务的代理Proxy(独立进程),和业务服务部署在一起,负责进行服务间(包括微服务与SideCar、SideCar与SideCar、SideCar与Control Plane)的可靠通信、服务路由、向注册中心注册服务、服务发现、上报心跳等。微服务与SideCar之间的通信协也是基于TCP实现的。
Control Plane控制平面:
进行一些全局控制,比如全局监控、热点链路发现、下发动态配置(比如限流配置、鉴权配置、熔断配置等)、下发注册中心数据等,它也是通过基于TCP协议实现的私有通信协议与SideCar进行交互。
由此可见,使用Service Mesh后,一次Rpc请求的流程应该是这样的:调用方业务进程 ->(TCP协议) 调用方SideCar代理 ->(服务路由) 服务方SideCar代理 -> 服务方业务进程
若干个服务组成服务网
Service Mesh的优势
1.对于中间件开发人员:
1.限流、熔断、异常重试、服务发现、路由、鉴权等逻辑只需要在SideCar实现一次即可,不需要每种语言客户端都编写一次。
2.对于业务开发人员:
1.如果你的项目是比较冷门的语言,只要存在相应的客户端,也可以享受到全部的Rpc框架通过的服务,不会出现因语言而导致部分功能不支持的问题
2.中间件的版本迭代不需要改动业务代码
3.标准化、异构化
Service Mesh的问题
1.网络耗时增加,之前是一次通信,现在变成三次。
经过蚂蚁Service Mesh的实践表明,其实这个对于耗时的增长没有特别显著,究其原因,是因为在RPC调用的过程中,网络并不是唯一长耗时的因素,序列化、反序列化(SideCar会尽量避免序列化/反序列化请求的body)、业务逻辑的耗时同样可观,同时由于Service Mesh的推进,顺便优化了老RPC client的服务路由逻辑,综合各种因素,最终,采用Service Mesh并没有显著增加服务耗时(蚂蚁给出的数据是耗时增加7%)
2.吞吐率的下降
业界对Service Mesh的探索:
蚂蚁 MOSN:
https://www.infoq.cn/article/IhCKjgEDOO-YQAAPxesh
蚂蚁是如何提升数据平面的处理性能呢:
1.不关心请求body以减少序列化开销
2.很多地方直接控制内存(相当于使用Unsafe类),最大化的提升性能
3.优化升级服务路由/负载均衡的逻辑
Istio & Envoy:
Envoy仅是数据平面,而Istio基于Envoy实现数据平面,同时增加了控制平面
Envoy作为数据平面,承担了流量控制、负载均衡、熔断等一系列重要功能。作为一个服务代理,它也可以被当作集群网关使用。C++实现,性能很高
Istio的控制平面包括Pilot 、Mixer、Istio-Auth三部分组成
Istio-Auth主要负责配置一些安全及身份认证的信息
Mixer主要负责链路追踪与处理数据平面的监控上报。
Pilot主要负责服务发现和服务路由管理,并负责与Envoy的通信。
当Istio中的Pilot发现服务发生变化(创建/删除新的服务节点或者路由规则),便会通过xDS协议将这种动态配置下发给Envoy,实现服务发现的功能
Enovy有很多资源实体,比如
1.Listener/监听起发现服务LDS:
Listener监听服务端口,接受来自客户端的连接(不论Enovy是作为正向代理还是作为反向代理),每一个Llistener都有唯一的命名,Envoy通过LDS动态获取Listener。
2.Cluster/集群发现服务CDS:
在Envoy中,每个下游服务集群都被抽象成一个Cluster。Cluster包含该服务的连接池、超时时间、地址、端口、类型(相当于接口)等等,Envoy依靠CDS负责获取这些Cluster。
3.Router/路由发现服务RDS
在Enovy中,RDS负责动态获取路由配置
4.Filter/插件
定制化的扩展Envoy的能力
当然,Envoy还支持RLS(速率限制服务,相当于限流组件)、MS(Metric 服务,相当于监控打点)等高级API