JAVA解决方案架构师云服务

16. 面向服务的架构(译)

2018-10-10  本文已影响27人  qinyu

原文:https://herbertograca.com/2017/11/09/service-oriented-architecture-soa/

这篇文章是软件架构编年史()的一部分,这部编年史由一系列关于软件架构的文章()组成。在这一系列文章中,我将写下我对软件架构的学习和思考,以及我是如何运用这些知识的。如果你阅读了这个系列中之前的文章,本篇文章的的内容将更有意义。

SOA 风格在 20 世纪 80 年代末就已出现,它起源于 CORBA、DCOM、DCE 和其它一些概念。关于 SOA 的讨论太多了,也有一些不同的实现模式,但从本质上讲,SOA 并没有给出如何实现它们的具体措施,而是仅仅聚焦于一些概念,:

SOA 是一组和技术或产品无关的架构原则,这和多态以及封装一样。

在这篇文章里,我将探讨下面这些和 SOA 相关的模式:

CORBA(Common Object Request Broker Architecture,通用对象请求代理架构)

在 20 世纪 80 年代,随着企业网络和 C/S 架构应用的增加,对使用不同技术构建并且运行在不同行电脑上不同操作系统中的应用之间的通用通信方法的需求也越来越迫切。CORBA 因此诞生。它是一个分布式计算标准,20 世纪 80 年代发展起来并于 1991 年发布了第一个成熟版本。

CORBA 标准由多家供应商实现,其目标是提供:

现在 CORBA 依然在异构计算中应用,例如,它依然是 JAVA EE的一部分,尽管从 JAVA 9 开始它会被作为一个独立的模块打包

有一点要说明,我并不认为 CORBA 是一种 SOA 模式(虽然我认为 CORBA 和 SOA 模式都属于分布式计算)。这里之所以要介绍它,是因为我觉得是它的短板导致了 SOA 运动。

工作原理

首先,我们需要获取一个对象请求代理(ORB,Object Request Broker),它由供应商提供,符合 CORBA 规范,使用语言映射生成客户端代码语言的桩和骨架。使用 ORB 和 IDL (和 WSDL 类似)定义的接口定义,在客户端生成对应可以被远程调用的真实类的类,在服务器生成可以处理收到的请求并调用真正目标对象的骨架

  1. 调用者调用由桩实现的本地过程;
  2. 桩验证调用并创建一个请求消息传给 ORB;
  3. 客户端 ORB 通过网络吧消息传给服务器并阻塞当前的执行线程;
  4. 服务器 ORB 收到请求消息并实例化骨架;
  5. 骨架执行被调用对象的过程;
  6. 被调用对象执行计算并返回结果;
  7. 骨架将输出参数压缩成一个响应消息并传给 ORB;
  8. ORB 将消息通过网络发回客户端;
  9. 客户端 ORM 收到响应消息,展开并发给桩;
  10. 桩将输出参数传给调用者,释放执行线程,然后调用者继续执行。

优点

缺点

Web Services

记过 CORBA 现在仍然有使用场景,但我们也学到了一些经验:需要减少远程通信来提升系统性能,通信管道必须可靠通信规范必须简化

因此,在 20 世纪 90 年代末,Web Services 得到了大量应用,其目标是解决下面这些问题:

[Web] Services 能够以一种技术中立、标准的形式被发布、发现和使用。—— Microsoft 2004, Understanding Service-Oriented Architecture

通过 Web Services,SOA 完成了从远程调用对象方法向在服务之间传递消息的范式转换。

我们要明白,尽管 Web Services 属于 SOA,但一个 Web 服务并不仅仅是通过 HTTP 简单地提供数据库的 CRUD 访问的通用 API。也许这种实现有些情况下有用,它要求用户理解底层模型并遵循业务规则来确保数据完整性得到保护。SOA 意味着 Web 服务应该设计成业务领域的限界上下文,从它们提供的概念服务中抽象出实现。

从技术角度看,SOA 不仅仅是服务的架构,还是确保提供和使用正确服务的策略、实现和框架。—— Microsoft 2004, Understanding Service-Oriented Architecture

优点

缺点

消息队列

