本文分享自华为云社区《做服务的架构陷阱,你掌握了多少能避开吗?》,作者: 码乐 。

1 简介

通常在一个应用中,也很难有固定的分层。软件体系结构为软件系统提供了结构、行为和属性的高级抽象,在使用时可能随着时间推移分层越来越多,这些抽象和分层由构成系统的元素描述、这些元素的相互作用、指导元素集成的模式以及这些模式的约束组成。

而软件层次式体系结构是最通用的架构,也被叫作N层架构模式(n-tier architecture pattern)。
这种架构模式非常适合传统的IT通信和组织结构,很自然地成为大部分应用的第一架构选择。

在分层次体系结构中的组件被划分成几个层,每个层代表应用的一个功能,都有自己的角色和职能。

分层架构的一个特性就是关注分离(separation of concerns)。该层中的组件只负责本层的逻辑,组件的划分很容易明确组件的角色和职责,也比较容易开发、测试、管理和维护。

分层架构(Layered Architecture)是最常见的软件架构,也是事实上的标准架构。

事实上人类认知方式也是通过层次划分,在现实宇宙中,如太阳系从内层到外层结构:

2 如何设计层次架构

考虑软件体系结构通常从三个方面出发:

  • (1)利益相关人员之间的交流。

软件体系结构是一种常见的系统抽象,代码级别的系统抽象仅仅可以成为程序员的交流工具,而包括程序员在内的绝大多数系统的利益相关人员都借助软件体系结构来作为相互沟通的基础。

  • (2)系统设计的前期决策。

软件体系结构是我们所开发的软件系统最早期设计决策的体现,而这些早期决策对软件系统的后续开发、部署和维护具有相当重要的影响。这也是能够对系统进行分析的最早时间点。

  • (3)可传递的系统级抽象。

软件体系结构是关于系统构造以及系统各个元素工作机制的相对较小、却又能够突出反映问题的模型。

由于软件系统具有的一些共通特性,这种模型可以在多个系统之间传递,特别是可以应用到具有相似质量属性和功能需求的系统中,并能够促进大规模软件的系统级复用。

分层架构将软件分成若干个水平层,每一层都有清晰的角色和分工,不需要知道其他层的细节。层与层之间通过接口进行通信。分层架构通常明确约定软件一定要分成多少层,但是,最常见的是四层结构,如下所述。

●表现层(Presentation Layer);

用户界面,负责视觉和用户互动;

●业务层(Business Layer):

实现业务逻辑;

●持久层(Persistence Layer):

提供数据,SQL语句就放在这一层;

●数据库(Database Layer):

保存数据。

有的项目在逻辑层和持久层之间加了一个服务层(Service),提供不同业务逻辑需要的一些通用接口。用户的请求将依次通过这四层的处理,不能跳过其中任何一层。

分层式体系结构是一种最常见的架构设计方法,能有效地使设计简化,使设计的系统机构清晰,便于提高复用能力和产品维护能力。

3 不同维度分析

  • 整体敏捷性: 低

分析:整体敏捷性是对不断变化的环境做出快速响应的能力。

虽然可以通过此模式的隔离层功能来隔离更改,但由于大多数实现的单体性质以及通常使用此模式的组件的紧密耦合,因此在此体系结构模式中进行更改仍然很麻烦且耗时。

  • 易于部署性:低

分析:根据实现此模式的方式,部署可能会成为一个问题,特别是对于较大的应用程序。

对组件的一个小改动可能需要重新部署整个应用程序(或应用程序的大部分),从而导致需要在下班时间或周末计划、安排和执行部署。因此,此模式不容易用于持续交付管道,从而进一步降低了部署的总体评级。

  • 可调试可测试性: 高

分析:由于组件属于体系结构中的特定层,因此可以模拟或存根其他层,因此此模式相对容易测试。开发人员可以模拟演示组件或屏幕以隔离业务组件中的测试,也可以模拟业务层以测试某些屏幕功能。

  • 性能: 低

分析:虽然某些分层体系结构确实可以很好地执行,但由于必须通过体系结构的多个层来满足业务请求,因此该模式并不适合高性能应用程序。

  • 可扩展性:低

分析:由于此模式的紧密耦合和整体实现的趋势,使用此体系结构模式生成的应用程序通常难以扩展。

可以通过将分层架构拆分为单独的物理部署或将整个应用程序复制到多个节点来扩展分层架构,但总体而言,粒度太宽,导致扩展成本较高。

  • 易于开发:高

分析:易开发性获得了相对较高的分数,主要是因为这种模式非常有名,而且实现起来并不太复杂。由于大多数公司通过按层(表示、业务、数据库)分离技能集来开发应用程序,因此此模式成为大多数业务应用程序开发的自然选择。(康威定律)

4 使用分层时需要注意的问题

层次式体系结构是一个可靠的通用的架构,对很多应用来说,如果不确定哪种架构适合,
可以用它作为一个初始架构。设计时要注意以下两点:

  • (1)要注意的是污水池反模式。

所谓污水池反模式(architecture sinkhole anti-pattern),就是请求流简单地穿过几个层,每层里面基本没有做任何业务逻辑,或者做了很少的业务逻辑。比如一些Java项目例子,业务逻辑层只是简单的调用了持久层的接口,本身没有什么业务逻辑。

每一层或多或少都有可能遇到这样的场景,关键是分析这样的请求的百分比是多少。二八原则可以帮助你决定是否正在遇到污水池反模式。如果请求超过20则应该考虑让一些层变成开放的。

  • (2)需要考虑的是分层架构可能会让你的应用变得庞大。

即使你的表现层和中间层可以独立发布,但它的确会带来一些潜在的问题,比如:分布模式复杂、健壮性下降、可靠性和性能的不足,以及代码规模的膨胀等。

5 小结

层次式体系结构设计是将系统组成一个层次结构,每一层为上层服务,并作为下层客户。

在一些层次系统中,除了一些精心挑选的输出函数外,内部的层接口只对相邻的层可见。连接件通过决定层间如何交互的协议来定义,拓扑约束包括对相邻层间交互的约束。

严格约束的环境,由于每一层最多只影响两层,同时只要给相邻层提供相同的接口,允许每层用不同的方法实现,同样为软件重用提供了强大的支持。

分层由于其易于使用和理解开发,仍然是现代普遍存在的架构,因为有如下优势:

  • 良好的复用性,只要接口不变可用在其它处;
  • 可维护性好;
  • 可扩展性好,支持递增设计
  • 经过合理分层,让系统整体耦合性降低,达到解耦效果
  • 把相同逻辑与抽象级别内容放一个层次,易于理解和开发。

点击关注,第一时间了解华为云新鲜技术~