天天看点

论软件架构风格

摘要:

        2020年3月,本人就职的某互联网公司承担了“XXAPP电子商务系统”的开发工作,该项目是集团为用户提供电子商务业务的重点项目,主要实现消费者的网上购物和在线支付以及各种商务活动、交易活动。本人作为核心成员有幸加入其中,担任架构师一职,主要负责该系统的需求分析和架构设计。在该系统中,笔者结合实际需求,从安全性、稳定性、可扩展性、开发和运维难度等多方面综合考虑,最终为系统选择了层次架构风格和面向对象架构风格。本文以该项目为例,介绍其各自特点,最后结合项目详细介绍层次架构风格和面向对象架构风格的实际应用,以及开发过程中遇到的问题和具体解决方案。这种架构设计有效地降低了维护成本,提高了系统的安全性,可拓展性,可复用性和可移植性。系统上线后得到了广大用户和集团对于系统的认可。

正文:

        2020年3月,我参与了公司电子商务系统”的研发,担任系统架构师职务,进行系统的架构工作。该系统的外部实体主要是分为4类组织,用户,商户,系统管理人员,金融支付机构。电商系统有几个特点,模型多且复杂度高,数据流链路长,业务变化快,应对突发流量性能要求高等特点。包括商品库存、订单支付、营销活动、售后配送、用户权益、商户管理等几大业务模型。随着业务不断迭代之后,每个模型的边界和管理会越来越复杂和逻辑冗余。

        本文结合作者的实践,以XXAPP电子商务系统为例,论述软件架构风格的具体应用。首先介绍本项目的概况,以及常用的软件架构风格有哪些,并且介绍其各自特点。然后针对笔者参与设计的系统所采用的的架构风格进行具体描述。最后结合项目实际实施情况,对该架构风格进行总体评价,对于设计中遇到的问题进行总结概述。

1.架构风格分类

        架构风格定义了用于描述系统的术语表和一组指导构建系统的规则,是系统组织方式的惯用模式,可以为我们的项目提供架构级的通用解决方案。这种架构级的软件重用可以极大提高我们的系统建设。软件系统开发中常用的软件架构风格有数据流风格,调用/返回风格,独立构件风格,虚拟机风格,仓库风格。在此笔者列举几类进行详细描述:

        调用返回风格包括主程序/子程序、面向对象和层次架构,其中,层次架构风格的特点是每层使用下一层的提供的服务,同时为上一层提供自己的服务,只能见到与自己邻接的层,逐步解决,化整为零,降低系统复杂度。

        独立构件风格包括进程通信和事件驱动,其中事件驱动的架构风格中,构件不直接调用一个过程,而是触发或广播一个或多个事件。系统中其他构件的一个事件被触发,系统自动调用在这个事件中注册的所有过程,提高了系统可扩展性。

数据流风格包括批处理序列和管道过滤器;虚拟机风格包括解释器和基于规则系统,该架构风格主要用于自定义规则或步骤,有良好的灵活性;仓库风格包括数据库系统、超文本系统和黑板系统,主要用于语音识别等领域。

2.层次风格的具体实践

        在项目启动初期,我们架构组通过开会研讨,列举了需实现的非功能性需求,例如安全性、可修改性、可用性等,然后结合复杂的电子商务业务。以及开发和维护的难点,最终决定采用层次架构风格和面向对象架构风格。首先采用层次架构风格,将整个系统进行层次划分,共分为五个层次,分别是:表示层、网关层、应用层、服务层和数据层。这样可以充分解决模块之间的耦合性,提升系统可修改性,可扩展性;并且通过层次划分指定了上层结构仅能调用下层服务,下层服务也只能服务于上层结构,以此保证系统的安全性。对于复杂的电子商务业务需求,我们采用面向对象的架构风格,通过对象的关系可以很好地将复杂的数据模型进行映射,充分实现代码的复用,提升系统的可修改性。下面笔者将具体介绍层次结构下的具体应用。

        表示层负责代表业务的视图展示,核心系统的前端页面、手机APP、H5页面等,通过访问下层网关接口的API进行业务逻辑的交互,从而将数据的变化展示给用户,实现前后端分离部署。

        网关层主要负责用户权益、路由转发、流量控制等功能,并将应用层共有的头部校验提取到网关层利用过滤器的方式实现,一方面可以提高系统的可修改性,减少代码冗余;另一方面可以提高系统的安全性。对于错误请求甚至非法请求可以直接在网关层拦截,对于合法的请求SpringMVC框架便会根据请求路径转发到应用层进行处理。

        应用层主要负责对不同的请求进行服务编排与调用。通过业务的策略来选择工作方式,也可以配置多条迭代校验规则完成业务上对不同业务逻辑的校验,这些策略和迭代规则都是配置化可以随意拆分组装,充分实现服务层代码块的复用,降低业务逻辑的耦合性,大大提高系统的可扩展性。

        服务层负责核心的业务逻辑处理,使用Spring框架为应用层服务支持,通过面向对象的架构风格简化了业务逻辑的复杂性。在该层次中,根据业务逻辑的定义,将各个业务流程的处理尽可能的剥离成单独的服务闭环,面向公共的服务模块统一提取。充分做到高内聚、低耦合。然后由应用层订制好的服务链,顺序地调用服务层不同的业务模块,从而完成本次请求。

        数据持久层作为最底层的概念,仅服务于唯一上层,服务层,通过面向对象的架构风格,将复杂的业务概念映射到具体的数据模型上,采用两级存储,MySQL作为核心数据存储,Redis数据库作为数据缓存,减少核心数据库的读压力,为数据的一致性、安全性提供有力保障。

3.遇到的问题及解决方案

        在系统开发到中期,由于复杂的电子商务业务的海量数据处理再加上层次结构的调用弊端,性能瓶颈逐渐暴露,针对这个问题,经过架构组开会讨论制定了以下两点解决方案:

        首先,针对数据库访问的性能优化,笔者决定使用分库分表的模式实现数据库的物理分离,降低数据库服务器的IO消耗,后期还可以针对服务器做横向扩展。同时增加缓存数据库作为应用系统与数据库系统的中间件,对于业务系统常用到的码表、地址表、配置表等基础信息可以预先缓存到缓存数据库中,进一步提高了数据访问效率。

继续阅读