软件架构分层,你的项目处于什么阶段?

原文链接:
https://mp.weixin.qq.com/s/YzNC2IcS2wHtMrdighB9_w

原作者:程序新视界

前言

只要从事软件开发的工作,系统架构是必备知识。有朋友说可能会说,我只是一个搬砖的,怎么会接触到架构知识呢?其实,除了架构的设计者(也就是架构师),作为普通的开发者也是在时刻践行着系统架构的理论。毕竟,再好的架构,都需要码农去实施。只不过当你没有系统了解软件架构时,可能感知不到而已。

本篇文章就带大家系统的了解一下软件架构的分层,学习完毕,你就会明白,为什么系统要分层。同时,也能准确地看清楚目前自己系统中采用的是什么样的分层架构。

不采用架构分层,行不行?

首先我们来思考一个问题,如果一个系统不采用分层架构可不可以?这个问题就好像在问,代码中不使用设计模式行不行?答案当然是可以的。但不采用架构分层,会带来极大的未知风险,或者说代码极具熵增的特性。

作为一个初创软件,可能没有什么业务逻辑,没有什么用户量,而软件最主要的目标就是快速上线,实践商业模式。此时,可以不考虑分层。但随着业务逻辑的复杂,业务板块的增多,彼此之间就会出现错综复杂的依赖关系,随之就会产生的逻辑不清晰、可读性差,维护困难,改动一处动全身等问题。

什么是架构分层?

分层架构是将软件模块按照水平切分的方式分成多个层,一个系统由多层组成,每层由多个模块组成。同时,每层有自己独立的职责,多个层次协同提供完整的功能。比如,我们经常提到的MVC架构,就是一种非常典型非常基础的分层方式。

分层设计的本质其实就是将复杂问题简单化,基于单一职责原则让每层代码各司其职,基于“高内聚,低耦合”的设计思想实现相关层对象之间的交互。从而,提升代码的可维护性和可扩展性。

系统架构分层之后,往往需要达到以下目标:

  • 高内聚:分层设计可以简化系统设计,让不同层专注做某一模块的事;
  • 低耦合:层与层之间通过接口或API来交互,依赖方不用知道被依赖方的细节;
  • 复用:分层之后可以做到代码或功能的复用;
  • 扩展性:分层架构可以让代码更容易横向扩展

通讯领域的OSI参考模型

在计算机领域现有最典型的分层架构设计就是OSI参考模型和TCP/IP参考模型了。关于这个模型,我们在《一篇文章,只用看三遍,终生不忘网络分层! 》一文中已经详细介绍了。下面直接看一下相关的模型图:

对于上述的三种分层模式,试想一下,如果没有分层,当一个业务或协议需要改变时,我们只能针对整个系统做修改或扩展。而分层之后,便可以很方便地把不同功能的模块抽离出来,修改对应的模块即可。而且不同层还可以被复用,只要确保按照这个层的协议来处理就可以了。

软件系统整体分层

以Java软件应用为例,整个软件系统也可进行分层,比如分为部署的硬件环境、操作系统、所需的中间件、承载业务的应用程序以及软件接入层。可通过下图进行整体了解:

对于上述分层也产生了对应在职位,比如运维工程师、中间件工程师、产品经理、开发工程师、测试工程师等工种。而我们在实践过程中,接触最多,使用最多的分层要属应用软件层了,其次是中间件层。

下面我们就来看看针对应用软件层通常有哪些分层方式。

经典三层架构

三层架构(3-tier application) ,通常就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。

表现层(UI),通俗讲就是展现给用户的界面,对应项目中的Web层包含Servlet和Controller等。

业务逻辑层(BLL):也称作领域层,负责系统业务逻辑的处理,对应项目中Service和ServiceImpl等。

数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等,对应项目中的Dao。

在提出该分层架构的时代,多数系统往往较为简单,本质上都是一个单体架构(Monolithic Architecture)的数据库管理系统。这种分层架构已经是Client-Server架构的进化了,它有效地隔离了业务逻辑与数据访问逻辑,使得这两个不同关注点能够相对自由和独立地演化。

