微服务的历史与陷阱

戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=jpeg


作者 | 李运华

出品 技术琐话


微服务是近几年非常火热的架构设计理念,大部分人认为是MartinFlower提出了微服务概念,但事实上微服务概念的历史要早得多,也不是Martin Flower创造出来的,Martin只是将微服务进行了系统的阐述。不过不能否认Martin在推动微服务火热起来的作用,微服务能火,Martin功不可没。


参考维基百科英文版,我们简单梳理一下微服务的历史:


  • 2005年:Dr. PeterRodgersWeb ServicesEdge大会上提出了“Micro-Web-Services”的概念。

  • 2011年:一个软件架构工作组使用了“microservice”一词来描述一种架构模式。

  • 2012年:同样是这个架构工作组,正式确定用“microservice”来代表这种架构。

  • 2012年:ThoughtWorksJames Lewis针对微服务概念在QCon San Francisco 2012发表了演讲。

  • 2014年:James LewisMartin Flower合写了关于微服务的一篇学术性的文章,详细阐述了微服务。


由于微服务的理念中也包含了“服务”的概念,而SOA中也有“服务”的概念,我们自然而言地会提出疑问:微服务与SOA是什么关系,有什么区别,为何有了SOA还要提微服务?这几个问题是理解微服务的关键,否则如果只是跟风拿来就用,既不会用,也用不好,用了不但没有效果,反而还可能有副作用。



微服务与SOA的关系


对于了解过SOA的人来说,第一次看到微服务这个概念肯定会有所疑惑:为何有了SOA还要提微服务呢?等到简单看完微服务的介绍后,很多人可能就有一个疑惑:这不就是SOA吗?


关于SOA和微服务的关系和区别,大概分为几个典型的观点。


  • 微服务是SOA的实现方式

如下图所示,这种观点认为SOA是一种架构理念,而微服务是SOA理念的一种具体实现方法。例如,“微服务就是使用HTTP RESTful协议来实现ESBSOA”,“使用SOA来构建单个系统就是微服务”“微服务就是更细粒度的SOA”。



640?wx_fmt=png

                            

  • 微服务是去掉ESB后的SOA

如下图所示,这种观点认为传统SOA架构最广为人诟病的就是庞大、复杂、低效的ESB,因此将ESB去掉,改为轻量级的HTTP实现,就是微服务。


640?wx_fmt=png


  • 微服务是一种和SOA相似,但本质上不同的架构理念

如下图所示,这种观点认为微服务和SOA只是有点类似,但本质上是不同的架构设计理念。相似点在于下图中交叉的地方,就是两者都关注“服务”,都是通过服务的拆分来解决可扩展性问题。本质上不同的地方在于几个核心理念的差异:是否有ESB、服务的粒度、架构设计的目标等。

640?wx_fmt=png


以上观点看似都有一定的道理,但都有点差别,到底哪个才是准确的呢?单纯从概念上是难以分辨的,我们对比一下SOA和微服务的一些具体做法,再来看看到底哪一种观点更加符合实际情况。


  • 服务粒度

整体上来说,SOA的服务粒度要粗一些,而微服务的服务粒度要细一些。例如,对一个大型企业来说,“员工管理系统”就是一个SOA架构中的服务;而如果采用微服务架构,则“员工管理系统”会被拆分为更多的服务,比如“员工信息管理”“员工考勤管理”“员工假期管理”“员工福利管理”等更多服务。


  • 服务通信

SOA采用了ESB作为服务间通信的关键组件,负责服务定义、服务路由、消息转换、消息传递,总体上是重量级的实现。微服务推荐使用统一的协议和格式,例如,RESTful协议、RPC协议,无须ESB这样的重量级实现。Martin Flower将微服务架构的服务通信理念称为“Smart endpoints anddumb pipes”,简单翻译为“聪明的终端,愚蠢的管道”。之所以用“愚蠢”二字,其实就是与ESB对比的,因为ESB太强大了,既知道每个服务的协议类型(例如,是RMI还是HTTP),又知道每个服务的数据类型(例如,是XML还是JSON),还知道每个数据的格式(例如,是2017-01-01还是01/01/2017),而微服务的“dumb pipes”仅仅做消息传递,对消息格式和内容一无所知。


  • 服务交付

