谈ServiceMesh服务网格(6.13)

根据Linkerd CEO William Morgan定义,Service Mesh是用于处理服务间通信的基础设施层,用于在云原生应用复杂的服务拓扑中实现可靠的请求传递。在实践中,Service Mesh通常是一组与应用一起部署,但对应用透明的轻量级网络代理。Service Mesh与传统基础设施层不同之处在于,它形成了一个分布式的互连代理网络,以sidecar形式部署在服务两侧,服务对于代理无感知,且服务间所有通信都由代理进行路由。

为什么需要Service Mesh

首先我们看下服务和进程间通信,除了完成基本的消息交互外,还需要关注服务注册发现,代理,路由,流量控制,安全,日志等共性的技术问题。而这些共性技术问题,在前面我们谈微服务架构的时候谈到过,这些不是服务注册中心能够全部解决的,更多的是依赖于微服务网关或API网关来解决这些共性问题。

通过API网关解决这些共性问题是当前的一种主流做法,而这种做法唯一的问题点在哪里呢?即API网关本身又变成了我们微服务架构中的一个中心点,即整个架构体系不再是完全去中心化的架构体系,API网关变成了一个中心点,那么就存在单点故障可能,存在性能瓶颈可能等。

而Service Mesh服务网格可以理解为API网关能力本身下沉到我们实际的服务两侧进行部署,即在部署微服务模块的机器上同时部署ServiceMesh服务网格能力,以达到完全去中心化的目的。

在服务发现模式我们曾经谈到过,一种是类似API网关来实现完全的集中化管理,还有就是客户端嵌入代理和主机独立进程代理模式。而Service Mesh网格是主机独立进程代理模式,即虽然和微服务模块一样部署在服务两侧,但是并不和微服微模块一起打包进行部署,而是独立进程部署。即在一个Server上,可以多个微服务共享一个Service Mesh网格代理端。

参考: https://blog.csdn.net/zl1zl2zl3/article/details/84440685

记得两三年前就谈到过,能否实现ESB类产品的完全去中心化,而ServiceMesh正好是这种完全去中心化的部署架构模式。真正解决整体微服务架构里面的单点故障问题。

ServiceMesh架构

参考: https://blog.csdn.net/zyqduron/article/details/80433995

Service Mesh由data plane构成,其中所有服务通过sidecar代理进行服务通信。(所有代理相互连接形成一个Mesh,Service Mesh由此得名)网格同时包含一个control plane——可以将所有独立的sidecar代理连接到一个分布式网络中,并设置网格还包括一个控制平面——它将所有独立的sidecar代理连接到一个分布式网络中,并设置由data plane指定的策略。

对于ServiceMesh可以理解为在我们部署一个或多个微服务模块的独立Server上,都会同时部署一个Sidecar代理,可以一个业务模块或多个业务模块共享一个代理。代理除了负责服务发现和负载均衡,还负责动态路由、容错限流、监控度量和安全日志等功能,这些功能是具体业务无关的。

Service Mesh是Kubernetes支撑微服务能力拼图的最后一块

参考: http://www.mamicode.com/info-detail-2272290.html

在为什么 kubernetes 天然适合微服务中我们提到,Kubernetes是一个奇葩所在,他的组件复杂,概念复杂,在没有实施微服务之前,你可能会觉得为什么Kubernetes要设计的这么复杂,但是一旦你要实施微服务,你会发现Kubernetes中的所有概念,都是有用的。在我们微服务设计的是个要点中,我们会发现Kubernetes都能够有相应的组件和概念,提供相应的支持。

其中最后的一块拼图就是服务发现,与熔断限流降级。

众所周知,Kubernetes的服务发现是通过Service来实现的,服务之间的转发是通过kube-proxy下发iptables规则来实现的,这个只能实现最基本的服务发现和转发能力,不能满足高并发应用下的高级的服务特性,比较SpringCloud和Dubbo有一定的差距,于是Service Mesh诞生了,他期望讲熔断,限流,降级等特性,从应用层,下沉到基础设施层去实现,从而使得Kubernetes和容器全面接管微服务。

那么我们可以看到,在实施微服务架构中,如果需要对外暴露能力和交互,我们谈到了必须要使用API网关来实现能力的暴露以实现服务代理和服务透明。但是如果一个微服务架构不需要和外部打交道,同时仍然需要实现安全,日志和服务限流能力,那么我们就完全可以考虑采用ServiceMesh服务网格能力来实现,同时和Kubernetes和容器化技术实现集成。