在开源技术框架中,表现层实现的代表作品是Struts1/2、Spring MVC,业务层实现的代表作品是Spring,持久层实现的代表作品是Hibernate和Mybatis。

MVC

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

标准的MVC交互模型如下图:

View:视图,为用户提供使用界面,与用户直接进行交互。

Model:模型,承载数据,对用户提交请求进行计算的模块。分为两类,一类称为数据承载Bean,一类称为业务处理Bean。数据承载Bean是指实体类,专门承载业务数据的,如Student、User等。而业务处理Bean则是指Service或Dao对象,专门用于处理用户提交请求的。

Controller:控制器,用于将用户请求转发给相应的Model进行处理,并处理Model的计算结果向用户提供响应。

从图中可以看到,标准的MVC中模型能主动推数据给视图进行更新(观察者设计模式,在模型上注册视图,当模型更新时自动更新视图),但在Web开发中模型是无法主动推给视图(无法主动更新用户界面),因为在Web开发是请求-响应模型。

Web MVC标准架构,如下图所示:

在Web MVC模式下,模型无法主动推数据给视图,如果用户想要视图更新,需要再发送一次请求(即请求-响应模型)。MVC用于将web(UI)层进行职责解耦。

三层架构和MVC的区别与联系

MVC严格说是三层架构中的UI层,也就是说,MVC把三层架构中的UI层再度进行了分化,分成了控制器、视图、实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话,而C层直接与三层中的BLL进行对话。

三层架构和MVC可以共存。三层架构是基于业务逻辑来分的,而MVC是基于页面来分的。MVC是表现模式(Presentation Pattern),三层架构是典型的架构模式(Architecture Pattern)。

三层架构的分层模式是典型的上下关系,上层依赖于下层。但MVC作为表现模式是不存在上下关系的,而是相互协作关系。即使将MVC当作架构模式,也不是分层模式。MVC和三层架构基本没有可比性,是应用于不同领域的技术。

阿里四层架构

三层架构实现比较简单,很多朋友可能觉得项目分层就应该如此,结果就是往往会出现一大堆的业务逻辑都堆砌在Service层中。而在《阿里巴巴 Java 开发手册 》中将原来的三层架构进一步细化,添加了Manager通用业务处理层。

Manager层可以将原Service层的一些通用能力进行下沉,比如与缓存和存储交互策略,中间件的接入;还可以封装对第三方接口的调用,比如调用支付服务,调用审核服务等RPC接口。

通用业务处理层,它有如下特征:

  • 对第三方平台封装的层,预处理返回结果及转化异常信息。
  • 对Service层通用能力的下沉,如缓存方案、中间件通用处理。
  • 与DAO层交互,对多个DAO的组合复用。

其各层的作用如下:

  • 终端显示层:各端模板渲染并执行显示的层。当前主要是Velocity渲染,JS渲染, JSP渲染,移动端展示等。
  • 开放接口层:将Service层方法封装成开放接口,同时进行网关安全控制和流量控制等。
  • Web层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。
  • Service层:业务逻辑层。
  • Manager层:通用业务处理层。
  • DAO层:数据访问层,与底层 MySQL、Oracle、HBase 等进行数据交互。
  • 外部接口或第三方平台:包括其它部门RPC开放接口,基础平台,其它公司的HTTP接口。

系统工程结构

在学习了以上分层架构之后,下面来看一下针对分层在软件系统中的对照关系表:

以上分层定义仅供参考。在上表中还多出了对外接口层和接入层。

对外接口层:所有对外的接口放在这层,不能包含任何业务逻辑,只数据对象的转换和异常的封装。

接入层:所有外部系统的依赖放在这层,好处是一旦外部系统接口修改,只需要在一处修改即可。

DDD分层架构