SOA对服务的交付并没有特殊要求,因为SOA更多考虑的是兼容已有的系统;微服务的架构理念要求“快速交付”,相应地要求采取自动化测试、持续集成、自动化部署等敏捷开发相关的最佳实践。如果没有这些基础能力支撑,微服务规模一旦变大(例如,超过20个微服务),整体就难以达到快速交付的要求,这也是很多企业在实行微服务时踩过的一个明显的坑,就是系统拆分为微服务后,部署的成本呈指数上升。


  • 应用场景

SOA更加适合于庞大、复杂、异构的企业级系统,这也是SOA诞生的背景。这类系统的典型特征就是很多系统已经发展多年,采用不同的企业级技术,有的是内部开发的,有的是外部购买的,无法完全推倒重来或进行大规模的优化和重构。因为成本和影响太大,只能采用兼容的方式进行处理,而承担兼容任务的就是ESB

微服务更加适合于快速、轻量级、基于Web的互联网系统,这类系统业务变化快,需要快速尝试、快速交付;同时基本都是基于Web,虽然开发技术可能差异很大(例如,JavaC++.NET等),但对外接口基本都是提供HTTP RESTful风格的接口,无须考虑在接口层进行类似SOAESB那样的处理。


综合上述分析,我们将SOA和微服务对比如下表所示。 

对 比 维 度

SOA

微  服  务

服务粒度

服务通信

重量级,ESB

轻量级,例如HTTP/ RESTful

服务交付

应用场景

企业级

互联网

 

因此,我们可以看到,SOA和微服务本质上是两种不同的架构设计理念,只是在“服务”这个点上有交集而已,因此两者的关系应该是第三种模式。


其实,Martin Flower在他的微服务文章中,已经做了很好的提炼:

 

In short, the  microservice architectural style is an approach to developing asingle  application as a suite of small services, each running in its own process and  communicating with lightweight mechanisms, often an HTTP resource API. These  services are built around business capabilities and independently deployable  by fully automated deployment machinery.

 

上述英文的三个关键词分别是:small、lightweight、automated,基本上浓缩了微服务的精华,也是微服务与SOA的本质区别所在。


通过前面的详细分析和比较,似乎微服务本质上就是一种比SOA要优秀很多的架构模式,那是否意味着我们都应该把架构重构为微服务呢?


其实不然,SOA和微服务是两种不同理念的架构模式,并不存在孰优孰劣,而只是应用场景不同而已。我们介绍SOA时候提到其产生历史背景是因为企业的IT服务系统庞大而又复杂,改造成本很高,但业务上又要求其互通,因此才会提出SOA这种解决方案。如果我们将微服务的架构模式生搬硬套到企业级IT服务系统中,这些IT服务系统的改造成本可能远远超出实施SOA的成本。



服务的陷阱


单纯从上面的对比来看,似乎SOA一无是处而微服务无所不能,这也导致了很多团队在实践时不加思考地采用微服务—既不考虑团队的规模,也不考虑业务的发展,也没有考虑基础技术的支撑,只是觉得微服务很牛就赶紧来实施,以为实施了微服务后就什么问题都解决了,而一旦真正实施后才发现掉到微服务的坑里面去了。


我们看一下微服务具体有哪些坑。


  • 服务划分过细,服务间关系复杂

服务划分过细,单个服务的复杂度确实下降了,但整个系统的复杂度却上升了,因为微服务将系统内的复杂度转移为系统间的复杂度了。


从理论的角度来计算,n个服务的复杂度是n×(n-1)/2,整体系统的复杂度是随着微服务数量的增加呈指数级增加的。下图形象了说明了整体复杂度。


640?wx_fmt=png


粗粒度划分服务时,系统被划分为3个服务,虽然单个服务较大,但服务间的关系很简单;细粒度划分服务时,虽然单个服务小了一些,但服务间的关系却复杂了很多。


  • 服务数量太多,团队效率急剧下降

