微服务(microservice architecture)和面向服务的体系结构(SOA)到底有什么区别?

1.微服务到底是什么?SOA(面向服务的体系结构)又是什么?二者的区别在哪里?
1.1 前言
有的放矢地浏览了将近30个文献(包括书籍,论文,网页),我发现现在的学者和开发者对微服务(microservices)是各有定义,各有见解的。而且一旦涉及到微服务和SOA(service-oriented architecture)的比较的时候,大家的讨论就开始变得模糊,二者之间的界限也不是特别清楚(似乎大家更愿意、常常用微服务和整体系统(monolith)比)。有趣的是,我们通过观察,发现在比较二者区别上,现在的“武林”大概可以分成三派人:
1)天壤之别派:这一派人坚持,微服务和SOA完全是两个概念,他们不同的地方太多了,如果你把他们看成一样,那说明你对微服务的概念不了解![12], [17]
2)完全一样派:这一派人觉得,二者明明是一个东西嘛,他们的相同之处太多。有些好事者非要把微服务从SOA独立出来,明明就是对SOA的概念不了解![10], [16]
3)一脉相承派:和前面两种看法都不同,这一派人认为,微服务是SOA的变体,来源于SOA,但是又有自己不同的地方 [1], [2], [3], [4], [5], [13]。
我们认为,要了解微服务和SOA的区别,应从二者的定义,二者的发展历史出发,而后归纳、分析现有的各个观点,得出最终的结论。
1.2 归纳、分析
1.2.1 SOA和微服务的概念
SOA的概念:an architectural pattern in computer software design in which application components provide services to other components via a communications protocol, typically over a network [1], [2].
微服务的概念:a software architecture style in which complex applications are composed of small, independent services communicating with each other using language-agnostic APIs. 微服务也可以叫做microservices architecture(MSA) [2], [22]。
从二者的概念看,可以初步看到SOA中是由application component提供服务,但是在微服务中,application就被拆分成了多个用语言无关的API进行交互的服务。
1.2.1 SOA,微服务,整体系统的简单比较
[3]给出了一副很容易理解的图:
 
图一 整体结构,SOA,微服务
从图一看,整体结构可以看成一个大容器,在这个大容器里面,一个应用(application)的所有组件(components)紧密组装在一起。
SOA本质上则是多个服务(services)的集合,这些服务可以互相交流。这种交流有时候涉及简单数据传递,有时候会涉及两个或更多服务的行动协调。因此,彼此之间是需要有连接服务(connection services)的。
微服务则是把一个应用(application)进一步拆分成了多个小型自治的服务(services)集合。
1.2.3 SOA和微服务的详细比较
进一步分析SOA和微服务区别:
表一 SOA和微服务区别
SOA 微服务 (MSA)
相同点:1)都是基于服务的体系结构,都属于分布式体系结构 [3], [4], [5]。
2)二者都有一个用来解决协调(mediation)问题的中间件组件(middleware component),但是一个叫messaging middleware,一个叫API layer,二者功能不同 [4]。
遵循“share as much as possible”体系结构方法。
即:SOA通过enterprise services(即企业服务,被很多其他服务所共享)最大化组件共享(component sharing)。
遵循“share as little as possible”体系结构方法。
即:微服务通过bounded context(即限界上下文,指服务和其相关的数据被连接在一个有最少依赖的single closed unit)最小化组件共享 [4]。
中间件组件叫做messaging mid-dleware,功能很强大,包括mediation and routing, message enhancement, me-ssage transformation, and protocol trans-formation。例如我们常说的ESB(enterprise service bus)。(见图五) 中间件组件叫做API layer,功能很少,只有mediation,即负责服务和服务使用者之间的调解。例如淘宝开放API [6],Amazon API Gateway [7]。
(见图四)


有四个服务分类(如图三),每一类都有不用的服务拥有者,这样导致:如果要创建或者维护一个业务请求(business request),各个不同的服务拥有者之间要进行复杂协调(coordination)。






