论软件三层结构的设计
摘要:2020年3月,本人所在的某市金融投资集团启动集团综合管理系统的建设,涵盖融资租赁、基金管理、商业保理、融资担保、转贷等金融业务的业务管理系统及人力资源、智能会议、法务管理等管理功能的综合管理系统。本人在项目中担任架构师一职,负责项目的总体架构设计工作。本文以该项目为例,阐述了软件三层结构的设计。表现层采用MVC架构设计,合理分层,使得表现层易扩展,易维护,支持多种不同不同显示载体;中间层合理使用业务逻辑组件、工作流组件、业务逻辑实体设计,使得中间层合理解耦,提供强大的业务逻辑功能;数据持久层利用数据访问对象和对象关系映射组件达到透明的数据加载、访问能力,并利用分布式缓存提供优良的性能。最终项目顺利上线,至今运行平稳,得到了领导和同事的一致好评。
正文:
本人所在的某市金融投资集团已经建设了融资租赁系统、移动办公系统、财务系统等信息系统,但仍有很多业务缺乏信息化支持,已建成的系统比较分散,为“竖井式”建设,信息之间缺少共享,信息与业务流程相脱离。为解决上述问题,集团于2020年3月启动集团综合管理系统的建设,实现以下功能。一、建设涵盖融资租赁、基金管理、资产管理、商业保理、融资担保、转贷等金融业务于一体的业务管理系统及人力资源、智能会议、法务管理等内部管理的综合管理平台,实现部门与子公司的横向协同。二、建设统一的信息共享平台,利用数据报表平台,为管理层决策提供信息支持,实现纵向管控。三、建设金融领域架构方案,利用标准化的业务模板和业务流程,实现新业务需求的快速研发,以适应快速变化的市场需求。四、建设涵盖分布式文件存储、统一安全认证、分布式事务、工作流引擎、报表平台、虚拟化运维、监控等于一体的IT基础设施平台,提供高质量、可重用的基础服务,支持安全、高效、敏捷的创新IT环境。本人在项目中担任架构师一职,负责项目的总体架构设计工作。
在项目初期,我们就认识到分层设计会给项目带来的优势,包括有效降低建设成本,简化管理,适应大规模和复杂的应用需求。一般分为三层,包括表现层、中间层和数据持久层。表现层一般采用MVC设计,分别是视图、控制器、模型,视图接受用户的请求,是用户看到并交互的界面,还需要呈现数据,控制器是中转部分,负责接受请求并调用合适的视图和模型处理,模型是主体,负责提供数据,处理变更。中间层分为业务逻辑组件、业务逻辑工作流、业务逻辑实体、业务逻辑框架,一个模块设计一个业务逻辑组件,业务逻辑组件通过多个DAO支持,对外提供业务逻辑服务,工作流实现文件、信息、任务的自动流转,实体通过多表联合提供复杂数据。数据持久层则通过在线数据访问、DAO、DTO、离线数据中心、对象映射组件对外提供透明、一致的数据加载、存储、访问服务。
本文以集团综合管理系统为例,从表现层、中间层和数据持久层的设计,阐述了软件三层结构的设计。
一、表现层。
表现层以MVC模式为设计核心,利用视图、控制器、模型合理解耦,使得表现层易扩展、易维护,功能强大。集团综合管理系统在表现载体选择上有IPAD、智能手机、电脑等多种,而在手机端有需求支持APP,总体来说有网页版本和APP版本,网页版本需要支持流式布局,以支持不同尺寸的界面展示。因此我们需要保持在一个模型的基础上,实现多个视图和控制图的版本,这样模型这块的工作将得到有效降低,缓解时间进度上的压力。以转贷业务为例,我们在网页端需要支持数据的增删改查等全部流程及审批、审核等操作,而在APP端主要是数据的查看以及审批操作,两者定位并不一致,但是对于模型和控制器来说是基本一致的,对于有些不一致的功能,大部分也仅需要对控制器和视图部分做修改即可。另外在控制器上,我们还做了接口版本的控制,以做到对于不同版本接口的兼容性,保证用户即使使用老版本的APP仍然可以正常使用。当版本全部升级后,也可以对该版本的接口集中销毁处理,以保持代码纯净。
二、中间层。
中间层的设计包括业务逻辑组件、业务逻辑工作流、业务逻辑实体。业务逻辑实体是程序逻辑实现的主体部分,用于对外提供业务逻辑服务,是表现层主要接触的部分。我们在设计过程中,最重要的部分就是设计业务逻辑接口,对于大部分金融业务接口来说,主要需要实现的接口有增删改查,审批发起,审核发起,文件附件上传,查需要提供各种筛选项、排序,另外这些均需要做适当的角色控制,保证用户只在信息权限内操作,权限控制从三部分进行控制,包括菜单权限,主要用于控制前端显示性,接口权限,数据权限,从不同维度保护信息安全。审批主要通过工作流引擎进行配置,包括报表、决策树、工作流程的配置,基于flowable工作流引擎实现,并进行部门、用户、角色等信息的整合,实现用户可在网页端、手机端进行审批操作。由于业务复杂性,需要提供给前端以及前端提供过来的数据往往不是单表可以存储的,结合数据库设计范式,在查询时,多表联合查询是常态,因此业务逻辑实体的设计也是项目中重要的部分,另外它还需要支持与JSON的互转,以支持序列化。
三、数据持久层。
数据持久层解决数据的持久化存储加载和访问的问题,提供透明的数据服务。在项目中,主要使用了数据访问对象、数据传输对象以及ORM实现,其中ORM框架采用MYBATIS实现。数据访问对象的目的是将高层业务逻辑与底层数据实现解耦,作为数据层对外提供的接口,中间层的数据访问只需要与DAO进行交互,而DAO的实现是通过mybatis进行实现。Mybatis支持灵活的sql配置方案,相比hibernate支持自定义的sql,便于sql性能优化。而各种类型和sql模板的定义,也大大加快了开发人员的效率。而对于前端显示来说,很多数据在后端存储的是ID,而这些对于使用人员是无法使用的,需要转换为相应的名称,这些字段均在DTO中体现,另外像分页、查询字段也均在DTO中体现。另外我们还实现了基础模板,支持公共功能,除开基础的增删改查,还支持历史数据的查阅,归档后的数据变更以支持合同变更等,数据审核,支持变更数据留痕以支持审计。这样可重用的基础功能设计也是本次项目设计的设计原则,尽可能将重复出现的组件以优良、可重用、可扩展、灵活地状态呈现给最终开发人员。
2021年8月,项目顺利上线,得益于三层设计的优势,项目进展顺利,性能良好,也降低了对于开发人员能力素质的压力,整体质量良好,运行平稳,得到了领导和同事的一致好评。由于层次中具有较多的对象设计,虽然各自有自己的定位,但是在具体实现上存在功能耦合的部分,部分开发人员对于该设计缺乏认识,导致将不属于这里的代码放在这里,如将大量本应在中间层业务逻辑组件中实现的代码写到控制器中,导致难以重用、复用。因此为解决该问题,我们一方面加强了对开发人员的学习指导,另一方面细化设计方案,指出各部分应实现的操作方法、属性设计,降低开发人员的自主发挥空间。
另外,由于业务部门对信息化缺乏认识,在项目初期难以提出合适的需求,而在得到测试系统时会提出各种需求变更,这对于进度成本、项目质量的影响比较大,因此我们采取合理的变更控制流程,在进行成本分析时,得益于分层设计的优良特性,往往只需要对适当的层次进行修改即可,大大地减少了不可控的程度。