云原生落地:企业级DevOps实践
上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等。