Service Mesh 又译作 “服务网格”,作为服务间通信的基础设施层。
服务网格(Service Mesh)是处理服务间通信的基础设施层。它负责构成现代云原生应用程序的复杂服务拓扑来可靠地交付请求。在实践中,Service Mesh 通常以轻量级网络代理阵列的形式实现,这些代理与应用程序代码部署在一起,对应用程序来说无需感知代理的存在。
Service Mesh 有如下几个特点:
目前两款流行的 Service Mesh 开源软件 Istio 和 Linkerd 都可以直接在 Kubernetes 中集成,其中 Linkerd 已经成为 CNCF 成员。
如果用一句话来解释什么是 Service Mesh,可以将它比作是应用程序或者说微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控。对于编写应用程序来说一般无须关心 TCP/IP 这一层(比如通过 HTTP 协议的 RESTful 应用),同样使用 Service Mesh 也就无须关心服务之间的那些原本通过服务框架实现的事情,比如 Spring Cloud、Netflix OSS 和其他中间件,现在只要交给 Service Mesh 就可以了。
Phil Calçado 在他的这篇博客 Pattern: Service Mesh 中详细解释了 Service Mesh 的来龙去脉:
Service Mesh 的架构如下图所示:
Service Mesh 作为 sidecar 运行,对应用程序来说是透明,所有应用程序间的流量都会通过它,所以对应用程序流量的控制都可以在 serivce mesh 中实现。
下面以 Linkerd 为例讲解 Service Mesh 如何工作,Istio 作为 Service Mesh 的另一种实现原理与 linkerd 基本类似。
Service Mesh 并没有给我们带来新功能,它是用于解决其他工具已经解决过的问题,只不过这次是在以 Kubernetes 为基础的云原生生态环境下的实现。
在传统的 MVC 三层 Web 应用程序架构下,服务之间的通讯并不复杂,在应用程序内部自己管理即可,但是在现今的复杂的大型网站情况下,单体应用被分解为众多的微服务,服务之间的依赖和通讯十分复杂,出现了 twitter 开发的 Finagle、Netflix 开发的 Hystrix 和 Google 的 Stubby 这样的 “胖客户端” 库,这些就是早期的 Service Mesh,但是它们都近适用于特定的环境和特定的开发语言,并不能作为平台级的 Service Mesh 支持。
在 Cloud Native 架构下,容器的使用赋予了异构应用程序更多的可能性,Kubernetes 增强的应用的横向扩容能力,用户可以快速的编排出复杂环境、复杂依赖关系的应用程序,同时开发者又无须过分关心应用程序的监控、扩展性、服务发现和分布式追踪这些繁琐的事情,进而专注于程序开发,赋予开发者更多的创造性。