我为啥不看好ServiceMesh

转载自  我为啥不看好ServiceMesh

前言

今年,ServiceMesh(服务网格)概念在社区里头非常火,有人提出2018年是ServiceMesh年,还有人提出ServiceMesh是下一代的微服务架构基础。作为架构师,如果你现在还不了解ServiceMesh的话,是否感觉有点落伍了?

那么到底什么是ServiceMesh?它诞生的背景是什么?它解决什么问题?企业是否适合引入ServiceMesh?根据近年在一线互联网企业的实践和思考,从个人视角出发,我为大家一一解答这些问题。

微服务架构的核心技术问题

在业务规模化和研发效能提升等因素的驱动下,从单块应用向微服务架构的转型(如下图所示),已经成为很多企业(尤其是互联网企业)数字化转型的趋势。

 

在微服务模式下,企业内部服务少则几个到几十个,多则上百个,每个服务一般都以集群方式部署,这时自然产生两个问题(如下图所示):

 

一、服务发现:服务的消费方(Consumer)如何发现服务的提供方(Provider)?

二、负载均衡:服务的消费方如何以某种负载均衡策略访问集群中的服务提供方实例?

作为架构师,如果你理解了这两个问题,可以说就理解了微服务架构在技术上的最核心问题。

三种服务发现模式

服务发现和负载均衡并不是新问题,业界其实已经探索和总结出一些常用的模式,这些模式的核心其实是代理(Proxy,如下图所以),以及代理在架构中所处的位置,

 

在服务消费方和服务提供方之间增加一层代理,由代理负责服务发现和负载均衡功能,消费方通过代理间接访问目标服务。根据代理在架构上所处的位置不同,当前业界主要有三种不同的服务发现模式:

模式一:传统集中式代理

 

这是最简单和传统做法,在服务消费者和生产者之间,代理作为独立一层集中部署,由独立团队(一般是运维或框架)负责治理和运维。常用的集中式代理有硬件负载均衡器(如F5),或者软件负载均衡器(如Nginx),F5(4层负载)+Nginx(7层负载)这种软硬结合两层代理也是业内常见做法,兼顾配置的灵活性(Nginx比F5易于配置)。

这种方式通常在DNS域名服务器的配合下实现服务发现,服务注册(建立服务域名和IP地址之间的映射关系)一般由运维人员在代理上手工配置,服务消费方仅依赖服务域名,这个域名指向代理,由代理解析目标地址并做负载均衡和调用。

国外知名电商网站eBay,虽然体量巨大,但其内部的服务发现机制仍然是基于这种传统的集中代理模式,国内公司如携程,也是采用这种模式。

模式二:客户端嵌入式代理

 

这是很多互联网公司比较流行的一种做法,代理(包括服务发现和负载均衡逻辑)以客户库的形式嵌入在应用程序中。这种模式一般需要独立的服务注册中心组件配合,服务启动时自动注册到注册中心并定期报心跳,客户端代理则发现服务并做负载均衡。

Netflix开源的Eureka(注册中心)[附录1]和Ribbon(客户端代理)[附录2]是这种模式的典型案例,国内阿里开源的Dubbo也是采用这种模式。

模式三:主机独立进程代理

这种做法是上面两种模式的一个折中,代理既不是独立集中部署,也不嵌入在客户应用程序中,而是作为独立进程部署在每一个主机上,一个主机上的多个消费者应用可以共用这个代理,实现服务发现和负载均衡,如下图所示。这个模式一般也需要独立的服务注册中心组件配合,作用同模式二。

 

Airbnb的SmartStack[附录3]是这种模式早期实践产品,国内公司唯品会对这种模式也有探索和实践。

三种服务发现模式的比较

上面介绍的三种服务发现模式各有优劣,没有绝对的好坏,可以认为是三种不同的架构风格,在不同的公司都有成功实践。下表总结三种服务发现模式的优劣比较,业界案例和适用场景建议,供架构师选型参考:

 

服务网格ServiceMesh

所谓的ServiceMesh,其实本质上就是上面提到的模式三~主机独立进程模式,这个模式其实并不新鲜,业界(国外的Airbnb和国内的唯品会等)早有实践,那么为什么现在这个概念又流行起来了呢?我认为主要原因如下:

  1. 上述模式一和二有一些固有缺陷,模式一相对比较重,有单点问题和性能问题;模式二则有客户端复杂,支持多语言困难,无法集中治理的问题。模式三是模式一和二的折中,弥补了两者的不足,它是纯分布式的,没有单点问题,性能也OK,应用语言栈无关,可以集中治理。

  2. 微服务化、多语言和容器化发展的趋势,企业迫切需要一种轻量级的服务发现机制,ServiceMesh正是迎合这种趋势诞生,当然这还和一些大厂(如Google/IBM等)的背后推动有关。

