当前位置: 首页 > news >正文

论软件体系结构的演化

摘要        

        2022年3月,我加入了公司的新智慧公交平台项目研发团队,并担任系统架构师角色,负责系统整体架构的设计与评审。该项目采用了物联网三层架构模型,其中设备接入层和网络交互层基于公司的中台战略,我们有效复用了公司中台的S17设备交互平台组件。在公交平台的应用层,我们采纳了领域驱动设计(DDD)的理念,确保了每个模块代码职责的明确性,提升了整体架构的可复用性,为项目的持续演进和维护奠定了坚实基础。至2022年12月,项目顺利上线并稳定运行,凭借其卓越性能和高度可扩展的架构,赢得了广泛赞誉。如今,项目已稳定运行近两年,期间为了适应新需求和新技术,新智慧公交平台架构经历了不断演化的过程,目前已达到稳定成熟的状态。

正文

        在“互联网+”时代的大背景下,传统的公共交通行业因其业务复杂性较高和技术发展相对滞后,面临着转型升级的挑战。为了帮助公交行业适应新时代的变革,提升用户的公共交通体验,我们推出了新一代智慧公交平台。该平台以物联网技术为核心,互联网为接入门户,整合了小程序、云原生、大数据分析等前沿技术手段。2022年3月,我有幸参与公司新智慧公交平台项目的研发,担任系统架构师,负责整体架构的设计与评审。项目预计总投资3000万元,预计开发周期为9个月。我们旨在构建一个支持多元化生态的公交行业应用平台,利用新技术推动传统公交行业走向城市信息化的发展之路。

        在参与智慧公交平台架构设计的过程中,我们面临了人员流失等挑战,导致公司缺少具备公交行业全局视野的领域专家。鉴于此,我们的架构设计主要参照了现有平台的架构框架。由于缺乏对公交业务新需求的深入设计和建模,我们在设计过程中不得不对架构进行了多次的演化过程,以确保其能够适应不断变化的需求。在架构的演化过程中,我们确立了一系列关键的架构演化原则,其中包括:

  1. 主体维持原则:软件演化的增量增长应保持稳定,确保软件系统的主要功能和行为的稳定性。
  2. 平滑演化原则:在整个软件生命周期中,保持软件演化的速率稳定,避免剧烈变动。
  3. 模块独立演化原则:软件的各个模块应能够独立演化,模块内的修改不应影响整体架构的稳定性。
  4. 适应新技术原则:软件架构应独立于特定技术,具备良好的可扩展性,实现技术与业务的分离,确保引入新技术不会对整体业务流程造成不利影响。

        这些原则指导我们在架构设计和演化过程中,保持系统的灵活性和稳定性,以适应不断变化的市场和技术环境。

        在新的系统架构设计中,我们优先考虑保持原有系统的架构设计,以确保公交平台整体架构的稳定性。通过运用再工程技术,我们对老系统的架构设计、关键流程、接口设计等方面进行了详尽梳理。采用面向对象的分析和开发方法,我们利用UML图将这些信息整理成软件体系结构规格说明书、需求概要说明书、设备交互协议解析参考文档等,为后续的设计与开发工作奠定了坚实的基础。在此基础上,我们通过架构和接口的复用策略,在新系统的架构和需求设计中大量借鉴了老系统的设计理念和元素,确保了新系统与老系统在设计上的高度一致性。遵循主体维持老系统架构的演化原则,我们有效减少了新系统上线后可能出现的兼容性问题,如外部接口不匹配、数据迁移困难等,从而保障了系统的平稳过渡和持续运行。

        为了实现新系统架构的平稳演进,我们采取了持续的版本迭代策略。我们主要使用Git作为版本控制工具,并实施了大版本用于新增需求,小版本用于需求修改和错误修复的方针。结合敏捷开发理念,我们以较短的开发周期来满足用户和产品经理关注的需求点。每次版本更新时,我们控制新增需求不超过20项,以减少架构变动,遵循平滑演化的原则。通过精确的版本控制手段,我们有效管理了每次升级可能引发的运维问题。即便遇到意外错误,我们也能通过版本回滚迅速将生产环境恢复至前一稳定状态,从而提升了系统的容错能力。由于每次架构变动较小,用户能够轻松掌握系统升级的具体内容,这增强了系统的易用性。得益于这种平滑演化的策略,我们的系统始终保持稳定运行,赢得了用户的高度满意。

        在整体架构设计上,我们采纳了模块化的开发理念,并结合了DDD(领域驱动设计)模型。具体来看,我们的架构分为以下几个核心模块:

  • Adapter模块:负责封装接口,以满足前端交互需求。
  • Service模块:承担数据组装和领域模型的调用,实现具体的业务逻辑。
  • Domain模块:封装了领域模型,并通过数据交互层获取所需数据支持。
  • Client模块:提供外部调用的API接口,以便其他服务与之交互。
  • Wrapper模块:负责封装调用其他模块API接口的逻辑。

        这种架构设计有效地解耦了各个模块间的依赖关系,实现了业务逻辑与技术的分离。因此,在后续的项目维护中,我们可以遵循模块独立的演化原则,根据需要单独更新或优化各个模块。得益于这种解耦设计,我们的系统架构具备了更好的灵活性,能够轻松适应新技术的融入,为未来的技术升级和功能扩展打下了坚实的基础。

        自2022年12月项目正式上线以来,系统运行稳定,这得益于我们对版本控制的严格实施,以及在架构设计中贯彻模块化理念和DDD(领域驱动设计)模型。在整个架构演化过程中,我们始终遵循架构演化原则,确保了项目的优异性能和高可扩展性,赢得了广泛赞誉。如今,项目已顺利运行近两年。在这期间,为了适应新的业务需求和技术挑战,平台架构经历了持续的优化和演化,目前已达到成熟稳定的状态。通过参与此次架构设计和开发,我深刻理解了遵循架构演化原则的重要性,并在实践中深入掌握了架构演化的18个原则。这次宝贵的经验为我的未来工作奠定了坚实的基础。

