上QQ阅读APP看书,第一时间看更新
1.7.2 什么是服务网格
相对于1.7.1节提到Common包,服务网格有如下特点。
·作为应用程序间通信的中间层。
·轻量级网络代理。
·应用程序无感知。
·解耦应用程序的重试/超时、监控、追踪和服务发现。
可见,服务网格的本质是一种代理,请求在微服务之间调用的过程中增加了一层代理来进行路由,而为了降低代理对微服务的侵入性,代理往往通过Sidecar的形式运行,类似于Spring的AOP,只不过这个切面增强不是在某段代码里,而是在统一的Java进程外,这样众多Sidecar之间形成了一个庞大的切面网络,我们形象地称之为服务网格,如图1-14所示。
图1-14 服务网格示意图
服务网格涉及两个概念,一个是数据平面,另一个是控制面。图1-14中的Sidecar就是数据面,通过接收控制面发送的路由与控制信息来定向转发或处理数据。数据面通常有如下职责。
·服务发现:发现后端服务实例中哪些是可用的。
·健康检查:定时向服务发送心跳,探测服务实例是否存活。
·鉴权:对于访问的请求,通过加解密来验证访问是否合法。
·负载均衡:对于多个下游服务,均衡分配流量。
·流量统计:对于每个请求,每分钟的流量,trace信息如何统计。
·熔断限流:确定最大QPS(Queries-Per-Second,每秒查询率)、最大并发数,以及何时拒绝请求。
数据面主要接收系统中的每一个包和请求,具体什么时间进行熔断限流、如何确认服务是否健康,这些逻辑关系都需要控制面的支持。目前业界常见的数据面有Linkerd、Envoy、HAProxy、Nginx,控制面有Istio、SmartStack等。