DDD是一种处理高度复杂领域的设计思想,试图分离技术实现的复杂性,同时围绕业务概念构建领域模型,提出的一种软件架构设计的方法论。

DDD分层架构将数据、缓存等都视为基础层, 可以被所有层调用;抽离了领域层,负责核心业务逻辑处理,领域层调用外部依赖全部通过接口,以保证领域层的100%单测覆盖率;应用层聚合多个领域层的能力,只做功能的组合、转发,不负责具体业务逻辑。

我们这里只做DDD分层架构的简单介绍,关于DDD概念不做过多拓展,相关架构模式可专门进行学习一下。看一下DDD分层的架构图:

其中对应层的功能介绍如下:

接口层(Interfaces):该层包含与其他系统交互的所有内容,如Web服务器、RESTful接口。接口层处理传入数据的解释、校验、编解码、序列化操作,同时可以考虑引入专门的DTO(数据转换对象)来协助数据转换;

应用层(Application):该层负责驱动应用程序完成工作流程。很薄一层,协调多个领域对象(实体、聚合根、领域服务)实现服务编排和组合完成工作流,该层通常不应该包含具体业务逻辑。该层涉及:其他微服务RPC调用、微服务编排和组合、分布式事务实现、消息驱动事件的驱动、日志记录等。

领域层(Domain):该层是软件的核心,包含业务逻辑具体实现,包含实体、值对象、聚合、领域服务、仓储接口等领域对象内容,通常该层应该配备图示告知软件是如何工作的;

基础层(Infrastructure):包含网关、缓存、数据库存储、消息中间件、监控、应用程序服务等通用的技术和基础服务。基础层以不同方式支持到其他三层,促进各层间通信。配置文件、数据库Schema模式定义以及仓储接口实现都是基础结构的一部分;

DDD分层架构传统三层架构的比较

DDD四层架构也基于传统三层架构的,看一下它们之间的对照关系:

DDD四层架构和传统三层架构有以下区别:

  • 关注点不一样:三层架构关注请求调用顺序;DDD架构关注领域服务。
  • 横向划分方式不一样:三层架构主要关注纵向划分,对横向划分没有约定;DDD架构更关注纵向,即:多个领域层之间划分及交互方式。
  • 对资源的定位不一样:三层架构把所有依赖的数据都放到数据访问层;DDD架构只将领域相关联的数据放到Repository中,其他比如API层缓存、文件等都当成基础服务来处理。

关于DDD架构分层还有整洁架构和六边形架构两种形式,这里就不再拓展,感兴趣的朋友可自行查找相关资料进行学习。

小结

本篇文章为大家讲解了市面上常见的架构分层。分层架构的目的是通过关注点分离来降低系统的复杂度,同时满足单一职责、高内聚、低耦合、提高可复用性和降低维护成本。但分层架构同样也有一定的缺点,比如开发成本高、性能略低、可扩展性低等问题。实践中,可根据需要选择合适的分层架构。

(0)

