系统架构设计师论文分享-论软件体系结构的演化
我的软考历程
摘要
2023年2月,我所在的公司通过了研发纱线MES系统的立项,该系统为国内纱线工厂提供SAAS服务,旨在提高纱线工厂的数字化和智能化水平,我在该项目中担任架构设计师,负责该项目的架构设计工作。本文结合我在该项目中的实践,详细论述了软件体系结构的演化。系统上线后,为了满足新需求和适应新场景,就必须修改原有软件架构。在软件架构演化过程中遵循以下原则:演化适应新技术、有利于重构和重用、影响和复杂性可控、模块独立演化等等。我在该项目中应用了以上演化原则,保障了项目的稳定性和质量指标。最终该系统在2023月12月正式对外提供服务,至今稳定运行,各项功能和性能指标均达到了客户的要求,得到了客户工厂和公司领导的一致好评。
项目背景
随着我国从制造业大国升级为制造业强国以及工厂数字化和智能化的持续推进,我所在的某地某科技公司基于自研的物联网平台相继开发了染整一体化和织布一体化等系统,这些系统上线后,得到了工厂的追捧,也为公司带来了丰厚的经济回报。基于此,我司于2023年2月开始研发纱线MES系统,该系统总投资730万,开发周期10个月,涵盖纱线工厂从清花、梳棉、并条、精梳、粗纱、细纱到络筒的全流程工序,将为纱线工厂提供全面的生产管理解决方案以及基于数据的智能决策分析能力。该项目采用物联网层次架构,整体分为感知层、网络层和应用层。其中网络层为公司已有的物联网平台,这次重点建设内容为感知层和应用层,感知层使用Golang语言开发,作为联网网关部署在工厂侧,负责工厂数据的采集和云端指令的下发。应用层为纱线MES系统主体,采用Java语言开发,使用Spring Cloud微服务架构,数据库使用Mysql,缓存使用Redis,前端框架使用vue.js,日志、监控和链路追踪采用skywalking、prometheus、grafana和ELK,最终通过devops的方式部署在kubernetes集群中。系统上线后,将提供以下:基础管理、数据接入、工单排产、数字孪生、工资计算、智控中心和数据分析等等功能,通过以上功能,可以全面提升纱线工厂的数字化和智能化水平,使其运营水平和生产效率得到质的提升。
论述内容
由于该项目涉及模块众多,业务逻辑和流程复杂,不同工厂又有不同的个性化需求,所以在系统迭代的过程中,就要对现有的架构进行改造和调整。但是架构的演化是复杂和困难的,为了保证项目的质量指标和稳定性,我们团队一致决定在架构演化过程中需要遵从常用的演化原则。常见架构演化原则有:
1、演化适应新技术原则。架构在演化的过程中,需要可以使用新技术,并把新技术集成进来,也要可以适应新环境,这样可以提高架构的可扩展性和灵活性,让架构能够做到技术异构型和适应不同环境。
2、有利于重构和重用原则。架构在演化的过程中,要采用灵活的架构设计和配置文件的方式,让架构变得更容易重构,同时让模块更加通用和独立,让模块可以更好地被重用。这样有利于架构的可扩展性和可重用性。
3、影响和复杂性可控原则。在在架构演化时,一定要遵循一定的过程,首先要分析影响范围,其实标识要修改的构件,然后分析修改后的架构关系,最后要做测试和严格的评审。要确保演化的影响和复杂性是可控的,不能对架构造成严重的不可预知的故障。
4、模块独立演化原则。在做架构演化前,架构的设计一定要到模块化,模块之间要高内聚、低耦合,模块之间互相不要影响,一个模块的改动不要扩散到别的模块之中。这样有利于控制演化的范围,降低演化造成的不可预知的后果。
我们在具体实施过程中,采取了多种技术和措施来遵从以上的架构演化原则,首先我们采用了微服务架构,该架构具有技术异构型、独立性、容错性、可扩展性等等优点。在微服务架构的基础上,我们又采取了诸如分层设计、主从、缓存等多种方法来贯彻这些原则。以下是具体的实践过程。
一、业务服务化,实现业务模块独立,来遵循模块独立原则、影响和复杂度可控原则。
我们采用了微服务架构设计,在开发之初,就对纱线业务做了领域建模,通过DDD领域分析对整个纱线MES系统做了微服务的拆分。在拆分的过程中,我们遵循微服务架构的设计约束:微服务个体约束、微服务纵向约束、微服务的横向约束以及分布式全局视角下的约束。通过以上设计原则,我们保障了每一个微服务都是独立开发、迭代、部署和上线的,微服务之间互不影响,它们相互调用的时候也采用了熔断和服务降级的机制,让微服务之间的耦合降到了最低。具体来说,我们部署了nacos集群,微服务把接口上报到nacos集群中,调用的时候可以通过nacos获取到具体的微服务提供的接口,这样就实现了微服务之间的横向的隔离。又比如,在数据层面,每一个微服务都有自己的数据库,如果一个微服务需要别的微服务的数据,那么就要通过别的微服务提供的接口来获取,这样就实现了微服务之间的纵向的隔离。通过以上的方式,就确保了业务之间,模块之间的独立性,保证了模块独立原则,在修改一个模块时,也做到了影响和复杂度可控原则。
二、采用分层设计,遵从有利于重构和重用的原则。
分层架构是一种最常见的架构设计方法,它把系统分为几个层级,每一个层级只依赖下层,这样有利于简化系统,降低系统的复杂度,让系统架构清晰,有利于重构和重用。纱线MES系统具体在实施时就采用了分层架构思想,整体分为感知层、网络层和应用层。感知层部署在工厂侧,使用Golang语言开发,在感知层做重构时,只要保证跟网络层的接口保持不变,就可以做到重构和重用的独立性。网络层使用公司自有的物联网平台,该层主要做了网络方面的封装以及数据的路由,解析和转换工作。它通过MQTT协议与感知层交互,通过Kafka消息队列和有应用层交互,有效降低了层次之间的耦合,保证了各自重构和重用的自由度。
三、采用容器化方式,遵从适应新技术、新环境原则。
容器化在部署时屏蔽了底层的差异,同时在部署时把所有的应用可以采用统一容器化部署方式。这样就可以灵活地去采用不不同的新技术,也可以让容器部署在不同的操作系统和环境中。做了技术和环境的隔离,有效地遵从了适应新技术和新环境原则。具体操作就是把系统中用的构件,比如业务微服务,消息队列组件等等都通过构建容器镜像的方式,而这些微服务和构件就可以采用不同的技术去实现,比如感知层使用Golang语言开发的,而应用层是用Java语言开发的,这就适应了新技术。在具体部署时,借助容器的可移植性,通过在不同的环境下部署kubernetes环境,我们就可以把容器一键自动化部署在kubernetes集群中,有效地避免了环境差异的影响,遵从了适应新环境原则。
总结
通过采用以上的步骤和方式,我们遵从了演化适应新技术、有利于重构和重用、影响和复杂性可控、模块独立演化等架构演化原则,保证了每次迭代的稳定性,确保了项目的开发质量。最终在2023年12月,该项目正式投产并对外提供服务,至今稳定运行,各项功能和性能指标均远远超过了客户的预期,得到了客户工厂和公司领导的一致赞扬。虽然项目取得了成功,但是也遇到过一些问题,在项目初期,由于产品经理对纱线业务的不熟悉,导致很多功能的调整和返工,这打击了开发人员的士气,基于此,我提出两个解决方式:1、派产品进入工厂一线,与工人交流,熟悉操作流程,彻底摸清纱线业务,保证需求质量;2、开发人员也要学习纱线业务,遇到问题反馈给产品,同时在做设计时,采用灵活的设计模式,为需求的变动留下可操作的空间。我们通过这两个方法解决了这个问题,保证了项目的进展。通过这次实践,我不仅学习到了架构演化的相关技术,也锻炼了自己的架构和管理能力,我意识到只有不断地学习和实践才能让知识融汇于自己的技术体系之中,才能在未来的工作中游刃有余、勇担大任,为祖国的信息化建设贡献自己的力量。