其核心思想是让应用之间使用语言无关的消息进行异步通信。消息队列提升了应用的可扩展性,降低了应用之间的耦合,因为不用知道其它应用部署在哪里、部署了多少,甚至都不用知道它们是什么。除此之外,它们全部需要使用同样的通信语言,例如提前定义好的可以表示数据的文本格式。接收

消息队列使用消息代理软件(例如,RabbitMQ、Beanstalkd、Kafka 等)作为基础设施,可以被设置成不同的实现应用间通信的方式:

所有这些模式都可以设置成拉取(又叫做轮询)或者推送方式:

优点

缺点

企业服务总线(ESB,Enterprise Service Bus)

上世纪 90 年代,在 Web Services 蓬勃发展的同时,企业服务总线已经在利用它们了(可能有些实现最初甚至使用了 CORBA?)。

ESB 诞生于这样一种环境下,公司拥有一些独立的应用,比如一个财务应用、一个人力资源应用、一个股票管理应用等等,它们需要让这些应用互相通信,需要集成这些应用。但这些应用没有考虑过集成,它们没有应用通信所需的通用语言格式(直到现在也没有这样一种格式)。因此,合理的解决方案是由应用提供商创建发送和接收特定格式数据的终端节点。然后,客户公司必须建立通信管道来集成应用,并将一种应用语言的消息转换成另一种。

消息队列可能有助于解决这个问题,但无法解决应用各自拥有不同语言格式的难题。不过,消息队列从哑通信通道变成了中间件,它既可以处理消息投递,也可以处理接收端希望的语言/格式转换,这前进了一小步。ESB 是相对简单的消息队列自然演进的结果。

这种架构类型会有通常是面向用户的组合应用,它们联系 Web 服务来执行某个操作。而这些 Web 服务反过来也会联系其它 Web 服务并最终返回一些数据给组合应用。然而,组合应用和后端服务都不知道对方的具体细节,即它们的位置和通信协议。它们知道的只是需要什么服务和服务总线的位置。

这样,客户应用(服务也好,组合应用也罢)将请求发送给服务总线,然后由总线将消息转换成目的地期望的格式并将请求路由到目的地。需要注意的是,所有的通信同要经过 ESB,也就是说一旦 ESB 宕机,所有通信也会宕机,所有系统也会无法运行。最后,ESB 工作得就像一个中间件,其中发生了太多事情,呈现出一个相当复杂的产物。

当然,这只是对 ESB 架构的非常浅显的解释。此外,尽管 ESB 是这种架构中主要的构件,还有其他一些构件也会被涉及,比如域代理、数据服务、流程编排服务或规则引擎。在系统按照业务领域隔离的联合设计中也可以应用同样的架构风格,每个领域可以设置自己的 ESB,所有这些设置会将它们连接起来。这有助于提升性能和缓解单点故障的问题,例如,一个 ESB 的故障只会影响它所属的那个业务领域。

ESB 的主要职责是:

当在不同的进程之间构建各种通信结构时,我们已经看到许多产品和方法,强调在通信机制本身大做文章。企业服务总线(ESB)就是一个很好的例子。ESB 产品经常包含复杂的设施,来进行消息的路由、编排、转换以及业务规则的应用。—— Martin Fowler 2014, Microservices

这种架构模式有其优势,特别是在下面这样种情况下尤其有用。这种情况下,我们没有 Web 服务的“控制权”,因此需要一个中间件来转换它们之间的消息、编排需要多个 Web 服务参与的业务流程,等等。

还有一点值得记住,ESB 的实现已经发展了很久,现在,大多数用例,我们甚至用简单的 UI 拖拽就可以完成 ESB 的配置。

优点

缺点

微服务

微服务架构以 SOA 概念为基础,与 ESB 有着同样的全局目标:将多个特定的业务领域应用整合为一个全局应用。

它和 ESB 之间的关键区别在于,ESB 诞生在独立应用需要集成来实现企业范围内的分布式应用的上下文之中,而微服务架构诞生的上下文则是快节奏和不断变化的业务,它们通常需要从头创建自己的云应用

换句话说,它们的出发点不同。就 ESB 来说,我们一开始就要面对没有“控制权“”的已有应用,不能修改它们。而对微服务来说,我们可以完全控制应用(这并非意味着系统中不能涉及任何第三方 Web 服务)。

