下一代微服务架构基础:ServiceMesh?

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

那么到底什么是 ServiceMesh?它的诞生是为了解决什么问题?企业是否适合引入 ServiceMesh?通过这篇文章,将为你一一解答这些问题。

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

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

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

在这里插入图片描述

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

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

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

2、三种服务发现模式

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

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

2.1 模式一:传统集中式代理

在这里插入图片描述

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

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

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

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

在这里插入图片描述

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

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

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

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

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

2.4 三种服务发现模式的比较

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

2.5 服务网格 ServiceMesh

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

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

3、我的建议

目前我本人并不特别看好 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],同时和容器云调度平台配合,实现了研发全自助式发布上线。

4、结 论

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

  • 模式一:集中式代理

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

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

这三种模式没有绝对的好坏之分,只是三种不同的架构风格,各有优劣和适用场景,在不同企业都有成功落地案例。

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

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

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

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

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

相关文章

ASP.NET Core 2.0 Web API项目升级到ASP.NET Core 3.0概要笔记

本文结构先决条件升级目标框架(Target Framework)的版本过时的IHostingEnvironment与IApplicationLifetime对象Endpoint Routing与AddMvc中间件Swashbuckle.AspNetCore总结手头有个ASP.NET Core 2.0的项目,打算将里面的依赖包进行一个版本升级…

常见消息队列对比

一、消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ,Rabbit…

Precision-Recall Curve

原文出自:http://blog.csdn.net/pirage/article/details/9851339 最近一直在做相关推荐方面的研究与应用工作,召回率与准确率这两个概念偶尔会遇到, 知道意思,但是有时候要很清晰地向同学介绍则有点转不过弯来。 召回率和准确率是…

2019 中国.NET 开发者峰会正式启动

2014年微软组织并成立.NET基金会,微软在成为主要的开源参与者的道路上又前进了一步。2014年以来已经有众多知名公司加入.NET基金会,Google,微软,AWS三大云厂商已经齐聚.NET基金会,在平台项目中,.NET平台上有…

聊一聊顺序消息(RocketMQ顺序消息的实现机制)

本文来自:https://www.cnblogs.com/hzmark/p/orderly_message.html 当我们说顺序时,我们在说什么? 日常思维中,顺序大部分情况会和时间关联起来,即时间的先后表示事件的顺序关系。 比如事件A发生在下午3点一刻&#…

如何摆脱「技术思维」的惯性?

大家好,我是Z哥。虽然从标题上看,这篇文章是写给“技术人”的,但从广义上来说,只要你是一位以理性见长的人,那么这篇文章要讲的东西可能会与你有关。先问大家一个问题。如果你现在打算做一件事A,它的目的是…

RocketMq重试及消息不丢失机制

1、消息重试机制 由于MQ经常处于复杂的分布式系统中,考虑网络波动、服务宕机、程序异常因素,很有可能出现消息发送或者消费失败的问题。因此,消息的重试就是所有MQ中间件必须考虑到的一个关键点。如果没有消息重试,就可能产生消息…

cmake编译opencv3.0

本文参照了 http://www.huqiwen.com/2012/11/27/compile-opencv-243-in-visual-studio-2012/ 安装CMake 从CMake的官方网站下载最新版的CMake。http://www.cmake.org/cmake/resources/software.html,选择Windows (Win32 Installer)平台的进行下载。 安装时请勾选…

【 .NET Core 3.0 】框架之五 || JWT权限验证

前言关于JWT一共三篇 姊妹篇,内容分别从简单到复杂,一定要多看多想:一、Swagger的使用 3.3 JWT权限验证【修改】二、解决JWT权限验证过期问题三、JWT完美实现权限与接口的动态分配这里一共三个文章,目前是第一篇,剩下两…

OpenCV Stitching 工程搭建

转自http://www.tuicool.com/articles/fMbUfaF Opencv中提供Stitcher类,实现了多图像自动拼接,Opencv是开源的,程序实现的源代码都在Opencv安装文件中,以及Opencv提供的函数查询手册和Opencv教程都可以在…

asp.net core 3.0 更新简记

asp.net core 3.0 更新简记Intro最近把活动室预约项目从 asp.net core 2.2 更新到了 asp.net core 3.0,记录一下,升级踩过的坑以及经验总结,包括但不限于TargetFramework ( netcoreapp2.2 需要更新为 netcoreapp3.0)DependencyHost/Environme…

kafka吞吐量高的原因

kafa 吞吐量高的原因 1、顺序读写 kafka的消息是不断追加到文件中的,这个特性使kafka可以充分利用磁盘的顺序读写性能 顺序读写不需要硬盘磁头的寻道时间,只需很少的扇区旋转时间,所以速度远快于随机读写 2、零拷贝 在Linux kernel2.2 之…

【 .NET Core 3.0 】框架之三 || swagger的使用

一、为什么使用Swagger上文中已经说到,单纯的项目接口在前后端开发人员使用是特别不舒服的,那所有要推荐一个,既方便又美观的接口文档说明框架,当当当,就是Swagger,随着互联网技术的发展,现在的…

MQ问题集(kafka主从同步与高可用,MQ重复消费、幂等)

1、kafka主从同步与高可用 https://1028826685.iteye.com/blog/2354570 http://developer.51cto.com/art/201808/581538.htm 2、MQ有可能发生重复消费,如何避免,如何做到幂等 2.1 MQ消息发送 1、发送端MQ-client(消息生产者:Producer)将消…

微软编程题:寻找最小的k个值

转载自:http://blog.csdn.net/v_JULY_v/article/details/6370650 寻找最小的k个数 题目描述:5.查找最小的k个元素 题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5&#xf…

Bumblebee微服务网关之访问日志处理

记录访问日志可以起到非常重要的作用,它不仅记录了API的使用情况,更可以反映API各种相关数据;通过分析日志可以得到API不同时间的负载情况,访问效率和流量分布,更进一步还能分析出用户的操作历史和行为这是非常有价值的…

负载均衡基础

1、什么是负载均衡(Load balancing) 在网站创立初期,我们一般都使用单台机器对台提供集中式服务,但是随着业务量越来越大,无论是性能上还是稳定性上都有了更大的挑战。这时候我们就会想到通过扩容的方式来提供更好的服…

Bumblebee微服务网关之并发限制

对于服务应用来说支持的并发越高越好,但很多时候资源有限,超负载的并发则会给整体应用带来更大的危险性(更何况有些并发来源是恶意的)。作为微服务网关应该具有一定的挡洪作用,这样可以一定程度保障后台逻辑服务的稳定…

[ASP.NET Core 3框架揭秘] 跨平台开发体验: Mac OS

除了微软自家的Windows平台, .NET Core针对Mac OS以及各种Linux Distribution(RHEL、Ubuntu、Debian、Fedora、CentOS和SUSE等)都提供了很好的支持。我们先来体验一下使用Mac来开发.NET Core应用,在这之前我们照例先得在Mac OS上构…

接雨水

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示…