1.基本概念
中间件解决服务通信和服务治理问题:
服务通信:RPC
服务注册和发现:注册中心
服务平均调用问题:负载均衡
服务熔断、限流和降级:API网关
分布式日志追踪:trace id
2.跨语言体系带来的挑战
跨语言调用存在的问题:
2.1.服务通信协议兼容不同语言(合适的序列化方式)
http是一种通用的网络协议,但是其不具备序列化和反序列化的能力(都解析成string)+对入参和出参没有规定
解决办法:可以使用跨语言的序列化协议(Protobuf、Thrift)
2.2.新语言无法使用之前积累的服务治理策略
(如果有n种语言就需要实现n次SDK(中间件研发团队工作量巨大:负载均衡、熔断降级、流量控制、打印分布式追踪日志等等))
解决办法:将服务治理能力抽象成单独服务进行部署(service mesh)
代理层可以单一的语言实现,所有的流量都经过代理使用其中服务治理策略
3.service mesh如何工作
3.1什么是service mesh(服务间的通信问题)
代理程序称为“Sidecar(边车):服务发现、负载均衡、服务路由、流量控制
可以把业务代码和服务治理的策略隔离开,将服务治理策略下沉,让它成为独立的基础模块(不再依赖SDK,在RPC中增加代理)
将一次网络通信,转换成三次网络通信
3.2Istio
地址:istio.io/
envoy就是Sidecar
先经过控制平面,会造成网络消耗(增加网络调用次数)
envoy=Mixer+Pilot+Istio+auth(数据平面+控制平面)
3.3如何将流量转发到 Sidecar 中
如何无感知引入Sidecar 作为网络代理
实现思路:
3.3.1使用 iptables 的方式来实现流量透明的转发
什么是Iptables:是 Linux 内核中,防火墙软件 Netfilter 的管理工具
优点:对业务完全透明
数据包流转过程依次为 PREROUTING,INPUT,FORWARD,OUTPUT 和 POSTROUTING
数据包为本机,它们也都会流经到 OUTPUT 链
本地实例:服务的节点部署在 9080 端口上,Sidecar 开发的端口是 15001
3.3.2轻量级客户端的方式(推荐)
开发一个新的服务
Cilium实现了通过socket层面进行转发
\
3.4Service Mesh 框架
-
Istio\
-
Linkerd\
-
SOFAMesh\
4.总结
什么是service mesh(业务与通信技术分离),如何在项目中落地
什么是service mesh:Service Mesh = 数据平面(数据传输)+控制平面(服务治理策略的植入)
一般会把服务治理策略植入到数据平面中,控制平面负责服务治理策略数据的下发
实现方式:
1.使用 iptables 实现流量的劫持
2.通过轻量级客户端(指消费者,而不是实际客户端)来实现流量转发
适用场景:
1.多语言服务治理困境
2.快速植入服务治理
iptables:www.zsythink.net/archives/11…