正确入门Service Mesh:起源、发展和现状
阿里妹导读:Service Mesh早已不是一个新兴的概念,但大家对Service Mesh的探索依然火热。本文将依次讲解Service Mesh的定义(什么是Service Mesh)、起因(为什么需要Service Mesh)和现状(Service Mesh的主流实现),希望通过浅显易懂的介绍,尽量帮助大家更好地理解Service Mesh。
文末福利:课程 -【微服务实战:Service Mesh与Istio】
-
原来只需要部署和管理单个应用,现在一下裂变成了好几个,运维管理成本成倍上升。
-
原来各个模块之间的交互可以直接走应用内调用(进程间通信),现在都给拆分到了不同进程甚至节点上,只能使用复杂的RPC通讯。
从概念到落地?不,是从落地到概念。
别废话了,我没工夫听你说这么多,请用一句话跟我解释 Service Mesh 是什么。 好的。A service mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application. In practice, the service mesh is typically implemented as an array of lightweight network proxies that are deployed alongside application code, without the application needing to be aware.
-
“dedicated infrastructure layer”:Service Mesh 不是用来解决业务领域问题的,而是一层专门的基础设施(中间件)。
-
“service-to-service communication”:Service Mesh 的定位很简单也很清晰,就是用来处理服务与服务之间的通讯。
-
“reliable delivery of requests”:服务间通讯为什么需要特殊处理?因为网络是不可靠的,Service Mesh 的愿景就是让服务间的请求传递变得可靠。
-
“cloud native application”:Service Mesh 从一开始就是为现代化的云原生应用而生,瞄准了未来的技术发展趋势。
-
“network proxies”:具体 Service Mesh 应该怎么实现?典型方式都是通过一组轻量级的网络代理,在应用无感知的情况下偷偷就把这事给干了。
-
“deployed alongside application code”:这些网络代理一定是跟应用部署在一起,一对一近距离贴心服务(比房产中介专一得多);否则,如果应用与代理之间也还是远程不靠谱通讯,这事儿就没完了。
想致富,先修路;但大马路可不是给马走的,是给更现代化的汽车。
The Big Bang:大爆炸后的混乱之治。
-
单⼀职责:拆分后的单个微服务,通常只负责单个高内聚自闭环功能,因此很易于开发、理解和维护。
-
架构灵活:不同微服务应用之间在技术选型层面几乎是独立的,可以⾃由选择最适合的技术栈。
-
部署隔离:相比巨无霸单体应用,单个微服务应用的代码和产物体积大大减少,更容易持续集成和快速部署;同时,通过进程级别的隔离,也不再像单体应用一样只能同生共死,故障隔离效果显著提升。
-
独⽴扩展:单体应用时代,某个模块如果存在资源瓶颈(e.g. CPU/内存),只能跟随整个应用一起扩容,白白浪费很多资源。微服务化后,扩展的粒度细化到了微服务级别,可以更精确地按需独立扩展。
毛主席说:自己动手,丰衣足食。
-
服务发现(Service Discovery):解决“我想调用你,如何找到你”的问题。
-
服务熔断(Circuit Breaker):缓解服务之间依赖的不可靠问题。
-
负载均衡(Load Balancing):通过均匀分配流量,让请求处理更加及时。
-
安全通讯:包括协议加密(TLS)、身份认证(证书/签名)、访问鉴权(RBAC)等。
-
重复造轮子:需要编写和维护⼤量非功能性代码,如何集中精力专注业务创新?
-
与业务耦合:服务通讯逻辑与业务代码逻辑混在一起,动不动还会遇到点匪夷所思的分布式bug。
社会主义精神:共享和复用。
-
并非完全透明:程序员们仍然需要正确理解和使⽤这些库,上手成本和出错概率依然很高。
-
限制技术选择:使用这些技术后,应用很容易就会被对应的语⾔和框架强绑定(vendor-lock)。
-
维护成本高:库版本升级,需要牵连应⽤一起重新构建和部署;麻烦不说,还要祈祷别出故障。
Service Mesh:我只是一个搬运工而已。
-
Linkerd:背后公司是Buoyant,开发语⾔使用Scala,2016年1⽉15日初次发布,2017年1⽉23日加入CNCF,2018年5⽉1⽇发布1.4.0版本。
-
Envoy:背后公司是Lyft,开发语言使用C++ 11,2016年9月13日初次发布,2017年9⽉14日加⼊CNCF,2018年3月21日发布1.6.0版本。
-
Istio:背后公司是Google和IBM,开发语言使用Go,2017年5⽉月10日初次发布,2018年3⽉31日发布0.7.1版本。
-
Conduit:背后公司也是Buoyant,开发语言使用Rust和Go,2017年12月5日初次发布,2018年4⽉27日发布0.4.1版本。
-
动态路由:根据上游服务请求参数,确定下游目标服务;除了常规的服务路由策略,Linkerd还可以通过这一层动态路由能力,支持灰度发布、A/B测试、环境隔离等非常有价值的场景。
-
服务发现:确定目标服务后,下一步就是获取对应的实例的地址列表(e.g. 查询service registry)。
-
负载均衡:如果列表中有多个地址,Linkerd会通过负载均衡算法(e.g. Least Loaded、Peak EWMA)选择其中⼀个合适的低延迟实例。
-
执行请求:发送请求到上一步所选择的实例,并记录延迟和响应结果。
-
重试处理:如果请求未响应,则选择另⼀个实例重试(前提:Linkerd知道该请求是幂等的)。
-
熔断处理:如果发往某个实例的请求经常失败,则主动从地址列表中剔除该实例。
-
超时处理:如果请求超期(在给定的deadline时间点之前仍未返回),则主动返回失败响应。
-
可观测性:Linkerd会持续收集和上报上述各种行为数据,包括Metrics和Tracing。
-
高性能:基于本地代码(C++ 11)实现;相比之下,Linkerd是基于Scala编写,肯定要慢不少。
-
可扩展:L4和L7层代理功能均基于可插拔的 Filter Chain 机制(类比 netfilter、servlet filter)。
-
协议升级:支持双向、透明的 HTTP/1 to HTTP/2 代理能力。
-
其他能力:服务发现(符合最终一致性)、负载均衡(支持区域感知)、稳定性(重试、超时、熔断、限速、异常检测)、可观测性(统计/日志/追踪)、易于调试等。
-
Envoy:构成数据平⾯(其他组件共同构成控制平⾯);可被替换为其他代理(e.g. Linkerd, nginMesh)。
-
Pilot:负责流量管理(Traffic Management),提供平台独⽴的服务模型定义、API以及实现。
-
Mixer:负责策略与控制(Policies & Controls),核⼼功能包括:前置检查、配额管理、遥测报告。
-
Istio-Auth:支持多种粒度的RBAC权限控制;支持双向SSL认证,包括身份识别、通讯安全、秘钥管理。
-
轻量快速:Conduit的数据平面是基于原生的Rust语言编写,非常轻量、快速和安全(Rust相比C/C++的最大改进点就是安全性)。单个代理的实际内存消耗(RSS)小于10mb,延迟的p99分位点小于1ms,基本相当于能为应用程序提供免费(无额外开销)的Service Mesh功能。
-
安全保障:Conduit构建之初就考虑了云原生环境的安全性,包括Rust语言内存安全性、默认TLS加密等。
-
端到端可见性:Conduit可以自动测量和聚合服务的成功率、延迟与请求容量数据,让开发者在无需变更应用代码就能获取到服务的完整行为视图。
-
Kubernetes增强:Conduit为K8s集群添加了可靠性、可见性和安全性,同时给予了开发者对自己应用程序运行时行为的完全控制。
相关链接
[1]https://github.com/linkerd/linkerd
[2]https://buoyant.io/2017/04/25/whats-a-service-mesh-and-why-do-i-need-one/
[3]https://docs.microsoft.com/en-us/azure/architecture/patterns/sidecar
[4]https://philcalcado.com/2017/08/03/pattern_service_mesh.html
技术公开课
【微服务实战】Service Mesh与Istio
Istio作为一个Service Mesh开源项目,其中最重要的功能就是对网格中微服务之间的流量进行管理,包括服务发现、请求路由和服务间的可靠通信。什么是Service Mesh?Istio有哪些功能模块?如何使用Istio来进行流量管理?本课程共 8 个课时,带你了解Service Mesh的概念以及Istio的应用。