云原生时代,你应该了解的Service Mesh

Posted 云原生计算

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生时代,你应该了解的Service Mesh相关的知识,希望对你有一定的参考价值。


导读:本文系 Service Mesh 系列文章的第一篇,一步步带读者了解 Service Mesh 的基础概念和前世今生。

后续还将会为读者带来系列 Service Mesh 文章,内容涵盖 Istio 入门体验、Istio 和 Envoy 源码深度解析、服务网格大规模落地经验、服务网格性能优化等,敬请持续关注。


Service Mesh 作为下一代微服务技术的代名词,初出茅庐却深得人心一鸣惊人,大有一统微服务时代的趋势。
那么到底什么是 Service Mesh ?
一言以蔽之:Service Mesh是微服务时代的TCP协议。
有了这样一个感性的初步认知,我们再来看到底什么是 Service Mesh 。
提到 Service Mesh ,就不得不提微服务。根据维基百科的定义:
微服务 ( Microservices ) 是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块 ( Small Building Blocks ) 为基础, 利用模块化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关( Language-Independent/Language agnostic ) 的 API 集相互通信。
目前业界跟微服务相关的开发平台、框架、概念更是不胜枚举:Spring Cloud,Service Fabric ,Linkerd ,Istio ,Envoy ,Consul ,NginMesh ,OSM ...
这些纷繁的产品和 Sevice Mesh 有什么样的关联?哪些属于 Service Mesh 的范畴?
为了理清这些繁复的产品和概念,我们先来了解下微服务和 Service Mesh 技术的历史发展脉络。
了解清楚了技术的主要脉络,就能清晰的知道上述的各个平台、框架属于技术脉络中的哪个结点,其间的关系也就一目了然。
Phil Calçado 的文章《 Pattern: Service Mesh 》,详细的介绍了从开发者视角来看,服务开发模式和 Service Mesh 技术的演化过程, 个人认为是非常经典的学习 Service Mesh 的资料,感兴趣的读者也可以阅读英文原文。这里借用文章绘图和脉络,结合自己的理解并予以简化,试图说清楚 ServiceMesh 的概念和这项技术诞生的历史必然性,读者也可以将本文作为原文的一个简化中文版本来阅读。
时代0:抽象时代

开发人员想象中,不同服务间通信的方式,抽象表示如下:
云原生时代,你应该了解的Service Mesh
时代1:原始通信时代 

然而现实远比想象的复杂,在实际情况中,通信需要底层能够传输字节码和电子信号的物理层来完成,在TCP协议出现之前,服务需要自己处理网络通信所面临的丢包、乱序、重试等一系列流控问题,因此服务实现中,除了业务逻辑外,还夹杂着对网络传输问题的处理逻辑。
云原生时代,你应该了解的Service Mesh
时代2:TCP时代

为了避免每个服务都需要自己实现一套相似的网络传输处理逻辑,TCP协议出现了,它解决了网络传输中通用的流量控制问题,将技术栈下移,从服务的实现中抽离出来,成为操作系统网络层的一部分。
云原生时代,你应该了解的Service Mesh
时代3:第一代微服务

在TCP出现之后,机器之间的网络通信不再是一个难题,以 GFS / BigTable / MapReduce 为代表的分布式系统得以蓬勃发展。这时,分布式系统特有的通信语义又出现了,如熔断限流、负载均衡、服务发现、认证授权、安全加密、trace和监控等等,于是服务根据业务需求来实现一部分所需的通信语义。
云原生时代,你应该了解的Service Mesh
时代4:第二代微服务

为了避免每个服务都需要自己实现一套分布式系统通信的语义功能,随着技术的发展,一些面向 微服务架构的开发框架出现了,如 Twitter 的 Finagle 、 Facebook 的 Proxygen 以及 Spring Cloud 等等,这些框架实现了分布式系统通信需要的各种通用语义功能:如负载均衡和服务发现等,因此一定程度上屏蔽了这些通信细节,使得开发人员使用较少的框架代码就能开发出健壮的分布式系统。
云原生时代,你应该了解的Service Mesh
时代5:第一代Service Mesh

第二代微服务模式看似完美,但开发人员很快又发现,它也存在一些本质问题:
  • 其一,虽然框架本身屏蔽了分布式系统通信的一些通用功能实现细节,但开发者却要花更多精力去掌握和管理复杂的框架本身,在实际应用中,去追踪和解决框架出现的问题也绝非易事;
  • 其二,开发框架通常只支持一种或几种特定的语言,回过头来看文章最开始对微服务的定义,一个重要的特性就是语言无关,但那些没有框架支持的语言编写的服务,很难融入面向微服务的架构体系,想因地制宜的用多种语言实现架构体系中的不同模块也很难做到;
  • 其三,框架以 lib 库的形式和服务联编,复杂项目依赖时的库版本兼容问题非常棘手,同时,框架库的升级也无法对服务透明,服务会因为和业务无关的 lib 库升级而被迫升级。
因此以 Linkerd ,Envoy ,Ngixmesh 为代表的代理模式(边车模式)应运而生,这就是第一代 Service Mesh ,它将分布式服务的通信抽象为单独一层,在这一层中实现负载均衡、服务发现、认证授权、监控追踪、流量控制等等分布式系统所需要的功能,作为一个和服务对等的代理服务,和服务部署在一起,接管服务的流量,通过代理之间的通信间接完成服务之间的通信请求,这样上边所说的三个问题也迎刃而解。
云原生时代,你应该了解的Service Mesh
如果我们从一个全局视角来看,就会得到如下部署图:
云原生时代,你应该了解的Service Mesh
如果我们暂时略去服务,只看Service Mesh的单机组件组成的网络:
云原生时代,你应该了解的Service Mesh
相信现在,大家已经理解何所谓Service Mesh,也就是服务网格了。 它看起来确实就像是一个由若干服务代理所组成的错综复杂的网格。
时代6:第二代Service Mesh

