分层架构和SOA

目录

  • 分层架构
    • C/S架构、B/S架构
    • MVC 架构、MVP 架构
    • 逻辑分层架构
    • 总结
  • SOA
    • 服务
    • ESB
    • 松耦合
    • 总结

分层架构

分层架构是很常见的架构模式,它也叫 N 层架构,通常情况下,N 至少是 2 层。例如,C/S 架构、B/S 架构。常见的是 3 层架构(例如,MVC、MVP 架构)、4 层架构,5 层架构的比较少见,一般是比较复杂的系统才会达到或者超过 5 层,比如操作系统内核架构。

按照分层架构进行设计时,根据不同的划分维度和对象,可以得到多种不同的分层架构

C/S架构、B/S架构

划分的对象是整个业务系统,划分的维度是用户交互,即将和用户交互的部分独立为一层,支撑用户交互的后台作为另外一层。如下 C/S 结构:
分层架构和SOA_第1张图片

MVC 架构、MVP 架构

划分的对象是单个业务子系统,划分的维度是职责,将不同的职责划分到独立层,但各层的依赖关系比较灵活。如MVC 中各层之间是两两交互的:
分层架构和SOA_第2张图片

逻辑分层架构

划分的对象可以是单个业务子系统,也可以是整个业务系统,划分的维度也是职责。
虽然都是基于职责划分,但逻辑分层架构和 MVC 架构、MVP 架构的不同点在于,逻辑分层架构中的层是自顶向下依赖的。
典型的有操作系统内核架构、TCP/IP 架构。如下Android 操作系统:
分层架构和SOA_第3张图片

总结

  • 边界明显清晰
    无论采取何种分层维度,分层架构设计最核心的一点就是需要保证各层之间的差异足够清晰,边界足够明显,让人看到架构图后就能看懂整个架构,如果两个层的差异不明显,进入实际开发落地,则在开发各层时就会拿错功能。
  • 各层依赖稳定
    分层架构之所以能够较好地支撑系统扩展,本质在于隔离关注点(separation of concerns),即每个层中的组件只会处理本层的逻辑。
    并不是简单地分层就一定能够实现隔离关注点从而支撑快速扩展,分层时要保证层与层之间的依赖是稳定的,才能真正支撑快速扩展。例如,Linux 内核为了支撑不同的文件系统格式,抽象了 VFS 文件系统接口:
    分层架构和SOA_第4张图片
    有了 VFS 后,只需要 VFS 适配新的文件系统接口,其他基于文件系统的功能是依赖 VFS 的,不会受到影响。

对于操作系统这类复杂的系统,接口本身也可以成为独立的一层。例如把 VFS 独立为一层是可以的,而对于一个简单的业务系统,接口可能就是 Java 语言上的几个 interface 定义,这种情况下如果独立为一层,看起来可能就比较重了。

  • 层层传递
    一旦分层确定,整个业务流程是按照层进行依次传递的,不能在层之间进行跳跃。
    最简单的 C/S 结构,用户必须先使用 C 层,然后 C 层再传递到 S 层,用户是不能直接访问 S 层的。
    传统的 J2EE 4 层架构,收到请求后,必须按照下面的方式传递请求:
    分层架构和SOA_第5张图片
    分层结构的这种约束,好处在于强制将分层依赖限定为两两依赖,降低了整体系统复杂度。
    分层结构的代价就是冗余,也就是说,不管这个业务有多么简单,每层都必须要参与处理,甚至可能每层都写了一个简单的包装函数。
    分层架构另外一个典型的缺点就是性能,因为每一次业务请求都需要穿越所有的架构分层,有一些事情是多余的,多少都会有一些性能的浪费。分层模式理论上的这点性能损失,在实际应用中,绝大部分场景下都可以忽略不计。

SOA

SOA 的全称是 Service Oriented Architecture,中文翻译为“面向服务的架构”,诞生于上世纪 90 年代。

SOA 出现的背景是企业内部的 IT 系统重复建设且效率低下,主要体现在:

  • 企业各部门有独立的 IT 系统,比如人力资源系统、财务系统、销售系统,这些系统可能都涉及人员管理,各 IT 系统都需要重复开发人员管理的功能。例如,某个员工离职后,需要分别到上述三个系统中删除员工的权限。
  • 各个独立的 IT 系统可能采购于不同的供应商,实现技术不同,企业自己也不太可能基于这些系统进行重构。
  • 随着业务的发展,复杂度越来越高,更多的流程和业务需要多个 IT 系统合作完成。由于各个独立的 IT 系统没有标准的实现方式(例如,人力资源系统用 Java 开发,对外提供 RPC;而财务系统用 C# 开发,对外提供 SOAP 协议),每次开发新的流程和业务,都需要协调大量的 IT 系统,同时定制开发,效率很低。

为了应对传统 IT 系统存在的问题,SOA 提出了 3 个关键概念。

服务

所有业务功能都是一项服务,服务就意味着要对外提供开放的能力,当其他系统需要使用这项功能时,无须定制化开发。
服务可大可小,可简单也可复杂,根据具体需求判断。

ESB

ESB 的全称是 Enterprise Service Bus,中文翻译为“企业服务总线”。ESB 将企业中各个不同的服务连接在一起。SOA 使用 ESB 来屏蔽异构系统对外提供各种不同的接口方式,以此来达到服务间高效的互联互通。

松耦合

松耦合的目的是减少各个服务间的依赖和互相影响。如果做不到松耦合,某个服务一升级,依赖它的其他服务全部故障,这样肯定是无法满足业务需求的。

典型的 SOA 架构样例如下:
分层架构和SOA_第6张图片
SOA 架构是比较高层级的架构设计理念,一般情况下我们可以说某个企业采用了 SOA 的架构来构建 IT 系统,但不会说某个独立的系统采用了 SOA 架构。例如,某企业采用 SOA 架构,将系统分为“人力资源管理服务”“考勤服务”“财务服务”,但人力资源管理服务本身通常不会再按照 SOA 的架构拆分更多服务,也不会再使用独立的一套 ESB,因为这些系统本身可能就是采购的,ESB 本身也是采购的,如果人力资源系统本身重构为多个子服务,再部署独立的 ESB 系统,成本很高,也没有什么收益。

总结

SOA 解决了传统 IT 系统重复建设和扩展效率低的问题,但其本身也引入了更多的复杂性。最广为人诟病的就是 ESB,ESB 需要实现与各种系统间的协议转换、数据转换、透明的动态路由等功能。

例如,下图中 ESB 将 JSON 转换为 Java(摘自《Microservices vs. Service-Oriented Architecture》):
分层架构和SOA_第7张图片
下图中 ESB 将 REST 协议转换为 RMI 和 AMQP 两个不同的协议:
分层架构和SOA_第8张图片
ESB 虽然功能强大,但现实中的协议有很多种,如 JMS、WS、HTTP、RPC 等,数据格式也有很多种,如 XML、JSON、二进制、HTML 等。ESB 要完成这么多协议和数据格式的互相转换,工作量和复杂度都很大,而且这种转换是需要耗费大量计算性能的,当 ESB 承载的消息太多时,ESB 本身会成为整个系统的性能瓶颈。

SOA 的 ESB 设计也是无奈之举,企业在应用 SOA 时,各种异构的 IT 系统都已经存在很多年了,完全重写或者按照统一标准进行改造的成本是非常大的,只能通过 ESB 方式去适配已经存在的各种异构系统。

--------来源《极客课程》∙ 学习摘要

你可能感兴趣的:(学架构摘要,分层架构,SOA)