可扩展架构的基本思想和模式和传统的可扩展架构模式

    可扩展架构的基本思想和模式

      软件系统与硬件和建筑系统最大的差异在于软件是可扩展的,一个硬件生产出来后就不会再进行改变、一个建筑完工后也不会再改变其整体结构。真正有生命力的软件系统,都是在不断迭代和发展的,典型的如 Windows 操作系统,从 Windows 3.0 到 Windows 95 到 Windows XP,直到现在的 Windows 10,一直在跟着技术的发展而不断地发展。

      可扩展的基本思想  可扩展性架构的设计方法很多,,所有的可扩展性架构设计,背后的基本思想都可以总结为一个字:拆!拆,就是将原本大一统的系统拆分成多个规模小的部分,扩展时只修改其中一部分即可,无须整个系统到处都改,通过这种方式来减少改动范围,降低改动风险

        按照不同的思路来拆分软件系统,就会得到不同的架构。常见的拆分思路有如下三种。

          面向流程拆分:将整个业务流程拆分为几个阶段,每个阶段作为一部分。

          面向服务拆分:将系统提供的服务拆分,每个服务作为一部分。

          面向功能拆分:将系统提供的功能拆分,每个功能作为一部分。

理解这三种思路的关键就在于如何理解“流程”“服务”“功能”三者的联系和区别。从范围上来看,从大到小依次为:流程 > 服务 > 功能,以 TCP/IP 协议栈为例,来说明“流程”“服务”“功能”的区别和联系。TCP/IP 协议栈和模型图如下

image

        流程  对应 TCP/IP 四层模型,因为 TCP/IP 网络通信流程是:应用层 → 传输层 → 网络层 → 物理 + 数据链路层,不管最上层的应用层是什么,这个流程都不会变。

        服务  对应应用层的 HTTP、FTP、SMTP 等服务,HTTP 提供 Web 服务,FTP 提供文件服务, SMTP 提供邮件服务,以此类推。

        功能  每个服务都会提供相应的功能。例如,HTTP 服务提供 GET、POST 功能,FTP 提供上传下载功能,SMTP 提供邮件发送和收取功能。

           1. 面向流程拆分  扩展时大部分情况只需要修改某一层,少部分情况可能修改关联的两层,不会出现所有层都同时要修改。

            展示层 → 业务层 → 数据层 → 存储层,各层含义是:

               展示层:负责用户页面设计,不同业务有不同的页面。

               业务层:负责具体业务逻辑的处理。

               数据层:负责完成数据访问。

               存储层:负责数据的存储。

           2. 面向服务拆分  对某个服务扩展,或者要增加新的服务时,只需要扩展相关服务即可,无须修改所有的服务。将系统拆分为注册、登录、信息管理、安全设置等服务

           3. 面向功能拆分  对某个功能扩展,或者要增加新的功能时,只需要扩展相关功能即可,无须修改所有的服务。每个服务都可以拆分为更多细粒度的功能

             不同的拆分方式,将得到不同的系统架构,典型的可扩展系统架构有:

               面向流程拆分:分层架构。

               面向服务拆分:SOA、微服务。

               面向功能拆分:微内核架构。

      不同的拆分方式,本质上决定了系统的扩展方式。

 

    传统的可扩展架构模式:分层架构和SOA

      高性能、高可用架构模式在最近几十年的迅猛发展来说,可扩展架构模式的发展可以说是步履蹒跚,最近几年火热的微服务模式算是可扩展模式发展历史中为数不多的亮点,高性能也用微服务、高可用也用微服务,很多时候这样的架构设计看起来高大上,实际上是大炮打蚊子,违背了架构设计的“合适原则”和“简单原则”。

C/S 架构、B/S 架构。常见的是 3 层架构(例如,MVC、MVP 架构)、4 层架构,5 层架构的比较少见,一般是比较复杂的系统才会达到或者超过 5 层,比如操作系统内核架构。

    分层架构   分层架构是很常见的架构模式,它也叫 N 层架构,通常情况下,N 至少是 2 层。按照分层架构进行设计时,根据不同的划分维度和对象,可以得到多种不同的分层架构。

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

image

 

 

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

image

 

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