微服务构建和设计的方式不需要高度的集成。微服务应该专注于一个业务概念,一个限界上下文,它们自己管理自己的状态,这样就不会直接依赖其它的微服务,因此需要的集成更少。换句话说,微服务的高内聚低耦合带来了不错的副作用,即减少了集成的需要。

[微服务是]一起工作的小型的自治服务,它们围绕着业务领域进行建模。—— Sam Newman 2015, Principles Of Microservices

ESB 架构最大的弊端在于它过于复杂,而且所有其它应用都得依赖中心应用。而微服务架构几乎完全去掉了它,来解决这个问题。

仍然会有一些元素横切整个微服务生态系统,但它们并没有像 ESB 那样承担这么多职责。例如,依然会存在用于微服务间异步通信的消息队列,但它只是一个纯粹的消息管道,没有其它职责。另一个例子是微服务生态系统的网关,所有和外界的通信都由它完成。

Building Microservices 一书的作者 Sam Newman 指出了微服务架构的八条原则:

微服务社区青睐另一种方法:智能终端节点和哑管道。基于微服务构建的应用以尽可能的解耦和内聚为目标 —— 它们拥有自己的领域逻辑,并且表现得更像经典 Unix 感觉得过滤器 —— 接收一个请求,酌情应用逻辑并生成一个响应。这些都使用简单的 REST 风格的协议进行编排,而不是类似 WS-Choreography 或 BPEL 或由中心工具编排的复杂协议。—— Martin Fowler 2014, Microservices

优点

缺点

反模式:意式馄饨架构

意式馄饨架构这个名字通常指的是微服务架构的反模式。如果我们最终创建了一个这样的微服务生态系统,其中有太多微服务,而这些微服务太小本身也不能代表领域概念时,这种反模式就会发生。

总结

SOA 在最近几十年里已经取得了长足的进步,而实现方案的不足和技术的提升,最终形成了微服务架构。

整个变化的背后提现这我们解决复杂问题的常规策略:将问题分解成更小的可以解决的碎片。

在我们将一个单体拆分成解耦得领域组件(限界上下文)时,也可以使用同样的方式解决代码复杂性。但是,随着团队和代码规模的增长,独立演进、扩展和部署的需求也在不断增加。SOA 提供了实现这些独立性得工具,强制在限界上下文之间确立更严格的边界。

这又一次提现了高内聚低耦合,这一次是在比之前更粗的粒度上。同样,实用主义在分析我们的需求时也非常重要:只有在真正需要时使用 SOA,因为它会带来很多复杂性,而如果我们确实
需要使用 SOA
,就创建满足我们需求的大小和数量的微服务,不多也不少。

引用来源

1997 – Steve Vinoski – CORBA: Integrating Diverse Applications Within Distributed Heterogeneous Environments
2000 – Roy Fielding – Architectural Styles and the Design of Network-based Software Architectures
2004 – Microsoft – Message Bus
2004 – Microsoft – Understanding Service-Oriented Architecture
2011 – Chris Ostrowski – Understanding Oracle SOA – Part 1 – Architecture
2011 – Chris Ostrowski – Understanding Oracle SOA – Part 2 – Technologies
2011 – Chris Ostrowski – Understanding Oracle SOA – Part 3 – Development
2011 – Chris Ostrowski – Understanding Oracle SOA – Part 4 – Business Benefits
2012 – Prabhu – Service Oriented Architecture – SOA
2014 – Martin Fowler – Microservices
2014 – PWC – Agile coding in enterprise IT: Code small and local
2015 – Udi Dahan – Messaging Architecture and Services Bus
2015 – Sam Newman – Principles Of Microservices
2016 – Kai Wähner – Microservices: Death of the Enterprise Service Bus?
2016 – Abraham Marín Pérez – Java 9 Will Remove CORBA from Default Classpath
2016 – Oracle – CORBA Technology and the Java™ Platform Standard Edition
2017 – Wikipedia – Distributed object communication
2017 – Wikipedia – Common Object Request Broker Architecture
2017 – Wikipedia – Enterprise service bus
2017 – Wikipedia – Representational State Transfer
2017 – Wikipedia – SOAP
2017 – Wikipedia – Service-oriented architecture
2017 – Microsoft – Enterprise Architecture: SOA in the real world

上一篇下一篇

猜你喜欢

热点阅读