只有两个服务分类(如图二),而且两个类型的服务被同一个开发团队拥有。这样导致:如果要创建或者维护一个业务请求,几乎不需要协调。
服务规模小,协调最小化(small service size and minimal coordination) [4] 带来的好处就是:服务能被快速开发,测试,部署以及维护。从而使得相应花费(时间,金钱)都有效减少,这也是微服务体系结构脱颖而出的原因。
Service的粒度:SOA中服务的粒度没有明确规定。可大可小,而实际上,SOA中的服务常常是一个大型产品或者子系统。(所以才常常被叫做coarse-grained) Service的粒度:小型的、细粒度的服务(一个服务通常只实现一个不可分割或者不适合分割的功能)。所以微服务最开始被很多人称为fine-grained SOA(细粒度的SOA) [13], [14]。
协议:在访问远程服务时,SOA不受限制,能够使用各种远程访问协议,且SOA的协议通常是成分混杂的(heterogeneous)。 协议:在访问远程服务时,微服务只能用REST和simple messaging(如JMS), 且微服务的协议经常是同质的(homogeneous) [4]。
总结:其实没有谁更好谁更差的讲法。SOA和微服务各有优势,适用于不同情况。
1)SOA适用于大型复杂的企业级系统。这样的系统通常需要对许多成分混杂的应用和服务进行整合,并且需要在整个企业内可用的共享组件。例如大型保险公司系统。
2)微服务适用于较小的基于web的系统。这样的系统不需要更多的服务分类,抽象层以及消息传递中间件,所以使用用微服务体系结构来开发。微服务不适合大型复杂商业应用开发的原因之一就在于它没有一个像SOA的messaging middleware那么功能强大的mediator。
 
图二 微服务的服务分类
 
图三 SOA的服务分类 
 
图四 微服务体系结构的拓扑结构
 
图五 SOA的拓扑结构


在描述图二、三之后,[4]给出了一个观点:在使用体系结构(如SOA,微服务)的时候,你可以选择体系结构给出的标准的服务类型,也可以完全抛弃他们创造你自己的分类模式,记住无论你怎么做,你都要确保你的体系结构有一个明确定义的、有明确说明文档的服务分类。(这给我们提供了发散的空间和思路——勇于创造,不拘泥于现有结构。我觉得是文章的一个宝贵之处。) 
1.2.4 小结
总而言之,在我们看来,我们倾向认为微服务其实是在SOA的大框架下,进行了一系列的改变(比如:采用更细粒度的服务划分,更轻量级的协议,舍去ESB这样的消息传递中间件,并且加入bounded context这样的概念,等等)而形成的一种体系结构。
通过这些改变,微服务使软件开发更加敏捷,开发出来的软件更加可靠,恢复力更强,以及更加可扩展。以及在软件开发,测试,部署,维护上更加高效,从而在当今瞬息万变的信息时代(需要敏捷开发)大放异彩。所以,本质上微服务是一种推陈出新的SOA(基于服务的本质没变,但是一些设计思想变了,而适用的情况也不一样,比如微服务更适合开发web-based applications,而不适合开发large-scale enterprise application)。
结语
现在有点用不惯csdn,以后有空把文章格式好好排一下。
Reference
[1] Service-oriented architecture.
https://en.wikipedia.org/wiki/Service-oriented_architecture
(给出了SOA的概念)
[2] What is the difference between SOA and microservices?
https://www.quora.com/What-is-the-difference-between-SOA-and-microservices
(相对于1,给出了更容易理解的SOA和微服务的定义)
[3] Microservices vs SOA : What’s the Difference.
https://www.edureka.co/blog/microservices-vs-soa/
(用可视化的方式给出了整体结构,SOA,微服务的区别。但是这个网站也存在一些错误/不严谨的地方。如在描述SOA服务分类的时候,将Business Service写成了Functional Service)
[4] Richards M. Microservices vs. service-oriented architecture[J]. 2015.
(老师提供的书籍,对SOA和微服务的进行了全面的比较)
[5] Wolff E. Microservices: Flexible Software Architecture[M]. Addison-Wesley Professional, 2016.
(老师提供的书籍,对微服务进行描述,夹杂和SOA的比较)
[6] http://open.taobao.com/
(淘宝开放API)
[7] https://aws.amazon.com/cn/api-gateway/
(Amazon API Gateway)
[8] https://martinfowler.com/bliki/BoundedContext.html
(微服务领域的先驱之一martin fowler对bounded context有一个详细的解释)
[9] http://www.microtica.com/2017/08/microservices-vs-soa-is-there-any-difference/
(比较了SOA和微服务,指出微服务最开始叫做“细粒度的SOA”)
[10] http://service-architecture.blogspot.com/2014/03/microservices-is-soa-for-those-who-know.html