微服务的“微”字,本身就是一个陷阱,很多团队看到“微”字后,就想到必须将服务拆分得很细,有的团队人员规模是5~6个人,然而却拆分出30多个微服务,平均每个人要维护5个以上的微服务。


这样做给工作效率带来了明显的影响,一个简单的需求开发就需要涉及多个微服务,光是微服务之间的接口就有6~7个,无论设计、开发,还是测试、部署,都需要工程师不停地在不同的服务间切换。

  • 开发工程师要设计多个接口,打开多个工程,调试时要部署多个程序,提测时打多个包。

  • 测试工程师要部署多个环境,准备多个微服务的数据,测试多个接口。

  • 运维工程师每次上线都要操作多个微服务,并且微服务之间可能还有依赖关系。



  • 调用链太长,性能下降

由于微服务之间都是通过HTTPRPC调用的,每次调用必须经过网络。一般线上的业务接口之间的调用,平均响应时间大约为50ms,如果用户的一起请求需要经过6次微服务调用,则性能消耗就是300ms,这在很多高性能业务场景下是难以满足需求的。为了支撑业务请求,可能需要大幅增加硬件,这就导致了硬件成本的大幅上升。


  • 调用链太长,问题定位困难

系统拆分为微服务后,一次用户请求需要多个微服务协同处理,任意微服务的故障都将导致整个业务失败。然而由于微服务数量较多,且故障存在扩散现象,快速定位到底是哪个微服务故障是一件复杂的事情。样例如下图所示。

640?wx_fmt=png

Service C的数据库出现慢查询,导致Service CService B的响应错误,Service B Service A的响应错误,Service A给用户的响应错误。我们在实际定位时是不会有图例中这么清晰的,最开始是用户报错,这时我们首先会去查Service A。导致Service A故障的原因有很多,我们可能要花半个小时甚至1个小时才能发现是ServiceB返回错误导致的。于是我们又去查Service B,这相当于重复Service A故障定位的步骤……如此循环下去,最后可能花费了几个小时才能定位到是Service C的数据库慢查询导致了错误。


如果多个微服务同时发生不同类型的故障,则定位故障更加复杂,如下图所示。

640?wx_fmt=png

Service C的数据库发生慢查询故障,同时Service CService D的网络出现故障,此时到底是哪个原因导致了Service C返回ErrorService B,需要大量的信息和人力去排查。


  • 没有自动化支撑,无法快速交付

如果没有相应的自动化系统进行支撑,都是靠人工去操作,那么微服务不但达不到快速交付的目的,甚至还不如一个大而全的系统效率高。例如:


  • 没有自动化测试支撑,每次测试时需要测试大量接口。

  • 没有自动化部署支撑,每次部署6~7个服务,几十台机器,运维人员敲shell命令逐台部署,手都要敲麻。

  • 没有自动化监控,每次故障定位都需要人工查几十台机器几百个微服务的各种状态和各种日志文件。


  • 没有服务治理,微服务数量多了后管理混乱

信奉微服务理念的设计人员总是强调微服务的lightweight特性,并举出ESB的反例来证明微服务的优越之处。但具体实践后就会发现,随着微服务种类和数量越来越多,如果没有服务治理系统进行支撑,微服务提倡的lightweight就会变成问题。主要问题如下。


  • 服务路由:假设某个微服务有60个节点,部署在20台机器上,那么其他依赖的微服务如何知道这个部署情况呢?

  • 服务故障隔离:假设上述例子中的60个节点有5个节点发生故障了,依赖的微服务如何处理这种情况呢?

  • 服务注册和发现:同样是上述的例子,现在我们决定从60个节点扩容到80个节点,或者将60个节点缩减为40个节点,新增或减少的节点如何让依赖的服务知道呢?



如果以上场景都依赖人工去管理,整个系统将陷入一片混乱,最终的解决方案必须依赖自动化的服务管理系统,这时我们就会发现,微服务所推崇的“lightweight”,最终也发展成和ESB几乎一样的复杂程度。


