什么是服务网格以及为什么我们需要服务网格?

Service Mesh(服务网格)是一个基础设施层,让服务之间的通信更安全、快速和可靠。如果你在构建云原生应用,那么就需要Service Mesh。

在过去的一年中,Service
Mesh已经成为云原生技术栈里的一个关键组件。很多拥有高负载业务流量的公司都在他们的生产应用里加入了Service
Mesh,如PayPal、Lyft、Ticketmaster和Credit Karma等。今年一月份,Service
Mesh组件Linkerd成为CNCF(Cloud Native Computing
Foundation)的官方项目。不过话说回来,Service Mesh到底是什么?为什么它突然间变得如此重要?

在这篇文章里,我将给出Service Mesh的定义,并追溯过去十年间Service
Mesh在应用架构中的演变过程。我会解释Service Mesh与API网关、边缘代理(Edge
Proxy)和企业服务总线之间的区别。最后,我会描述Service Mesh将何去何从以及我们可以作何期待。

什么是Service Mesh?

Service Mesh是一个基础设施层,用于处理服务间通信。云原生应用有着复杂的服务拓扑,Service
Mesh保证请求可以在这些拓扑中可靠地穿梭。在实际应用当中,Service
Mesh通常是由一系列轻量级的网络代理组成的,它们与应用程序部署在一起,但应用程序不需要知道它们的存在。

随着云原生应用的崛起,Service
Mesh逐渐成为一个独立的基础设施层。在云原生模型里,一个应用可以由数百个服务组成,每个服务可能有数千个实例,而每个实例可能会持续地发生变化。服务间通信不仅异常复杂,而且也是运行时行为的基础。管理好服务间通信对于保证端到端的性能和可靠性来说是非常重要的。

Service Mesh是一种网络模型吗?

Service Mesh实际上就是处于TCP/IP之上的一个抽象层,它假设底层的L3/L4网络能够点对点地传输字节(当然,它也假设网络环境是不可靠的,所以Service Mesh必须具备处理网络故障的能力)。

从某种程度上说,Service Mesh有点类似TCP/IP。TCP对网络端点间传输字节的机制进行了抽象,而Service
Mesh则是对服务节点间请求的路由机制进行了抽象。Service
Mesh不关心消息体是什么,也不关心它们是如何编码的。应用程序的目标是“将某些东西从A传送到B”,而Service
Mesh所要做的就是实现这个目标,并处理传送过程中可能出现的任何故障。

与TCP不同的是,Service Mesh有着更高的目标:为应用运行时提供统一的、应用层面的可见性和可控性。Service Mesh将服务间通信从底层的基础设施中分离出来,让它成为整个生态系统的一等公民——它因此可以被监控、托管和控制。

Service Mesh可以做什么?

在云原生应用中传输服务请求是一项非常复杂的任务。以Linkerd为例,它使用了一系列强大的技术来管理这种复杂性:回路断路器、负载均衡、延迟感知、最终一致性服务发现、重试和超时。这些技术需要组合在一起,并互相协调,它们与环境之间的交互也非常微妙。

举个例子,当一个请求流经Linkerd时,会发生如下的一系列事件。

Linkerd根据动态路由规则确定请求是发给哪个服务的,比如是发给生产环境里的服务还是发给staging环境里的服务?是发给本地数据中心的服务还是发给云端的服务?是发给最新版本的服务还是发给旧版本的服务?这些路由规则可以动态配置,可以应用在全局的流量上,也可以应用在部分流量上。在确定了请求的目标服务后,Linkerd从服务发现端点获取相应的服务实例。如果服务实例的信息出现了偏差,Linkerd需要决定哪个信息来源更值得信任。Linkerd基于某些因素(比如最近处理请求的延迟情况)选择更有可能快速返回响应的实例。Linkerd向选中的实例发送请求,并把延迟情况和响应类型记录下来。如果选中的实例发生宕机、没有响应或无法处理请求,Linkerd就把请求发给另一个实例(前提是请求必须是幂等的)。如果一个实例持续返回错误,Linkerd就会将其从负载均衡池中移除,并在稍后定时重试(这个实例有可能只是临时发生故障)。如果请求超时,Linkerd会主动放弃请求,不会进行额外的重试。Linkerd以度量指标和分布式日志的方式记录上述各种行为,然后将度量指标发送给中心度量指标系统。