模式三(ServiceMesh)也被形象称为边车(Sidecar)模式,如下图,早期有一些摩托车,除了主驾驶位,还带一个边车位,可以额外坐一个人。在模式三中,业务代码进程(相当于主驾驶)共享一个代理(相当于边车),代理除了负责服务发现和负载均衡,还负责动态路由、容错限流、监控度量和安全日志等功能,这些功能是具体业务无关的,属于跨横切面关注点(Cross-Cutting Concerns)范畴。

 

在新一代的ServiceMesh架构中(下图上方),服务的消费方和提供方主机(或者容器)两边都会部署代理SideCar。ServiceMesh比较正式的术语也叫数据面板(DataPlane),与数据面板对应的还有一个独立部署的控制面板(ControlPlane),用来集中配置和管理数据面板,也可以对接各种服务发现机制(如K8S服务发现)。术语数据面板和控制面板,估计是偏网络SDN背景的人提出来的。

 

上图左下角,每个主机上同时居住了业务逻辑代码(绿色表示)和代理(蓝色表示),服务之间通过代理发现和调用目标服务,形成服务之间的一种网络状依赖关系,控制面板则可以配置这种依赖调用关系,也可以调拨路由流量。如果我们把主机和业务逻辑剥离,就出现一种网格状架构(上图右下角),服务网格由此得名。

 

Istio[附录4]是Google/IBM等大厂支持和推进的一个ServiceMesh标准化工作组,上图是Istio给出的ServiceMesh参考架构。Istio专注在控制面板的架构、功能、以及控制面板和数据面板之间API的标准化,它的控制面板功能主要包括:

  • Istio-Manager:负责服务发现,路由分流,熔断限流等配置数据的管理和下发

  • Mixer:负责收集代理上采集的度量数据,进行集中监控

  • Istio-Auth:负责安全控制数据的管理和下发

Envoy[附录5]是目前Istio主力支持的数据面板代理,其它主流代理如nginx/kong等也正在陆续加入这个阵营。kubernetes是目前Isito主力支持的容器云环境。

我的建议

目前我本人并不特别看好ServiceMesh,也不是特别建议企业在生产上试水ServiceMesh,主要原因如下:

  1. ServiceMesh其实并不是什么新东西,本质就是上面提到的服务发现模式三~主机独立进程模式,这个模式很早就有公司在探索和实践,但是一直没有普遍流行起来,说明这个模式也是存在落地挑战的。从表面上看,模式三是模式一和模式二的折中,同时解决了模式一和模式二存在的问题,但是在每个主机上独立部署一个代理进程,是有很大运维管理开销的,一方面是规模化部署的问题(考虑服务很多,机器也很多的场景);另一方面是如何监控治理的问题,代理挂了怎么办?你的团队是否具备自动化运维和监控的能力?另外开发人员在服务调试的时候,会依赖于这个独立的代理,调试排错比较麻烦,这个问题怎么解决?

  2. Istio的确做了一些标准化工作,但是没有什么特别的创新,可是说换汤不换药,就是把模式三规范化和包装了一下。透过现象看本质,Google/IBM等行业大厂在背后推Isito/ServiceMesh,背后有一些市场利益诉求考虑,例如Google要推进它的kubernates和公有云生态。

  3. ServiceMesh在年初声音比较大,最近渐渐安静下来,我听到国内只有一些大厂(华为,新浪微博,蚂蚁金服等)在试水,实际生产级落地的案例聊聊无几。大多数企业对ServiceMesh只是观望,很多架构师对ServiceMesh实际落地都存在疑虑。

所以我的个人建议,对于大部分企业(一般运维和研发能力不是特别强),采用模式一~集中代理模式就足够了。这个模式比较传统不新鲜,但是在很多一线企业已经切实落地,我甚至认为,除了一些大厂,大部分中小企业的服务发现架构采用的就是集中代理。我本人经历过三家互联网公司,大的有eBay,中等有携程,小的有拍拍贷,都是采用集中式代理模式,而且玩得都很好。我的架构理念很简单,对于生产级应用,不追新,老实采用大部分企业落地过的方案。