本文节选自《从零开始学架构:照着做,你也能成为架构师》一书,电子工业出版社出版。

640?wx_fmt=png


作者李运华,互联网资深技术专家,十多年技术老兵,目前带领多个研发团队,承担架构设计、架构重构、技术团队管理、技术培训等职责;专注于开源技术、系统分析、架构设计,对互联网技术的特点和发展趋势有较深入的研究,对系统解耦、高性能、高可用架构有丰富的经验。


640?wx_fmt=png

640?wx_fmt=jpeg

福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

640?wx_fmt=jpeg


推荐阅读:

  • 边缘计算将吞掉云计算!

  • ARM 发布新一代 CPU 和 GPU,实现 20% 性能提升!

  • 前端开发 20 年变迁史

  • 北漂杭漂的程序员,是如何买到第一套房子?

  • “爱装X”开源组织:“教科书级”AI知识树究竟长什么样?

  • 500行Python代码打造刷脸考勤系统

  • 权游播完了, 你在骂烂尾, 有人却悄悄解锁了新操作……


640?wx_fmt=png真香,朕在看了!

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

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

相关文章

java加锁多线程改为单线程_GUI为什么不设计为多线程(用户事件和底层事件的流程是相反的,每层都加锁效率太低,共用一把锁那就是单线程)...

在我们这批新人转正评审的时候,我师父问了我的小伙伴一个问题:为什么一些更新界面的方法只能在主线程中调用?师父没有问我这个问题,让知其然但不知其所以然的我有种侥幸逃过一难的心情。我想如果回答那是因为Android GUI库是单线程…

行啊,人工智能玩大了!

戳蓝字“CSDN云计算”关注我们哦!是的 ,你没猜错!就是人工智能!AI的炽手可热程度和重要性无需多提。最近,笔者在网上发现了一个报告,报告名字:《BAT人工智能领域人才发展报告》,发现…

java xml注入bean_Spring实战之通过XML装配bean

尽管Spring长期以来确实与XML有着关联,但现在需要明确的是,XML不再是配置Spring的唯一可选方案。Spring现在有了强大的自动化配置和基于Java的配置,XML不应该再是你的第一选择了。不过,鉴于已经存在那么多基于XML的Spring配置&…

Docker 存储选型,这些年我们遇到的坑

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!随着Docker 容器技术的不断发展和业内对Docker 的使用不断深入,大家已经不…

mysql主从复制之异常解决--- Slave_IO_Running: NO

关于 Slave_IO_Running: NO 的错误其实有很多原因, 文章目录1. 解决问题的思路2. 异常信息3. 问题定位:由于uuid相同,而导致触发此异常4. 解决方案5. 服务器背景6. 具体解决方案7. 重新启动mysql8. 登录mysql,重启slave&#xff0…

企业实战_11_MyCat垂直拆分相关配置

接上一篇:企业实战_10_MyCat Mysql 主复制总结 https://gblfy.blog.csdn.net/article/details/118652742 文章目录一、准备工作1. 实现思路2. 配置MyCat垂直分库3. 环境配置4. 在master节点创建mycat用户5. 赋予操作数据库权限二、schema.xml文件配置2.1. 基础模板 …

K8S精华问答 | 如何监控部署在Docker容器上的应用程序?

kubernetes,简称K8S,是用8代替8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应…

带你全面了解Http和Https

戳蓝字“CSDN云计算”关注我们哦!作者: 左大人 | 来源 公众号 程序员小乐来源:jianshu.com/p/27862635c07700 前言 Http和Https属于计算机网络范畴,但作为开发人员,不管是后台开发或是前台开发,都很有必要掌握它们。在…

企业实战_05_MyCat用户密码加密

接上一篇:企业实战_04_MyCat常用配置文件详解 https://gblfy.blog.csdn.net/article/details/100112080 文章目录1. 加密简述2. 加密目录3. 执行加密4. 添加加密属性5. 添加密文6. 测试是否可用声明:需要提前安装mysql Linux centos7 安装 MySQL5.7.x 1. 加密简述 …

