Service Mesh 是什么?在微服务架构中怎么体现其价值?
Service Mesh(服务网格)是一个基础设施层,让服务之间的通信更安全、快速和可靠。如果你在构建云原生应用,那么就需要 Service Mesh。
Service Mesh 已经成为云原生技术栈里的一个关键组件。很多拥有高负载流量业务的公司都在他们的生产应用里加入了 Service Mesh。但是 Service Mesh 是什么?微服务架构中怎么体现其价值?
这篇文章将给出 Service Mesh 的定义,并追溯过去 Service Mesh 在应用架构中的演变过程。解释 Service Mesh 与 API 网关、边缘代理(Edge Proxy)和企业服务总线之间的区别。最后描述今后它的发展。
Service Mesh是什么?
Service Mesh 是用于处理服务间通信的基础设施层。它负责通过构成现代云原生应用程序的复杂拓扑结构来可靠地传递请求。
Service Mesh 通常被实现为与应用程序代码一起部署的轻量级网络代理的阵列,而不需要应用程序需要知道。
Service Mesh 作为一个单独的层的概念与云原生应用程序的兴起息息相关。在云原生模型里,单个应用程序可能由数百个服务组成; 每个服务可能有数千个实例; 而且这些实例中的每一个都可能处于不断变化的状态,因为它们是动态调度一个像 Kubernetes 一样的编排器。服务间通信不仅异常复杂,而且也是运行时行为的基础。管理好服务间通信对于保证端到端的性能和可靠性来说是非常重要的。
Service Mesh 是位于 TCP / IP 之上的抽象层的网络模型。 它假设底层的 L3 / L4 网络存在并且能够从点到点传送字节。(它也假定这个网络和环境的其他方面一样是不可靠的;因此 Service Mesh 也必须具备处理网络故障的能力)。
Service Mesh 有点类似 TCP/IP。TCP 对网络端点间传输字节的机制进行了抽象,而 Service Mesh 则是对服务节点间请求的路由机制进行了抽象。
像 TCP 一样,Service Mesh 不关心实际的有效载荷或者它的编码方式。应用程序的目标是“将某些东西从 A 传送到 B”,而 Service Mesh 所要做的就是实现这个目标,并处理传送过程中可能出现的任何故障。
与 TCP 不同的是,Service Mesh 有着超越“只是能工作”的更高的目标:为应用运行时提供统一的、应用层面的可见性和可控性。Service Mesh 的明确目标是将服务通信从隐形的,隐含的基础设施的领域转移到生态系统的一流成员的角色中,在那里它可以被监控,管理和控制。
ServiceMesh 能做什么?
Service Mesh 作为透明代理,它可以运行在任何基础设施环境,而且跟应用非常靠近,那么,Service Mesh 能做什么呢?
1. 负载均衡:运行环境中微服务实例通常处于动态变化状态,而且经常可能出现个别实例不能正常提供服务、处理能力减弱、卡顿等现象。
但由于所有请求对 Service Mesh 来说是可见的,因此可以通过提供高级负载均衡算法来实现更加智能、高效的流量分发,降低延时,提高可靠性。
2. 服务发现:以微服务模式运行的应用变更非常频繁,应用实例的频繁增加减少带来的问题是如何精确地发现新增实例以及避免将请求发送给已不存在的实例变得更加复杂。
Service Mesh 可以提供简单、统一、平台无关的多种服务发现机制,如基于 DNS,K/V 键值对存储的服务发现机制。
3. 熔断:动态的环境中服务实例中断或者不健康导致服务中断可能会经常发生,这就要求应用或者其他工具具有快速监测并从负载均衡池中移除不提供服务实例的能力。
这种能力也称熔断,以此使得应用无需消耗更多不必要的资源不断地尝试,而是快速失败或者降级,甚至这样可避免一些潜在的关联性错误。而 Service Mesh 可以很容易实现基于请求和连接级别的熔断机制。
4. 动态路由:随着服务提供商以提供高稳定性、高可用性以及高 SLA服务为主要目标,为了实现所述目标,出现各种应用部署策略尽可能从技术手段达到无服务中断部署,以此避免变更导致服务的中断和稳定性降低。
例如:Blue/Green部署、Canary部署,但是实现这些高级部署策略通常非常困难。关于应用部署策略,可参考 EtienneTremel的文章,他对各种部署策略做了详细的比较。
而如果运维人员可以轻松的将应用流量从 staging 环境到产线环境,一个版本到另外一个版本,更或者从一个数据中心到另外一个数据中心进行动态切换,甚至可以通过一个中心控制层控制多少比例的流量被切换。
那么 Service Mesh 提供的动态路由机制和特定的部署策略如 Blue/Green 部署结合起来,实现上述目标更加容易。
5. 安全通讯:无论何时,安全在整个公司、业务系统中都有着举足轻重的位置,也是非常难以实现和控制的部分。而微服务环境中,不同的服务实例间通讯变得更加复杂,那么如何保证这些通讯是在安全、授权情况下进行非常重要。
通过将安全机制如 TLS 加解密和授权实现在 Service Mesh 上,不仅可以避免在不同应用的重复实现,而且很容易在整个基础设施层更新安全机制,甚至无需对应用做任何操作。
6. 多语言支持:由于 Service Mesh 作为独立运行的透明代理,很容易支持多语言。
7. 多协议支持:同多语言支持一样,实现多协议支持也非常容易。
8. 指标和分布式追踪:Service Mesh 对整个基础设施层的可见性使得它不仅可以暴露单个服务的运行指标,而且可以暴露整个集群的运行指标。
9. 重试和最后期限:Service Mesh 的重试功能避免将其嵌入到业务代码,同时最后期限使得应用允许一个请求的最长生命周期,而不是无休止的重试。
为什么选择 Service Mesh?
Service Mesh 并非新出现的功能。Web 应用程序一直需要自己管理复杂的服务间通信, Service Mesh 的起源可以追溯到过去十五年来这些应用的发展。
2000 年左右的中型 Web 应用一般使用了三层模型:应用逻辑层、Web 服务逻辑层和存储逻辑层。层与层之间的交互虽然复杂,但范围有限,毕竟一个请求最多只需要两个跳转。虽然这里不存在“网格”,但仍然存在跳转通信逻辑。
随着规模的增长,这种架构就显得力不从心了。像 Google、Netflix、Twitter 这样的公司面临着大规模流量的需求,他们实现了云原生应用的前身:应用层被拆分为多个服务(也叫作微服务),层级成了一种拓扑结构。这样的系统需要一个通用的通信层,以一个“富客户端”包的形式存在,如 Twitter 的 Finagle、Netflix 的 Hystrix 和 Google 的 Stubby。
在许多方面,像 Finagle、Stubby 和 Hystrix 这样的包就是最初的 Service Mesh。
虽然他们特定于周围环境的细节,并要求使用特定的语言和框架,但它们是用于管理服务对服务通信的专用基础架构的形式,(对于开源的 Finagle 和 Hysterix 库 )在其原籍公司之外使用。
快速转到现代云原生应用程序。 云原生模式将许多小型服务的微服务方法与另外两个因素相结合:容器(例如,提供资源隔离和依赖管理的 Docker),以及将底层硬件抽象为同质池的编排层(例如 Kubernetes)。
这三个组件允许具有自然机制的应用程序在负载下进行缩放,并处理云环境的永久存在的局部故障。 但是,数百个服务或数千个服务,以及一个不时重新调度实例的编排层,单个请求通过服务拓扑所遵循的路径可能非常复杂,并且由于容器使得每个服务都可以很容易地写入 用不同的语言,之前的方法已经不再可行了。
这种复杂性和重要性的结合激发了对与应用程序代码分离的服务到服务通信的专用层的需求,并且能够捕获底层环境的高度动态性质。 这一层是 Service Mesh。
Service Mesh 今后如何发展
虽然云原生生态系统中 Service Mesh 的采用正在迅速增长,但是还有一个广泛而令人兴奋的发展路线值得探索。 对无服务器计算(例如 Amazon 的 Lambda)的要求直接适用于 Service Mesh 的命名和链接模型,并形成其在云原生生态系统中的角色的自然延伸。 服务标识和访问策略在云原生环境中的作用仍然很新颖,Service Mesh 在这里扮演着重要角色。像之前的 TCP / IP 这样的服务 Service Mesh 继续被推进到底层基础架构中。 就像 Linkerd 从 Finagle 这样的系统发展而来,作为单独的用户空间代理的服务的当前版本必须明确地添加到云原生堆栈中,这个代理也将继续发展。
结论
Service Mesh 是云原生技术栈中一个非常关键的组件。Linkerd 项目已是 CNCF 的官方正式项目,已有了众多的贡献者和用户。Linkerd 的用户横跨初创公司到大规模的互联网公司,按照目前的趋势,接下来它应该有一个快速的发展。我相信 Service Mesh 在微服务或者云原生应用领域一定别有一番天地。