Steve Jones(是Capgemini的首席技术官,写过书《Enterprise SOA Adoption Strategies》 [11],做过有关“business service architecture”的演讲)坚持认为微服务就是SOA。其观点非常强势:“Microservices is SOA, for those who know what SOA is.”意思就是,对于真正懂SOA的人来说,微服务就是SOA。
他是怎么来论证的呢?他通过分析微服务领域大佬martin fowler的这篇文章《Microservices: a definition of this new architectural term》里面的描述,来指出他不同意作者的地方,并且给出自己的意见。比如Componentization via Services;Decentralized Governance等方面,来反对martin fowler的观点。
其中我印象比较深的论述:
Lightweight isn't bad, but that doesn't mean Microservices isn't about Service Orientation. 意思就是微服务用了轻量级的通信协议,并不代表它就不是SOA了。

[11] Jones S. Enterprise SOA adoption strategies[M]. Lulu. com, 2006.
[12] Lewis J, Fowler M. Microservices: a definition of this new architectural term[J]. MartinFowler. com, 2014, 25.  
该文章可以在https://martinfowler.com/articles/microservices.html查看。
(
这个作者在微服务领域很出名。他在这篇文章中说:微服务和SOA完全不同(significantly different)。原因是:SOA用了ESB(enterprise service bus),然后把ESB比作“Egregious Spaghetti Box”,就是一团糟的意大利面。
也就是他对SOA的ESB进行了攻击,然后凭借微服务没有这样的messaging component而将其与SOA完全划清界限。

[13] Allen Wang and Sudhir Tonse. Announcing ribbon: Tying the netflix mid-tier services together, January 2013.
http://techblog.netflix.com/2013/01/announcing-ribbon-tying-netflix-mid.html
(微服务这个名字在2011年才正式给出 [15],但是Netflix公司早就在用微服务的体系结构了,只不过他把微服务叫做“fine-grained SOA”。)
[14] Microservices vs. SOA – Is There Any Difference at All? 
http://www.microtica.com/2017/08/microservices-vs-soa-is-there-any-difference/
[15] Dragoni N, Giallorenzo S, Lafuente A L, et al. Microservices: Yesterday, Today, and Tomorrow[J]. 2017.
[16] Introduction to Microservices Architecture.
http://www.neverletdown.net/2015/05/introduction-to-microservices.html
(这里面介绍到:微服务就是“SOA done right”)
[17] What is Microservices Architecture?
https://smartbear.com/learn/api-design/what-are-microservices/
(这篇文章对微服务有个非常详细的介绍,并且给出了微服务和SOA的比较)
[18] Microservices, SOA, and APIs: Friends or enemies?
https://www.ibm.com/developerworks/websphere/library/techarticles/1601_clark-trs/1601_clark.html
(这篇文章阐述了微服务的有点,诸如:敏捷开发,恢复力更强等等)
[19] Microservices and SOA: Similarities, differences, and where we go from here
https://blogs.oracle.com/oraclemagazine/microservices-and-soa
(这篇文章引用了很多权威人士对SOA和微服务的看法。很有意思)
[20] Does My Bus Look Big in This?
https://www.infoq.com/presentations/soa-without-esb
(Martin Fowler和Jim Webber批评了SOA中的ESB,并期待提出更加轻量级的代替方案)
[21] SOA和微服务(microservice)有什么区别?
https://www.leadnt.com/soa和微服务microservice有什么区别?.html
(这篇文章用图片很好的解释了SOA和微服务体系结构)
[22] Microservices.
https://en.wikipedia.org/wiki/Microservices
(维基百科关于微服务的定义)

 

 

 

写作时间:2018-06-22

你可能感兴趣的:(研一下)