什么是Service Mesh?

自作多情 提交于 2021-02-12 08:40:58

<div id="cnblogs_post_body" class="blogpost-body"><p><span style="font-size: 16px;">&nbsp; &nbsp; 转至大佬宋净明的博客:https://jimmysong.io/posts/what-is-a-service-mesh/</span></p> <p><span style="font-size: 16px;">Service mesh 又译作 “服务网格”,作为服务间通信的基础设施层。Buoyant 公司的 CEO Willian Morgan 在他的这篇文章&nbsp;<a href="https://buoyant.io/2017/04/25/whats-a-service-mesh-and-why-do-i-need-one/">WHAT’S A SERVICE MESH? AND WHY DO I NEED ONE?</a>&nbsp;中解释了什么是 Service Mesh,为什么云原生应用需要 Service Mesh。</span></p> <p><span style="font-size: 16px;">如&nbsp;<a href="https://twitter.com/wm">Willian Morgan</a>&nbsp;所言: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.</span></p> <h2 id="service-mesh的特点"><span style="font-size: 16px;">Service mesh的特点</span></h2> <p><span style="font-size: 16px;">Service mesh 有如下几个特点:</span></p> <ul> <li><span style="font-size: 16px;">应用程序间通讯的中间层</span></li> <li><span style="font-size: 16px;">轻量级网络代理</span></li> <li><span style="font-size: 16px;">应用程序无感知</span></li> <li><span style="font-size: 16px;">解耦应用程序的重试/超时、监控、追踪和服务发现</span></li> </ul> <p><span style="font-size: 16px;">目前两款流行的 service mesh 开源软件&nbsp;<a href="https://istio.io/">Istio</a>&nbsp;和&nbsp;<a href="https://linkerd.io/">Linkerd</a>&nbsp;都可以直接在 kubernetes 中集成,其中 Linkerd 已经成为 CNCF 成员。</span></p> <p>&nbsp;</p> <p>&nbsp;</p> <h3 id="关键点">关键点</h3> <p>&nbsp;</p> <ul style="color: #555555; text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: 'Monospaced Number', 'Chinese Quote', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-weight: 400; margin-top: 0px; margin-bottom: 10px; word-spacing: 0px; white-space: normal; box-sizing: border-box; orphans: 2; widows: 2; background-color: #ffffff; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> <li>服务网格框架用于处理服务间的通信,并提供连接、管理和保护微服务的平台。</li> <li>服务网格通过处理需要复杂编码的功能来帮助应用程序开发人员,例如路由决策,这些决策在网格层级完成,而不是在应用程序中完成。</li> <li>它还提供了可以编入网格的安全策略。例如,您可以设置一个策略,以限制网格中某些服务的入站网络流量。</li> <li>像Istio这样的服务网格可以在Kubernetes平台上无缝工作,但在其他平台上使用还比较麻烦。</li> <li>Sidecar代理使得应用程序与管理服务通信的操作方面有效和可靠。</li> </ul> <p>&nbsp;</p> <p>&nbsp;</p> <h2 id="理解-service-mesh"><span style="font-size: 16px;">理解 Service Mesh</span></h2> <p><span style="font-size: 16px;">如果用一句话来解释什么是 Service Mesh,可以将它比作是应用程序或者说微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控。对于编写应用程序来说一般无须关心 TCP/IP 这一层(比如通过 HTTP 协议的 RESTful 应用),同样使用 Service Mesh 也就无须关系服务之间的那些原来是通过应用程序或者其他框架实现的事情,比如 Spring Cloud、OSS,现在只要交给 Service Mesh 就可以了。</span></p> <p><span style="font-size: 16px;"><a href="http://philcalcado.com/">Phil Calçado</a>&nbsp;在他的这篇博客&nbsp;<a href="http://philcalcado.com/2017/08/03/pattern_service_mesh.html">Pattern: Service Mesh</a>&nbsp;中详细解释了 Service Mesh 的来龙去脉:</span></p> <ol> <li><span style="font-size: 16px;">从最原始的主机之间直接使用网线相连</span></li> <li><span style="font-size: 16px;">网络层的出现</span></li> <li><span style="font-size: 16px;">集成到应用程序内部的控制流</span></li> <li><span style="font-size: 16px;">分解到应用程序外部的控制流</span></li> <li><span style="font-size: 16px;">应用程序的中集成服务发现和断路器</span></li> <li><span style="font-size: 16px;">出现了专门用于服务发现和断路器的软件包/库,如&nbsp;<a href="https://finagle.github.io/">Twitter 的 Finagle</a>&nbsp;和&nbsp;<a href="https://code.facebook.com/posts/1503205539947302">Facebook 的 Proxygen</a>,这时候还是集成在应用程序内部</span></li> <li><span style="font-size: 16px;">出现了专门用于服务发现和断路器的开源软件,如&nbsp;<a href="http://netflix.github.io/">Netflix OSS</a>、Airbnb 的&nbsp;<a href="https://github.com/airbnb/synapse">synapse</a>&nbsp;和&nbsp;<a href="https://github.com/airbnb/nerve">nerve</a></span></li> <li><span style="font-size: 16px;">最后作为微服务的中间层 service mesh 出现</span></li> </ol> <p><span style="font-size: 16px;">Service mesh 的架构如下图所示:</span></p> <p><span style="font-size: 16px;"><img src="https://res.cloudinary.com/jimmysong/image/upload/images/serivce-mesh-control-plane.png" alt="Service Mesh 架构图"></span></p> <p><span style="font-size: 16px;">图片来自:<a href="http://philcalcado.com/2017/08/03/pattern_service_mesh.html">Pattern: Service Mesh</a></span></p> <p><span style="font-size: 16px;">Service mesh 作为 sidecar 运行,对应用程序来说是透明,所有应用程序间的流量都会通过它,所以对应用程序流量的控制都可以在 serivce mesh 中实现。</span></p> <h2 id="service-mesh如何工作"><span style="font-size: 16px;">Service mesh如何工作?</span></h2> <p><span style="font-size: 16px;">下面以 Linkerd 为例讲解 service mesh 如何工作,Istio 作为 service mesh 的另一种实现原理与 linkerd 基本类似,后续文章将会详解 Istio 和 Linkerd 如何在 kubernetes 中工作。</span></p> <ol> <li><span style="font-size: 16px;">Linkerd 将服务请求路由到目的地址,根据中的参数判断是到生产环境、测试环境还是 staging 环境中的服务(服务可能同时部署在这三个环境中),是路由到本地环境还是公有云环境?所有的这些路由信息可以动态配置,可以是全局配置也可以为某些服务单独配置。</span></li> <li><span style="font-size: 16px;">当 Linkerd 确认了目的地址后,将流量发送到相应服务发现端点,在 kubernetes 中是 service,然后 service 会将服务转发给后端的实例。</span></li> <li><span style="font-size: 16px;">Linkerd 根据它观测到最近请求的延迟时间,选择出所有应用程序的实例中响应最快的实例。</span></li> <li><span style="font-size: 16px;">Linkerd 将请求发送给该实例,同时记录响应类型和延迟数据。</span></li> <li><span style="font-size: 16px;">如果该实例挂了、不响应了或者进程不工作了,Linkerd 将把请求发送到其他实例上重试。</span></li> <li><span style="font-size: 16px;">如果该实例持续返回 error,Linkerd 会将该实例从负载均衡池中移除,稍后再周期性得重试。</span></li> <li><span style="font-size: 16px;">如果请求的截止时间已过,Linkerd 主动失败该请求,而不是再次尝试添加负载。</span></li> <li><span style="font-size: 16px;">Linkerd 以 metric 和分布式追踪的形式捕获上述行为的各个方面,这些追踪信息将发送到集中 metric 系统。</span></li> </ol> <h2 id="为何使用-service-mesh"><span style="font-size: 16px;">为何使用 service mesh?</span></h2> <p><span style="font-size: 16px;">Service mesh 并没有给我们带来新功能,它是用于解决其他工具已经解决过的问题,只不过这次是在 Cloud Native 的 kubernetes 环境下的实现。</span></p> <p><span style="font-size: 16px;">在传统的 MVC 三层 Web 应用程序架构下,服务之间的通讯并不复杂,在应用程序内部自己管理即可,但是在现今的复杂的大型网站情况下,单体应用被分解为众多的微服务,服务之间的依赖和通讯十分复杂,出现了 twitter 开发的&nbsp;<a href="https://twitter.github.io/finagle/">Finagle</a>、Netflix 开发的&nbsp;<a href="https://github.com/Netflix/Hystrix">Hystrix</a>&nbsp;和 Google 的 Stubby 这样的 ”胖客户端“ 库,这些就是早期的 service mesh,但是它们都近适用于特定的环境和特定的开发语言,并不能作为平台级的 service mesh 支持。</span></p> <p><span style="font-size: 16px;">在 Cloud Native 架构下,容器的使用给予了异构应用程序的更多可行性,kubernetes 增强的应用的横向扩容能力,用户可以快速的编排出复杂环境、复杂依赖关系的应用程序,同时开发者又无须过分关心应用程序的监控、扩展性、服务发现和分布式追踪这些繁琐的事情而专注于程序开发,赋予开发者更多的创造性。</span></p> <h2 id="参考"><span style="font-size: 16px;">参考</span></h2> <ul> <li><span style="font-size: 16px;"><a href="https://buoyant.io/2017/04/25/whats-a-service-mesh-and-why-do-i-need-one/">WHAT’S A SERVICE MESH? AND WHY DO I NEED ONE?</a></span></li> <li><span style="font-size: 16px;"><a href="http://redmonk.com/jgovernor/2017/05/31/so-what-even-is-a-service-mesh-hot-take-on-istio-and-linkerd">So what even is a Service Mesh? Hot take on Istio and Linkerd</a></span></li> <li><span style="font-size: 16px;"><a href="https://medium.com/attest-engineering/linkerd-a-service-mesh-for-aws-ecs-937f201f847a">linkerd: A service mesh for AWS ECS</a></span></li> <li><span style="font-size: 16px;"><a href="https://istio.io/blog/istio-service-mesh-for-microservices.html">Introducing Istio: A robust service mesh for microservices</a></span></li> <li><span style="font-size: 16px;"><a href="http://blog.christianposta.com/microservices/application-network-functions-with-esbs-api-management-and-now-service-mesh/">Application Network Functions With ESBs, API Management, and Now.. Service Mesh?</a></span></li> <li><span style="font-size: 16px;"><a href="http://philcalcado.com/2017/08/03/pattern_service_mesh.html">Pattern: Service Mesh</a></span></li> <li><span style="font-size: 16px;"><a href="https://istio.doczh.cn/">Istio官方文档中文版</a></span></li> </ul></div>

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!