模式一的最大好处是集中治理,应用不侵入,语言栈无关,另外因为模式一是集中部署的,不像模式三是分布式部署,所以模式一的运维开销也远小于模式三。对于模式一,大家最大的顾虑是性能和单点问题,其实性能还是OK的,如果架构和容量规划合理的话,实际生产中经过集中代理的性能开销一般可以控制在小于10个ms,eBay和携程等大流量企业的成功实践已经验证了这点。单点问题一般建议采用两层负载结构,例如硬件F5+软件nginx两层负载,F5以主从HA部署,nginx则以集群多实例部署,这种架构兼顾了高可用和配置的灵活性。

另外,模式一还可以和服务注册中心结合,从而降低手工配置的复杂性,实现DevOps研发自助部署,一种方案如下图所示:

 

服务启动时自动注册到服务注册中心并定期报心跳,Proxy则定期到服务注册中心同步实例。这种方式下,不需要为每个服务申请一个域名,只需一个泛域名即可,消费者访问服务时采用服务名+泛域名即可,整个服务上线流程可以做到DevOps研发自助。目前社区流行的一些开源代理如traefik[附录7]和kong[附录8]等都支持和多种服务注册中心(Consul/Eureka/Etcd/Zookeeper等)进行集成。目前这种方案在拍拍贷有初步成功实践,采用kong[附录7]和自研服务注册中心Radar[附录8],同时和容器云调度平台配合,实现了研发全自助式发布上线。

结论

1. 服务注册发现和负载均衡是微服务架构在技术上的根本问题,解决的办法是采用代理Proxy。根据代理在架构上的位置不同,服务发现代理一般有三种模式:

  • 模式一:集中式代理

  • 模式二:客户端嵌入式代理

  • 模式三:主机独立进程代理 这三种模式没有绝对的好还之分,只是三种不同的架构风格,各有优劣和适用场景,在不同企业都有成功落地案例。

2. ServiceMesh本质上就是模式三~主机独立进程代理,它结合了模式一和模式二的优势,但是分布式部署运维管理开销大。Istio对ServiceMesh的架构、功能和API进行了标准化。

3. ServiceMesh还在演进中,生产落地仍有挑战,一般企业不建议生产级使用。集中式代理最成熟,对于一般中小企业,建议从集中式代理开始,等达到一定规模和具备一定的研发运维能力,再根据需要考虑其它服务发现模式。

4. 架构师不要盲目追新,在理解微服务架构原理的基础上,可以学习和试点新技术,但是对于生产级应用,应该以成熟稳定,有大规模落地案例作为选型第一准则。

 

附录:

1、Netflix Eureka

https://github.com/netflix/eureka

2、Netflix Ribbon

https://github.com/netflix/ribbon

3、Airbnb SmartStack

https://medium.com/airbnb-engineering/smartstack-service-discovery-in-the-cloud-4b8a080de619

4、Istio

https://istio.io/

5、Envoy

https://www.envoyproxy.io/

6、Traefik

https://github.com/containous/traefik

7、Kong

https://github.com/kong/kong

8、Radar

https://github.com/ppdai-incubator/radar

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core 2.0 支付宝当面付之扫码支付

前言 自从微软更换了CEO以后,微软的战略方向有了相当大的变化,不再是那么封闭,开源了许多东西,拥抱开源社区,.NET实现跨平台,收购xamarin并免费提供给开发者等等。我本人是很喜欢.net的,并希望.…

Git使用教程:最详细、最傻瓜、最浅显、真正手把手教

转载自 Git使用教程:最详细、最傻瓜、最浅显、真正手把手教 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统。 工作原理 / 流程: Workspace:工作区 Index / Stage:暂存区 Repository&…

【git】如何在github上推送并部署自己的项目

口令快捷 git add . git commit --m "XXXX" git remote add origin https://github.com/lifeload/new-problem.git git push -f origin master修改或删除文件 git add 对应文件/. git commit -m “xxx” git push origin master 1、上传代码 2、设置,建立…

一起聊聊Microsoft.Extensions.DependencyInjection

Microsoft.Extensions.DependencyInjection在github上同样是开源的,它在dotnetcore里被广泛的使用,比起之前的autofac,unity来说,它可以说是个包裹,或者叫适配器,它自己提供了默认的DI实现,同时也支持第三方…

【git】如何给github绑定ssh

首先在git上输入 : ssh-keygen 会在c盘的用户账号的文件夹.ssh上生成两个密钥 (如果没有生成,请注意自己是否按了enter,出现一个小方框为止) 将.pug用笔记本打开 全选复制 来到github的设置上 将刚刚复制的东西黏…

【杭州】Hack for Cloud Beginner微软黑客松大赛