相关推荐

  • 领域驱动设计(DDD)在爱奇艺打赏业务的实践

    领域驱动设计(Domain-Driven Design,以下简称DDD)思潮的形成要追述到30几年前,17年前,Eirc Evans定义了领域驱动设计的概念.DDD一直为传统行业的软件工程师提供软件设 ...

  • 领域驱动设计在马蜂窝优惠中心重构中的实践

    前言 正如领域驱动设计之父 Eric Evans 所著一书的书名所述,领域驱动设计(Domain Driven Design)是一种软件核心复杂性应对之道. 在我们解决现实业务问题时,会面对非常复杂的 ...

  • GoFrame代码分层设计

    GoFrame代码分层设计 Golang2021-01-08 13:17:02 一.基本介绍 GoFrame是一款基础开发框架,既可以用于开发业务项目,也可以拿来开发代码模块.这里的代码分层设计主要是 ...

  • 软件架构设计分层模型和构图思考

    今天谈下架构设计中的分层思维和分层模型以及基于分层思维下的架构构图逻辑. 架构思维概述 对于架构思维本身仍然是类似系统思维,结构化思维,编程思维等诸多思维模式的一个合集.由于架构的核心作用是在业务现实 ...

  • DDD之代码架构

    荒腔走板 这是一篇迟到的文章.这其实是我写DDD的第四篇文章.去年11月份左右我在个人网站上写了三篇关于DDD的文章,都是比较偏战略部分的.那个时候我还在一个正在使用DDD的项目上,也是我第一次真正开 ...

  • 使用 DDD 指导微服务拆分的逻辑

    对于服务拆分的逻辑来说,是先设计高内聚低耦合的领域模型,再实现相应的分布式系统.服务的划分有一些基本的方法和原则,通过这些方法能让微服务划分更有操作性.最终在微服务落地实施时也能按图索骥,无论是对遗留 ...

  • 写作和阅读提升的4个阶段,你处于哪个阶段?

    当我们问「如何用阅读提升写作能力」这个问题的时候,其实我们已经默认「阅读对写作有作用」这个逻辑了----但阅读真的对写作有用吗,你是真的知道阅读如何对写作产生作用的,还是仅仅人云亦云? 阅读是如何对写 ...

  • 转化医学平台吉凯基因科创板预披露:收入主要来自靶标发现及其衍生业务,15个自有项目进入IND阶段

    相比于模式成熟的美国,中国新药靶标发现的创新.专利转化刚起步. 本文为IPO早知道原创 作者|罗宾 微信公众号|ipozaozhidao 据<IPO早知道>消息,上海吉凯基因医学股份有限公 ...

  • 血肌酐处于130-440阶段,肾友下一步棋如何走,才不会满盘皆输?

    之前有肾友给我留言说: 常听病友们说,肾病血肌酐升高,说明肾功能至少受损一半.那如果肌酐持续升高,是不是离尿毒症不远了?我肌酐265,几年会到尿毒症? 血肌酐确实是肾内科常用来检验肾病病情的指标之一. ...

  • 施工企业进行EPC项目执行中设计阶段管理

    施工企业进行EPC项目执行中设计阶段管理

  • 异性关系:这才是女人出轨率最高的年龄,你处于什么阶段?

    女人在不同的年龄阶段,认知不同,考虑问题的角度不同,需求也会不同. 在不同的年龄阶段,女人有着不一样的想法,初涉爱情,觉得有此一人,相伴到老是此生最浪漫的事情:结婚以后,觉得爱情抵不过柴米油盐的琐碎- ...

  • 五年级处于小学阶段的第三学段,所学知识难...

    五年级处于小学阶段的第三学段,所学知识难度增加,同学们在学习上更应该加把劲儿.就语文来说,对课文上要求背诵的篇章必须一字不差地背会写会,因为这关系到试卷上的按原文填空题.平时多阅读一些课外书,多积累一 ...

  • 【中企承建】!土耳其科尼亚地铁项目的第一阶段

    简介 近日,土耳其科尼亚市长宣布:地铁项目建设第一阶段正式获批.项目建设将由中国机械进出口公司联合体负责负责,价值11.9亿欧元. 此外,交通部将负责采购4列全新地铁列车,价值10亿土耳其里拉(1.7 ...

  • 【中企参与】!土耳其科尼亚地铁项目的第一阶段招标

    简介 2019年9月,土耳其科尼亚市政府宣布:科尼亚地铁项目的第一阶段招标于本月内正式开启. 近日,项目招标会正式举行,共有三家国际联合体参与竞争--中国机械进出口公司联合体.土耳其科林建设公司联合体 ...

  • 【即将招标】!土耳其科尼亚地铁项目的第一阶段

    简介 近日,土耳其科尼亚市政府宣布:科尼亚地铁项目第一阶段的招标将于本月内正式开启. 科尼亚市作为土耳其第七大城市,将步入拥有地铁的城市之列. 正文   项目背景--科尼亚地铁项目   科尼亚地铁项目 ...