论系统架构风格
摘要:2020年4月,本人所在的某市金融投资集团启动了集团综合管理系统建设,该项目实现基金、融资租赁、资金管理、转贷、融资担保、保理等金融业务信息化及人力资源、智能办公、法务管理等内部管理功能。在此项目中,我担任了架构师,负责项目总体架构设计工作。本文以该综合管理系统为例,主要论述了系统架构风格的选择及原因。我们通过层次架构风格为基础,将系统划分为IT基础设施层、业务通用层、特定业务层,使得系统层次分明,最大化系统重用性及可扩展性;通过事件驱动系统风格实现构件解耦,构件之间通过事件进行关联,便于扩展和维护;通过浏览器服务器架构风格实现系统维护轻量化,并支持各种载体,随时随地可运行。最终项目顺利上线,运行平稳,获得了领导的高度认同。

正文:本人所在的某市金融投资集团已经建设了移动办公系统、财务系统、融资租赁系统、基金管理系统等应用系统,但仍有部分业务缺乏信息化支撑,已建成的系统比较分散,主要是“竖井式”方式建设,系统与系统之间信息不共享以及信息与业务流程相脱节。针对这些问题,2020年4月,经集团决定,启动集团综合管理系统建设,实现以下功能。一、统一规划,实现转贷、保理、融资担保、资金管理、人力资源、智能办公等业务流程信息化,同时整合基金管理系统、移动办公系统、财务系统等已有信息资产,促进部门、子公司之间横向协同。二、建立统一共享的信息平台,利用数据报表平台为管理层提供决策信息支持,实现纵向管控。三、建立涵盖分布式文件存储、单点登录、分布式事务支持、短信邮件通知、可控任务调度等服务的基础IT设施,提供高质量、可重用、易扩展、稳定安全的平台服务。
在此项目中,我担任架构师一职,负责系统总体架构设计。在项目设计初期,我们就明确了项目风格的重要性,利用架构风格明确系统组织结构的基本框架,包括构件、连接件及约束,那么系统的质量属性将得到充分的保障。
软件架构风格是描述某一特定应用领域中系统组织方式的惯用模式。在过滤器管道风格中,数据输入经过过滤器处理,产生数据输出,然后管道将输出的数据导入到过滤器,作为数据输入,这个风格中的构件就是过滤器,管道作为连接件。数据抽象及面向对象风格中,将数据的属性及操作封装在抽象数据或者对象中,该风格的构件就是对象。事件驱动系统中构件不直接调用构件,而是通过触发一个或多个事件,构件将自己的操作注册到感兴趣的事件中,当事件触发时,由系统自动调用所有注册的过程。层次结构系统风格将系统划分为多个层次,每一层为上一层服务,并作为下层客户,除少数接口,层次之间不跨层调用,层次间的协议作为连接件,实现系统解耦。仓库及知识库风格是中央数据结构说明服务器状态,独立构件运行于数据存储上,其中又包含传统数据仓库风格及黑板系统风格。另外还有C2风格、B/S风格、C/S风格等等。本文重点阐述层次架构风格、事件驱动系统风格及B/S风格在本项目中的选择的原因。
一、层次架构风格。
层次架构风格将系统抽象为多个层次。在本项目中,由于集团在制度上已经形成初步的流程通用性,如各个业务的业务流程基本可划分为立项、尽调、调整、合同会审、投放、财务收付款、收尾等,而其它所有的业务都是基于该套通用流程进行个性化定制。而对于各种IT基础服务,形成专门的层次为上层提供服务也是非常有必要的。因此我们选择层次架构风格作为总体架构基础,实现清晰的层次划分,通过良好的层次接口设计,避免跨层交互,减少层次所需要的注意点,形成系统良好的高内聚低耦合特性。在本项目中,我们设计的层次第一层为IT基础服务层,为系统提供底层的服务,包括系统配置管理、存储、安全、工作流、监控、部署、事务等各方面,核心目标是为上层提供快捷的开发和运维服务;第二层为通用业务层,是对底层服务的高层业务封装,提供更加具体的业务逻辑服务,并且对于特定业务层所通用的业务流程进行抽象,以形成高层业务的重用;第三层为特定业务层,该业务层通常以通用业务层为基础做定制化开发,以实现特定业务。我们制定好每层的交互协议,那么对于不同层次就可以进行同步的开发,只需要遵循协议,最后可以快速集成。
二、事件驱动系统风格。
事件驱动系统风格以事件为核心,实现构件间的解耦。构件的交互是系统必不可缺少的,传统的直接调用会引起构件间的强耦合,每一次轻微的变动都会导致局部结构甚至整体结构的调整。以客户关系为例,该模块以实现不同业务部门的跨部门协调为目的,实现客户价值的最大化利用。在该模块中,当业务经理对客户拜访后,会采集客户的需求,并将需求发布到系统中,然后由各个对该需求感兴趣的业务模块进行处理。如果按照传统直接调用,每增加一个业务模块,或者业务变动,都需要对客户关系模块代码进行变动,而通过事件机制,我们只需要将该需求发布到消息队列中,各个业务模块注册自己所关心的消息。如转贷业务可注册该事件,当事件发生时,产生自己的进一步拜访任务,而对于其它业务可能仅产生一条任务通知,这样不同业务部门都可定制化对该事件的处理规则。即使增加了新模块,我们并不需要修改事件发布的代码,只需要在新模块中订阅该事件,并实现个性化处理过程即可。可见,事件驱动系统风格极大地增强了系统的可扩展性、可维护性,降低系统的耦合性。
三、B/S架构风格。
B/S架构风格是轻量级的客户端服务器三层架构实现。在传统的客户端服务器架构中,对客户端的升级部署是极为复杂的,并且客户端极难适配各种不同系统的主机。而基于浏览器可以解决该问题,用户只需要拥有浏览器,不管在PAD、手机、电脑均可以访问系统。在H5和ajax的基础上,Vue实现了极强的交互能力,并且可根据载体的不同,对界面进行适配,呈现最佳的状态。B/S架构属于三层架构,分为浏览器端、应用服务器、数据库服务器,我们在浏览器端和应用服务器端之间增加了nginx web服务器,所有对服务器的访问需要经过nginx,反向代理后转发给后端的应用服务器,以实现内外网的隔离。在架构中,我们尽量将业务逻辑集中在应用服务器,实现浏览器端的轻量化,但是也充分利用好客户端缓存机制,毕竟前后端的交互产生的延迟会对客户产生不好的体验。另外,我们的开发人员对于web组件有相当多的积累,因此我们可以在构件化的基础上快速地构建系统,真正做到“零客户端”,适配各种异种机,而不需要付出极大的成本代价,这对于基于客户端是难以想象的。
系统于2021年8月顺利上线,运行平稳,有力地支持了集团业务协同开展,为领导层决策管控提供了可靠的数据基础,获得了领导和同事的一致好评。由于项目的架构风格选型适当,构件之间充分解耦,为系统带来了良好的可扩展性、可维护性,充分利用了浏览器在近年来的升级进步,实现了随时随地使用系统。在开发过程中,由于业务需求也在不断变更,所幸设计得当,变更得以快速实现,并未对项目进度产生大的影响。如在项目开发过程中,我们在设计初只考虑了新业务的开展,而未考虑已开展业务数据的录入,因此旧数据的录入也会导致审批流的产生,而这并不是用户所期望的。经过综合考量,该需求普遍存在,我们决定从通用业务层入手,再录入时由业务人员决定该数据是否是遗留数据,再决定是否启用工作流。这样我们就完美解决了该问题,并对所有业务做了支持,这样的便利性很大原因来自于层次架构设计的优势。
同时层次架构也给设计人员和开发人员带来了挑战,越是低层次的构件,其会被高层构件大规模复用,在开发过程中,如果设计不当或代码错误都可能导致原来已经能够顺利运行的高层功能失效。这就要求底层开发和设计人员的能力素质要强,另外我们要求单元测试必须编写到位,以能够自动检测出大部分错误,再加上回归测试以最大程度避免错误。总体来说,系统得益于架构风格,保证了系统优异的质量属性。