除此之外,Linkerd还能发起和终止TLS、执行协议升级、动态调整流量、在数据中心之间进行失效备援。

Linkerd的这些特性可以保证局部的弹性和应用层面的弹性。大规模分布式系统有一个共性:局部故障累积到一定程度就会造成系统层面的灾难。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。云原生模型在原先的微服务模型中加入了两个额外的元素:容器(比如Docker)和编排层(如Kubernetes)。容器提供了资源隔离和依赖管理,编排层对底层的硬件进行抽象池化。

这三个组件让应用程序在云环境中具备了伸缩能力和处理局部故障的能力。但随着服务和实例的数量增长,编排层需要无时不刻地调度实例,请求在服务拓扑间穿梭的路线也变得异常复杂,再加上可以使用任意语言来开发不同的服务,所以之前那种“富客户端”包的方式就行不通了。

这种复杂性和迫切性催生了服务间通信层的出现,这个层既不会与应用程序的代码耦合,又能捕捉到底层环境高度动态的特点,它就是Service Mesh。

Service Mesh的未来

尽管Service
Mesh在云原生系统方面的应用已经有了快速的增长,但仍然存在巨大的提升空间。无服务器(Serverless)计算(如Amazon的Lambda)正好需要Service
Mesh的命名和链接模型,这让Service
Mesh在云原生生态系统中的角色得到了彰显。服务识别和访问策略在云原生环境中仍显初级,而Service
Mesh毫无疑问将成为这方面不可或缺的基础。就像TCP/IP一样,Service Mesh将在底层基础设施这条道上更进一步。

结论

Service
Mesh是云原生技术栈中一个非常关键的组件。Linkerd项目在启动一年多之后正式成为CNCF的官方项目,并拥有了众多的贡献者和用户。Linkerd的用户横跨初创公司(如Monzo)到大规模的互联网公司(如PayPal、Ticketmaster、Credit
Karma),再到拥有数百年历史的老牌公司(如Houghton Mifflin Harcourt)。

本文转自d1net(转载)

时间: 2024-10-25 06:37:04

什么是服务网格以及为什么我们需要服务网格?的相关文章

网格应用方案:上海视频网格

随着PC.IPTV和MPEG4 Player等各种视频播放终端的普及,网络视频将成为家庭和个人获取视频信息的重要手段.对普通用户而言,最理想的方式是用户在任何时候能够点播自己喜爱的节目,即能够按需得到服务.就目前而言,视频服务能力的不足,使得画面质量较差或不连续,经常出现"系统忙"或拒绝服务的现象,大大限制了视频服务的进一步发展.因此,从用户的角度看,迫切要解决的问题是能够提供一个大并发能力和高带宽画质的视频服务系统. 就企业而言,当前对高带宽视频服务也提出了越来越高的要求.由于企业的

Windows安装MongoDB服务,提示错误1053:服务没有及时响应启动或控制请求问题答案

将mongodb安装为Windows服务(随windows启动自动执行,在后台运行)有两种方法:第一种方法在windows10上配置成功,但是不适合windows2003:第二种方法在windows2003上配置成功 第一种方法 : 1.编写配置文件mongodb.conf: dbpath=D:\MongoDB\data\db #数据库路径 logpath=D:\MongoDB\data\log\mongodb.log #日志输出文件路径 logappend=true #错误日志采用追加模式,配

服务级后门自己做——创建服务

以往大多数的木马/后门都是通过修改系统ini文件(比如Win.ini,System.ini)或修改注册表的RUN值来实现自启动的,还有更简单的是修改Autobat.exe(老大,地球不适合你,你还是回火星吧),但随着网络用户安全意识的提高,连我家旁边卖茶叶蛋的大妈都知道如何对付这些老方法了.为了适应新时代木马后门技术的发展要求,一种利用Windows NT/2000/XP系统服务的后门产生了,现在的WinShell,WinEggDrop等众人皆知的Telnte扩展后门都利用了这种方式.相信很多小

