背景
层次架构作为软件系统设计的一种基本模式,对于实现系统的模块化、可维护性和可扩展性具有至关重要的作用。在软件系统的构建过程中,采用层次架构不仅可以使系统结构更加清晰,还有助于提高开发效率和质量。因此,对层次架构的理解和应用是软件工程师必备的技能之一。
题目
请围绕“层次架构及其在软件系统中的应用”论题,依次从以下三个方面进行论述。
- 该要叙述你所参与管理或者开发的软件项目,以及你在其中所承担的主要工作。
- 请详细阐述你在层次架构设计中的主要工作和思路,包括你如何确定系统的层次划分、个层次之间的交互方式以及层次架构如何支持系统的核心功能。
- 详细说明你在层次架构设计过程中遇到的挑战和解决办法。
论文
摘要
层次架构几乎是软件架构中最常见且最实用的架构方式之一,良好的分层对于软件系统的可维护性和可扩展性有着深远影响。本文结合笔者实践,以某航空航天研究所信息化项目管理软件设计工作为例,讨论层级架构在实际软件开发过程中的巨大指导作用以及诸多细节和面临的挑战,包括如何良好的分层,分层所带来的好处以及所面临的挑战和不足处。
该系统为国家信息化战略产物,是基于项目驱动的信息化项目管理平台。其中包括计划管理、资源管理、进度管理、信息中心等诸多模块。在本项目开发过程中,我担任了软件设计架构师,负责软件的整体架构设计工作以及设计工作的落地开发指导,与项目开发人员及管理人员密切配合同理完成该项目。
正文
随着国家信息化建设战略方针的深入落地,某航空航天研究所肩负国家使命,需要对原有手动制定项目计划,手动审批项目,手动查看项目报表等等低效的手动操作进行升级改造以适应变化快速的当今社会和层出不穷的技术迭代。我司凭借深耕项目管理平台的多年研发经验,于某年中标该项目。在我开发人员和设计人员的通力协作下,该项目历时11个月,成本150万,按时交付客户使用。
项目整体为B/S架构,基于Spring boot 构建的Web服务作为后段服务器,数据库选择使用性能较佳的Postgrel SQL,前段采用angular JS,从而实现前后端分离开发和独立测试以及部署。该项目功能方面,包含基础的项目管理、计划管理、物料管理、审批管理、信息中心等诸多模块。本人作为项目架构师负责参与项目整体架构设计工作,以及技术选型和技术难点解决。
接下来我们将从独立构件内部分层和项目整体架构分层如何做出有效选择的角度出发,共同探讨包括,1,如何确定系统的层次划分;2,各层次之间的交互方式;3,层次架构如何支持系统的核心功能。从这三方面论述良好的层级架构设计给软件系统带来的诸多益处。
层级架构思想的核心是将复杂系统进行良好分层,分层的思想是分而治之,也就是人们常说的“关注点分离”。其实这是符合逻辑现实世界的,比如现在互联网架构的七层分层结构等。面对庞大纷繁的系统,做好分层工作从项目之处就至关重要。对系统带来的好处也是不言而喻的,比如,分层后可以在开发阶段齐头并进(独立开发),部署阶段独立部署(性能提升),维护阶段可以轻易地增加模块或者实现结构从而完成扩展(面向接口、切面的编程都得益于良好的分层)。
那么如何选择合适的分层就至关重要,这也是设计工作开展的第一步和项目架构的基石所在。然而分层也不是多多益善的,比如过多的分层会导致系统复杂度过高、健壮性下降、稳定性和可高度也会随之下降。另外典型的污水池反模式的产生,即请求什么也没做就穿透过几个分层。当然根据二八原则,如果超过20%的请求透过这一层我们就需要考虑将这一层变成开放的。由此,可以看出掌握合理的分层的确很重要。
以本项目为例。我们共同探讨如下三点:
1、合理地选择分层。起初在设计后端服务时,经讨论设计了三层,1、Controller负责请求的转发,2、Service负责业务处理,3、Repository(DAO)负责建立数据库的连接,这也是经典的Web服务分层模式。可是随着业务的不断增加,我们发现,原有的Service 层存在大量的重复逻辑,比如作为安全考量,数据库查询出的Entity需要进行组装和转化才能传递给Controller,系统当中充斥着大量的重复代码。往往业务没有变动但是组装逻辑发生了变化就需要增加一个Service改动很大。
于是,我提出了在Service层和Controller 中间增加一层,Facade层。该层只负责接收接口的参数输出业务处理后的DTO,将所有的转化逻辑封装斤一些填充器和转化器。如此一来原有的分层变得清晰,Controller 负责转发请求,Facade 负责组装安全的可以对外暴露的DTO,Service负责业务处理,DAO负责和数据库的交互。这一重构过程其实再次反映出分层的优点,往往我们可以定一个基准分层,然后再进行扩充或者缩减。
2、合理地完成层次间的交互。本质上讲,层次间的交互属于附带品,换言之,由于分层才产生了交互。以大的分层为例,项目整体分为前端、后段、数据库。这里就有两层交互,第一前后端的交互,第二后段与数据库的交互。前者采用基于HTTP协议的RESTFul API交互,可以在安全和效率上得到确保。后者采用JDBC的ORM实现Spring JPA作为交互,当然不止于此也可以跟不同ORM厂商作集成比如Hibernate 或者Mybatis等。 以构件内部分层为例,交互是面向接口的,这极大的增加了程序的可扩展性和可修改行,是符合开闭原则的(面向增加开放,面向修改关闭),需要增加新的功能,开发人员只需要增加相应的接口实现即可。
3、层次架构友好地支持系统核心功能。众所周知,系统的核心功能不单单是业务需求,其中性能、安全也是必不可少的。以本项目为例,项目一期合同是不包含信息中心模块的,这个模块主要功能是将项目中产生的大量信息整合处理,形成信息中心让研发人员可以快速的搜寻自己需要的相关资料。得益于良好分层,这一部分工作仅仅需要在后段增加相应的接口,前端微小调整增加搜索栏就可以快速实现。另外前后端分离的设计使得后端服务器可以根据具体需求增加数量,这也给后期性能提升做好的了铺垫。由于航天航空属于国家重点保密单位,审计功能在一开始便是默认其中的。同样是由于良好的分层,对于审计工作才能顺利开展,在数据库层之前,我们增加了审计消息生产器,所有包含敏感数据源的代码均需要发送审计信息到另外的服务器进行记录和处理。
通过以上三点不难看出,良好的分层至关重要,从开发阶段的齐头并进到部署阶段的性能动态扩展,到维护阶段的功能追加都与分层密不可分。该项目交付后,稳定运行至今,深受客户喜爱,为我国航空航天事业的发展添砖加瓦。尤其是计划管理模块可以和国外某大型C/S架构的项目管理平台不相上下。以及二期项目中增加的信息中心模块让研发人员爱不释手,以前手动翻阅资料的效率低下和现在快速搜索的高效便捷形成鲜明对比。
然而,任何事物都是有两面性,随着航天事业的蓬勃发展和我国信息化建设的深入,该项目在后期肯定会面临数据量激增的问题,以及安全审计的问题。前后端分离基于B/C的架构虽然利于开发,但是并非所有的航天院所都可以安装浏览器(基于我国保密协议),这就是的该系统可能存在一些限制。包括后期数据量过大,单体数据库肯定要做到多节点部署以确保数据的安全性和性能。如此带来的服务治理、安全确保、数据库的主从复制都是逐渐迫使系统越来越复杂。这也是后期作为架构师我需要深度思考和解析的。