相关文章:

论软件体系结构的演化

摘要 2022年3月,我加入了公司的新智慧公交平台项目研发团队,并担任系统架构师角色,负责系统整体架构的设计与评审。该项目采用了物联网三层架构模型,其中设备接入层和网络交互层基于公司的中台战略,我们有效复…...

【go入门】常量

目录 定义枚举iota思考题 定义 go语言常量的定义和其他语言类似,常量中的数据类型只能是布尔型,数字型(整型、浮点型、复数)和字符串型 常量的定义方式和变量一样,只不过变量定义使用 var 关键字,而常量定…...

2.1 HuggingFists系统架构(二)

部署架构 上图为HuggingFists的部署架构。从架构图可知,HuggingFists主要分为服务器(Server)、计算节点(Node)以及数据库(Storage)三部分。这三部分可以分别部署在不同的机器上,以满足系统的性能需求。为部署方便,HuggingFists社区版将这三部…...

工具类:JWT

工具类&#xff1a;JWT 依赖JwtUtil.java 依赖 <!-- 创建、解析 和 验证JSON Web Tokens (JWT)--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependenc…...

王道-计网

2 采用滑动窗口机制对两个相邻结点A(发送方)和B(接收方)的通信过程进行流量控制。假定帧的序号长度为3比特,发送窗口与接收窗口的大小均为7,当A发送了编号为0、1、2、3这4个帧后,而B接收了这4个帧,但仅应答了0、1两个帧,A继续发送4、5两个帧,且这两个帧已进入B的接收…...

【机器学习(十)】时间序列案例之月销量预测分析—Holt-Winters算法—Sentosa_DSML社区版

文章目录 一、Holt-Winters算法原理(一) 加法模型(二) 乘法模型(三) 阻尼趋势 二、Holt Winters算法优缺点优点缺点 三、Python代码和Sentosa_DSML社区版算法实现对比(一) 数据读入和统计分析(二) 数据预处理(三) 模型训练和模型评估(四) 模型可视化 四、总结 一、Holt-Winters…...

Webpack优化问题

目录 打包流程swcthread-loaderhash升级插件 打包流程 webpack 的打包流程大致可以分为以下几个步骤&#xff1a; 初始化&#xff1a;webpack 通过配置文件和 Shell 参数&#xff0c;初始化参数&#xff0c;确定入口文件、输出路径、加 载器、插件等信息。接下来读取配置文件…...

yjs10——pandas的基础操作

1.pandas读入文件——pd.read_cvs() data pd.read_csv("E:/机器学习/data/salary.csv") 注意&#xff1a;1.是pd.read_cvs&#xff0c;不要顺手写成np.read_cvs 2.路径的斜杠方向是/&#xff0c;不是\&#xff0c;如果直接从电脑粘贴路径&#xff0c;路径写法是\&am…...