大数据从哪里来?| 技术头条

戳蓝字“CSDN云计算”关注我们哦!作者:Feng来源:哈尔的数据城堡现代商业市场是一个数据驱动的环境,可以说不论技术怎么更新换代,数据都有着不可替代的地位,而且抛开数据谈大数据服务就是瞎扯,没…

java算法判断链表有没有闭环_前端算法系列之二:数据结构链表、双向链表、闭环链表、有序链表...

前言上一次我们讲到了数据结构:栈和队列,并对他们的运用做了一些介绍和案例实践;我们也讲到了怎么简单的实现一个四则运算、怎么去判断标签是否闭合完全等等,anyway,今天接着和大家介绍一些数据结构:链表链…

苹果宣布加入CNCF;华为要求美国运营商支付专利费;微软删除最大的公开人脸识别数据集...

戳蓝字“CSDN云计算”关注我们哦!嗨,大家好,重磅君带来的【云重磅】特别栏目,如期而至,每周五第一时间为大家带来重磅新闻。把握技术风向标,了解行业应用与实践,就交给我重磅君吧!重…

企业实战_14_MyCat跨分片查询_全局表

接上一篇:企业实战_13_MyCat清除冗余数据 https://gblfy.blog.csdn.net/article/details/100057317 文章目录一、跨分片查询验证1. 登录mycat2. 使用逻辑数据库1.3. 执行跨分片查询1.4. 异常信息,问题定位1.5. 表分布1.6. 跨分片查询的解决方式1.7. 场景…

java创建四叉树_Java实现 LeetCode 427 建立四叉树

427. 建立四叉树我们想要使用一棵四叉树来储存一个 N x N 的布尔值网络。网络中每一格的值只会是真或假。树的根结点代表整个网络。对于每个结点, 它将被分等成四个孩子结点直到这个区域内的值都是相同的.每个结点还有另外两个布尔变量: isLeaf 和 val。isLeaf 当这个节点是一个…

漫画:什么是二分查找?

戳蓝字“CSDN云计算”关注我们哦!作者 | 蠢萌的小灰来源 | 程序员小灰————— 第二天 —————什么意思呢?我们来举两个栗子:给定一个有序数组 2,5,7,9,12,14,20&…

mysql和mysqldump出现command not found 问题解决

mysql和mysqldump出现command not found 问题解决 一、给mysql配置环境变量 #找到mysql安装路径 cd /app/mysql-5.7.25 #vim /etc/profile export MYSQL_HOME/app/mysql-5.7.25 :${MYSQL_HOME}/bin二、建立软连接 1、查找mysql安装路径 find / -name mysql 通常mysql安装路径…

如何给老婆解释什么是微服务?(文末有福利)

戳蓝字“CSDN云计算”关注我们哦!程序员有了老婆之后就是累,上次好不容易给她解释了什么是Restful,这不,麻烦又来了…一个周日的清晨,阳光洒在我的脸上,慢慢把我唤醒。我翻过身,感觉好像少了些什…

oracle19c连接MySQL_oracle19c的安装和使用navicat连接oracle数据库

一,数据的安装Oracle官方下载链接:https://www.oracle.com/downloads/#category-database首先去oracle官网下载,数据库里面包含了客户端,所以不需要再下载客户端了注意:有的人不下载数据库,只下载客户端为了…

Mycat_MySql更新数据库失败 --read-only

接上一篇:企业实战_20_Mycat-Web之UI监控 https://blog.csdn.net/weixin_40816738/article/details/100100053 #登录数据库 mysql -uroot -p #使用指定数据库 use 数据库名 #查看数据库处于什么状态下 show variables like read-only; #关闭read-only属性状态 set g…

Linux 运维必备的 13 款实用工具,拿好了

戳蓝字“CSDN云计算”关注我们哦!来源 | 高效运维本文介绍几款 Linux 运维比较实用的工具,希望对 Linux 运维人员有所帮助。1. 查看进程占用带宽情况 - NethogsNethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽。下载&#xff1…