第一代 Service Mesh 由一系列独立运行的单机代理服务构成,为了提供统一的上层运维入口,演化出了集中式的控制面板,所有的单机代理组件通过和控制面板交互进行网络拓扑策略的更新和单机数据的汇报。
这就是以 Istio 为代表的第二代 Service Mesh 。
云原生时代,你应该了解的Service Mesh
只看单机代理组件(数据面板)和控制面板的Service Mesh全局部署视图:
云原生时代,你应该了解的Service Mesh
至此,见证了6个时代的变迁,大家一定清楚了Service Mesh技术到底是什么,以及是如何一步步演化到今天这样一个形态。

现在,我们再回过头来看 Buoyant 的 CEO William Morgan ,也就是 Service Mesh 这个词的发明人,对 Service Mesh 的定义:

服务网格是一个 基础设施层,用于处理服务间通信。云原生应用有着复杂的服务拓扑,服务网格保证 请求在这些拓扑中可靠地穿梭。在实际应用当中,服务网格通常是由一系列轻量级的 网络代理组成的,它们与应用程序部署在一起,但 对应用程序透明
这个定义中,有四个关键词:
  • 基础设施层+请求在这些拓扑中可靠穿梭:这两个词加起来描述了 Service Mesh 的定位和功能,是不是似曾相识?没错,你一定想到了 TCP ;
  • 网络代理:这描述了 Service Mesh 的实现形态;
  • 对应用透明:这描述了 Service Mesh 的关键特点,正是由于这个特点, Service Mesh 能够解决以 Spring Cloud 为代表的第二代微服务框架所面临的三个本质问题。
总结一下,Service Mesh 具有如下优点:
  • 屏蔽分布式系统通信的复杂性(负载均衡、服务发现、认证授权、监控追踪、流量控制等等),服务只用关注业务逻辑;
  • 真正的语言无关,服务可以用任何语言编写,只需和Service Mesh 通信即可;
  • 对应用透明,Service Mesh 组件可以单独升级,解耦架构和业务团队。
当然,Service Mesh 目前也面临一些挑战:
  • Service Mesh 组件以代理模式计算并转发请求,一定程度上会降低通信系统性能,并增加系统资源开销;
  • Service Mesh 组件接管了网络流量,因此服务的整体稳定性依赖于 Service Mesh ,同时额外引入的大量 Service Mesh 服务实例的运维和管理也是一个挑战。
历史总是惊人的相似。为了解决端到端的字节码通信问题,TCP 协议诞生,让多机通信变得简单可靠;微服务时代,Service Mesh 应运而生,屏蔽了分布式系统的诸多复杂性,让开发者可以回归业务,聚焦真正的价值。


作者简介:陈鹏,百度研发工程师,现就职于百度基础架构部云原生团队,主导和参与了服务网格在百度内部多个核心业务的大规模落地,对云原生、Service Mesh、Isito等方向有深入的研究和实践经验。


招聘信息


基础架构部_云原生研发工程
简历投递至:inf-cn-hr@baidu.com


工作描述


  • 设计研发百度集团的 Cloud Native 解决方案和微服务中间件,云原生可观测产品(分布式监控、调用链分析、日志管理),支持百度集团、公有云、行业云

  • 参与开源云原生系统的研发,如 Kubernetes 、Docker 、 Service Mesh 等技术

  • 设计大规模服务运维场景下数据采集&压缩&传输系统、分布式时序数据存储&计算系统、分布式任务执行系统

  • 研发高效的资源调度算法和架构,提升集群资源利用率,提升服务容量和稳定性

  • 探索、研究业界最新的技术方向,开源技术产品,多云生态,提升百度智能云核心竞争力


职责要求


  • php 中至少一门编程语言
    -良好的沟通能力和团队协作精神,严谨的工作态度与高质量意识

    -善于学习新的知识,动手能力强,有强烈的责任心,喜欢钻研技术
    -符合以下条件之一优先考虑:分布式系统理论与实践、云计算相关组件经验、开源社区活跃、项目经验丰富"> 本科及以上学历,熟悉 C/C++、Java 或者 Go 中至少一门语言

  • 熟悉或者了解虚拟化容器技术,有 Kubernetes 、 Mesos 、 Yarn 、 Docker 、 OpenStack 等社区开发经验优先

  • 深刻理解数据结构和算法设计,精通 Java、Go、C/C++、PHP 中至少一门编程语言

  • 良好的沟通能力和团队协作精神,严谨的工作态度与高质量意识

  • 善于学习新的知识,动手能力强,有强烈的责任心,喜欢钻研技术

  • 符合以下条件之一优先考虑:分布式系统理论与实践、云计算相关组件经验、开源社区活跃、项目经验丰富

云原生时代,你应该了解的Service Mesh
点击下面链接 查看历史文章


云原生时代,你应该了解的Service Mesh

扫描下方二维码关注本公众号
了解更多微服务、云原生技术的相关信息




以上是关于云原生时代,你应该了解的Service Mesh的主要内容,如果未能解决你的问题,请参考以下文章

三分钟带你初步了解Service Mesh开源实现之Istio架构

sidecar和servicemesh

云原生银行Service Mesh技术

云原生 | 初试Open Service Mesh (OSM)

云原生Service Mesh探索与实践

云原生核心技术之:Service Mesh(服务网格)