Squaretest单元测试辅助工具使用

1、idea安装插件 Squaretest 然后关掉idea 2、安装字节码软件&#xff08;jclasslib&#xff09; 3、找到idea里面的Squaretest安装目录 找到包含TestStarter的jar包 4、打开 com.squaretest.c.f 打开后选择常量池 5、找到第16个修改 Long value值&#xff0c;修改的数字即为使…...

MFU简介

1、缩写 MFU - Mask Field Utilization&#xff08;光刻掩膜版有效利用比例&#xff09; GDPW - Gross Die Per Wafer&#xff0c;每张wafer上die的数量 2、什么是MASK 在光刻机中&#xff0c;光源&#xff08;紫外光、极紫外光&#xff09;透过mask曝光在晶圆上形成图…...

十分钟实现内网连接,配置frp

十分钟实现内网连接&#xff0c;配置frp 一.frp是什么&#xff1f;其实是一款实现外网连接内网的一个工具&#xff0c;个人理解&#xff0c;说白了就像是teamviwer一样&#xff0c;外网能访问内网。 利用处于内网或防火墙后的机器&#xff0c;对外网环境提供 http 或 https 服…...

解决MySQL命令行中出现乱码问题

在MySQL命令行中遇到乱码问题通常是由于字符编码设置不正确导致的。以下是一些解决步骤&#xff1a; 1. **检查和设置字符集**&#xff1a; 首先&#xff0c;您需要确保MySQL服务器、客户端和数据库使用的是正确的字符集。您可以通过执行以下命令来查看当前的字符集设置&…...

TS系列(7):知识点汇总

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 一、TS是什么&#xff1f; TypeScript 由微软开发&#xff0c;是基于 JavaScript 的一个扩展语言。TypeScript 包含 JavaScript 的所有内容&#xff0c;是 JavaScript 的超集。TypeScript 增加了静态类型检…...

Unity 查看Inspectors组件时严重掉帧

遇到一个问题&#xff0c;就是运行一个脚本的时候&#xff0c;只要我查看它的Inspectors&#xff0c;就会严重掉帧。 原本是30fps&#xff0c;只要查看这个组件&#xff0c;就掉到5fps。 这还真有点像波粒二象性&#xff0c;一观察就会掉帧&#xff0c;不观察就正常。 using…...

golang学习笔记23-面向对象(五):多态与断言【重要】

本节也是GO核心部分&#xff0c;很重要。 注&#xff1a;由于导包语句已经在19讲&#xff08;笔记19&#xff1a;面向对象的引入&#xff09;展示过了&#xff0c;所以这里就不展示了。 一、多态&#xff08;Polymorphism&#xff09; 变量&#xff08;实例&#xff09;具有多…...

RabbitMQ基础知识

1.1 什么是MQ? 消息队列&#xff08;Message Queue&#xff09;&#xff0c;是基础数据结构中 “先进先出” 的一种数据结构。 一般用来解决应用解耦、异步消息、流量削峰等问题&#xff0c;实现高性能、高可用、可伸缩和最终一致性架构。 RabbitMQ可以理解为一个邮箱&#x…...

基于Python大数据的音乐推荐及数据分析可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…...

安达发|太阳能设备行业APS计划排程软件能解决哪些问题

在当今快速发展的太阳能设备行业中&#xff0c;高级计划与排程&#xff08;APS&#xff09;软件成为了企业优化生产流程、提高生产效率和满足市场需求的关键工具。APS软件通过集成先进的算法和数据分析技术&#xff0c;为企业提供了一个全面的生产计划和排程解决方案。本文将探…...

CaChe的基本原理

目录 一、Cache的定义与结构 二、Cache的工作原理 三、Cache的映射与替换策略 四、Cache的写操作处理 Cache&#xff0c;即高速缓冲存储器&#xff0c;是计算机系统中位于CPU与主存之间的一种高速存储设备。它的主要作用是提高CPU对存储器的访问速度&#xff0c;从而优化系…...

数据结构-栈(理解版)

一、栈的定义 相信大家对于栈或多或少有一些了解&#xff0c;可能大多数人会告诉你栈是一种先进后出的数据结构。这其实说了跟没说一样(❁◡❁)&#xff01;当然&#xff08;last in&#xff0c;first out&#xff09;是栈最有特色的性质。 这里可以给大家一些比较好理解的例…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...