在这美丽的西子湖畔,我们欢迎各行各业的开发者参与此次Hack for Cloud Beginner微软黑客松大赛。我们致力于为开发者们提供在技术、社区领域中的交流平台,重在参与,意于创新。 此次黑客松大赛将于10月22日在中国杭州拉开帷幕,参与…

Java高级开发必会的50个性能优化的细节(珍藏版)

转载自 Java高级开发必会的50个性能优化的细节(珍藏版) 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。 ● 1. 尽量在合适的场合使用单例…

从0部署一个动态网站

准备:购买域名和服务器 下载软件:服务器上下载宝塔面板和xampp 首先区分动态网站和静态网站区别:动态网站是指数据可以交互的,根据不同的人出现不同的页面,要用到数据库和php。登录注册是动态网站最基础的部分 而静态…

最新的.NET Framework聚焦于改进可访问性

Microsoft宣布预发布.NET Framework 4.7.1,其中包括了各种全面的改进。这里,我们关注一下在WPF应用可访问性上所做的改进。改进的设想针对领域是屏幕报读器(Screen Reader)和高对比度场景。Microsoft的Preeti Krishna表示&#xf…

ImageSharp一个专注于NetCore平台图像处理的开源项目

今天大家分享的是一个专注于NetCore平台图像处理的开源项目,老实说为这篇文章取名字想了5分钟,可能是词穷亦或是想更好的表达出这款开源项目的作用;这个项目在图像处理方面有很多功能,如:缩放,裁剪&#xf…

关于 JVM 内存的 N 个问题

转载自 关于 JVM 内存的 N 个问题 JVM的内存区域是怎么划分的? JVM的内存划分中,有部分区域是线程私有的,有部分是属于整个JVM进程;有些区域会抛出OOM异常,有些则不会,了解JVM的内存区域划分以及特征&am…

RedHat宣布支持Azure、.Net Core 2.0和SQL Server 2017

近期,Microsoft和RedHat宣布支持在Red Hat OpenShift上运行Windows容器。此次宣布所针对的主要场景,是让Linux和Windows容器工作于同一集群中。这将使具有混杂环境的企业无需分别运行Windows集群和Linux集群,企业可以迁移到基于容器的同一种架…

安装webpack

全局安装 npm install -g webpack 项目中安装 npm install --save-dev webpack 安装webpack遇到个坑,问题的话应该是项目使用的是webpack2.X版本,这样就会覆盖之前的版本,导致项目配置错误。 所以最好不要用全局安装 cd进相关文件夹后 cnpm …

2017中国开源年会(COSCon'17) 报名正式开启

继成功举办了2015年中国开源年会暨阿帕奇中国路演,及2016年中国开源年会之后,开源社再接再厉主办的2017中国开源年会 (COSCon17-China Open Source Conference 2017) 将于今年11月18-19日(周六-周日)在上海交大闵行校区陈瑞球楼举…

ERROR in multi ./src/main.js dist/bundle.js

原命令 webpack .\src\main.js .\dist\bundle.js 报错 ERROR in multi ./src/main.js ./dist/bundle.js Module not found: Error: Can’t resolve ‘.\dist\bundle.js’ in ‘C:\Users\Tecna1205\Desktop\vue\webpack-study’ multi ./src/main.js ./dist/bundle.js main[1] …

从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置

Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratch 前三部分弄完,我们已经可以对内存数据进行CRUD的基本操作,并且可以在asp.net core 2中集成Nlog了。 下面继续: Ent…

spring cloud+dotnet core搭建微服务架构:配置中心(四)

前言 我们项目中有很多需要配置的地方,最常见的就是各种服务URL地址,这些地址针对不同的运行环境还不一样,不管和打包还是部署都麻烦,需要非常的小心。一般配置都是存储到配置文件里面,不管多小的配置变动,…

.NET Core和.NET Standard有什么不同

近日,微软发布了.NET Core 2.0,但是开发人员中间仍然存在一些疑惑,就是.NET Core、.NET Standard、Xamarin和.NET Framework有什么不同。 .NET Framework用于构建桌面应用程序和运行在互联网信息服务器(IIS)上的ASP.NE…

十大经典排序算法

转载自 十大经典排序算法 内容几乎完全来源于网络,整理人:hustcc 来源:https://github.com/hustcc/JS-Sorting-Algorithm 排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序,内部排序是数据…

将网页打包app

准备:Hbuilder X 一个网址 打开软件,选择新建 新建项目 再里面写上名称和地址 这里给个免费看电影的网站 http://www.k2938.com/ 在manifest.json配置相关文件,如图标 启动图也可以设置 最后发行 取消ios,使用DCloud证书…