服务的协作:服务间的消息传递——《微服务设计》读书笔记

很多开发者都表示他们基于HTTP的API是RESTful的.但是,如同Fielding在他的博客中所说,这些API可能并不都是RESTful的.Leonard Richardson为REST定义了一个成熟度模型,具体包含以下4个层次(摘自IBM): 第一个层次(Level 0)的 Web 服务只是使用 HTTP 作为传输方式,实际上只是远程方法调用(RPC)的一种具体形式.SOAP 和 XML-RPC 都属于此类. 第二个层次(Level 1)的 Web 服务引入了资源的概念.每个资源有对应的标

利用阿里云容器服务实现Docker微服务间的负载均衡和服务发现

基于容器服务实现Docker微服务间的负载均衡和自动服务发现的方法 在容器服务上可以通过acsrouting将基于域名的http的服务暴漏出去,而且能够配合健康检查自动的负载均衡和服务发现,当其中一个容器出现问题之后,routing会自动将健康检查失败的容器从后端摘除,所以能做到自动的服务发现. 然而这个是将服务暴漏到外网的,那么服务间如何通过这种方式做到自动的服务发现和的负载均衡呢?容器服务引入了负载均衡的功能,只需要使用.local结尾的域名,并在依赖的服务的external_links中增

winfrom 可以自动更新服务吗 发布在webserver 的服务

问题描述 winfrom 可以自动更新服务吗 发布在webserver 的服务 新建一个webserver服务 发布到 fu wu qi 上面里面写了 一些数据库的操作类 winfrom引用直接用 但是有一定的几率会报 什么到达最大连接池 然后数据库就连不上了 但是重新更新下web服务又可以了 怎么避免呢 或者能够自己更新webserver服务吗

微服务架构中模块划分和服务识别

最近在进行微服务架构的交流和讨论中,除了谈到微服务技术架构外,客户往往更加挂你微服务模块的划分粒度,已经具体的微服务API接口的识别和定义问题,因此这篇文章将重点谈下微服务架构实践过程中的微服务模块划分和服务识别. 首先我们还是再总结在在跨系统间的接口集成中服务的识别和定义方法,可以总结为: 1. 基于流程架构和业务架构,从跨系统交互流程出发,分析业务交互接口点,识别关键的业务服务能力. 2. 基于数据架构和主数据建模分析,识别关键的数据服务能力. 3. 基于技术架构和共性平台层技术组件的分析和

私有云服务将是未来公共云服务的基石

Gartner对公共云计算的定义就是一种计算模式,在这种模式下,具可扩展性和弹性的IT功能作为一种服务,能够通过互联网对外部的多个客户进行交付.同样被定义成计算模式的私有云计算,则是将这种服务能力,通过互联网对特定的客户或者一个客户进行交付. Gartner的资深分析师Tom Bittman表示:云计算的前景指的是现有的IT架构和流程能够轻易被云替代.但是,未来的企业将会是组合型的IT架构.大型企业依旧会让IT部门管理和部署内部的IT资源,而这些资源中的一部分就是私有云.IT部门也将负责IT服务

戴尔服务进入中国市场提升IT服务能力

通信世界网(CWW)3月24日消息戴尔全新的业务部门今天宣布其在中国的详细布局,据了解戴尔服务部由戴尔全球收购佩罗系统公司后组建而成,并购前各公司在华强大的信息技术(IT)服务能力和客户基础成为目前业务的深厚基石. 戴尔服务部旨在提供一系列功能强大的服务,帮助客户减少成本,降低IT环境复杂性,其中包括:支持服务,管理服务,数据中心解决方案,基础架构和软件即服务(SaaS),云服务,外包,应用服务,业务流程服务,以及IT和业务咨询.而在中国,戴尔服务部的能力在收购毕博中国咨询业务后得以进一步增强,