image

          无论采取何种分层维度,分层架构设计最核心的一点就是需要保证各层之间的差异足够清晰,边界足够明显,让人看到架构图后就能看懂整个架构,这也是分层不能分太多层的原因。否则如果两个层的差异不明显,就会出现程序员小明认为某个功能应该放在 A 层,而程序员老王却认为同样的功能应该放在 B 层,这样会导致分层混乱。如果这样的架构进入实际开发落地,则 A 层和 B 层就会乱成一锅粥,也就失去了分层的意义。

          分层架构之所以能够较好地支撑系统扩展,本质在于隔离关注点(separation of concerns),即每个层中的组件只会处理本层的逻辑。并不是简单地分层就一定能够实现隔离关注点从而支撑快速扩展,分层时要保证层与层之间的依赖是稳定的,才能真正支撑快速扩展。例如,Linux 内核为了支撑不同的文件系统格式,抽象了 VFS 文件系统接口,架构图如下:

image

          如果没有 VFS,只是简单地将 ext2、ext3、reiser 等文件系统划为“文件系统层”,那么这个分层是达不到支撑可扩展的目的的。因为增加一个新的文件系统后,所有基于文件系统的功能都要适配新的文件系统接口;而有了 VFS 后,只需要 VFS 适配新的文件系统接口,其他基于文件系统的功能是依赖 VFS 的,不会受到影响。

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

          分层结构的另外一个特点就是层层传递,也就是说一旦分层确定,整个业务流程是按照层进行依次传递的,不能在层之间进行跳跃。最简单的 C/S 结构,用户必须先使用 C 层,然后 C 层再传递到 S 层,用户是不能直接访问 S 层的。传统的 J2EE 4 层架构,收到请求后,必须按照下面的方式传递请求:

image

          分层结构的这种约束,好处在于强制将分层依赖限定为两两依赖,降低了整体系统复杂度。

 

      SOA  SOA 的全称是 Service Oriented Architecture,中文翻译为“面向服务的架构”,诞生于上世纪 90 年代,1996 年 Gartner 的两位分析师 Roy W. Schulte 和 Yefim V. Natis 发表了第一个 SOA 的报告。

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

          企业各部门有独立的 IT 系统,比如人力资源系统、财务系统、销售系统,这些系统可能都涉及人员管理,各 IT 系统都需要重复开发人员管理的功能。

          各个独立的 IT 系统可能采购于不同的供应商,实现技术不同,企业自己也不太可能基于这些系统进行重构。

          随着业务的发展,复杂度越来越高,更多的流程和业务需要多个 IT 系统合作完成。由于各个独立的 IT 系统没有标准的实现方式(例如,人力资源系统用 Java 开发,对外提供 RPC;而财务系统用 C# 开发,对外提供 SOAP 协议),每次开发新的流程和业务,都需要协调大量的 IT 系统,同时定制开发,效率很低。

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

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

 

 

 

 

            2. ESB    ESB 的全称是 Enterprise Service Bus,中文翻译为“企业服务总线”。从名字就可以看出,ESB 参考了计算机总线的概念。计算机中的总线将各个不同的设备连接在一起,ESB 将企业中各个不同的服务连接在一起。因为各个独立的服务是异构的,如果没有统一的标准,则各个异构系统对外提供的接口是各式各样的。SOA 使用 ESB 来屏蔽异构系统对外提供各种不同的接口方式,以此来达到服务间高效的互联互通。

 

 

 

 

            3. 松耦合    松耦合的目的是减少各个服务间的依赖和互相影响。因为采用 SOA 架构后,各个服务是相互独立运行的,甚至都不清楚某个服务到底有多少对其他服务的依赖。如果做不到松耦合,某个服务一升级,依赖它的其他服务全部故障,这样肯定是无法满足业务需求的。典型的 SOA 架构样例如下:

image

            SOA 架构是比较高层级的架构设计理念,一般情况下我们可以说某个企业采用了 SOA 的架构来构建 IT 系统,但不会说某个独立的系统采用了 SOA 架构。SOA 解决了传统 IT 系统重复建设和扩展效率低的问题,但其本身也引入了更多的复杂性。 SOA 最广为人诟病的就是 ESB,ESB 需要实现与各种系统间的协议转换、数据转换、透明的动态路由等功能。

              ESB 将 JSON 转换为 Java

image

 

              ESB 将 REST 协议转换为 RMI 和 AMQP 两个不同的协议:

image

ESB 虽然功能强大,但现实中的协议有很多种,如 JMS、WS、HTTP、RPC 等,数据格式也有很多种,如 XML、JSON、二进制、HTML 等。ESB 要完成这么多协议和数据格式的互相转换,工作量和复杂度都很大,而且这种转换是需要耗费大量计算性能的,当 ESB 承载的消息太多时,ESB 本身会成为整个系统的性能瓶颈。

 

 

 

上一章: 如何应对接口级故障

下一章: 深入微服务架构

归类: 从0开始学架构

 

 
posted @ 2026-04-06 09:38  Py猫的故事  阅读(17)  评论(0)    收藏  举报
返回顶部