软件架构之论文篇(七)

论软件架构风格以及应用

摘要

        本人于2016年1月参与浙江省某市公交集团“公交车联网一体化”项目,该系统为新能源营运车辆补贴监管、安全监控等方面提供全方位的软件支撑,在该项目中我担任系统架构师岗位,主要负责整体软件架构设计与中间件选型。本文以该车联网项目为列,主要讨论了软件架构风格在该项目中的具体应用。底层架构疯狗我们采用了虚拟机风格中的解释器,因该公交共有几十种不同的数据协议,使用解释器风格可以满足整车数据协议兼容性要求;中间层敢于应用层的数据流转我们采用了独立构件风格中的隐式调用,这种风格主要用于减低系统间耦合度、简化软件架构,提高可修改性方面的架构属性;应用系统层我们采用了B/S的架构风格,统一解决公交行业性难题“实施推广难,维护难”问题。最终项目成功上线,获得用户一致好评。

        随着国家十三五计划中能源战略的深入和推广,该市公交集团自2016年1月起全面体制采购燃油机动公交车,规划到2020年纯电动公交车采购占比必须在70%以上,同时配套将车联网方面的系统建设被列为工作重点。不管从新能源营运车辆补贴监管、阿暖监控或者公交公司自身的营运和机护需求,都要求有新的车梁王系统对他们进行全方位支持,而我公司是该公交的主要仪表与主要模块产品的主要供应商,全市4000多台车中有3000多辆是我司产品,我司不仅掌握熟悉该公交整车数据而且在车辆网底层主要数据有非常明显的领域知识优势,因此2016年1月我司被改市公交集团委托建设公交集团车联网一体化项目。本项目全体成员共有27人,我在项目中担任系统架构师职务,架构小组共4人,我主要职责负责整体架构设计与中间件选型,4月份完成架构工作,整个项目共耗时7个月,2018年8月项目顺利通过验收。

正文

       在机构工作开始阶段,我们便伊始到,架构风格是一组设计原则,是能够提供抽象框架模式,可以为我们的项目提供通用的解决方案的,这种能够极大提高软件设计的重用方法加快我们的建设进程,因此在我司总工程师的见一下,我们使用了虚拟机风格,独立架构风格,以及B/S架构风格三种较常用的风格。虚拟机风格中的解释器架构风格能够提供灵活的解析引擎,这类风格非常适用于复杂流程的处理。独立构件风格包括进程通讯风格与隐式调用风格,我们为了简化架构复杂度采用了隐式调用风格,通过消息订阅和发布控制系统间信息交互,不仅能减低系统哦耦合度,而且还提高架构的可修改性。B/S架构风格是基于浏览器和服务器的软件架构,它主要使用http协议将进行通信和交互,简化客户端的工作,最终减低了系统推广和维护的的难度,以下正文将重点描述架构风格的事实过程和效果。

       底层架构我们使用解释器风格来满足整车数据协议兼容性需求。解释器风格是虚拟机风格的一种,具备良好的灵活性,在本项目中我们的架构设计需要兼容好多种不同的数据协议,一般来说这种软件编写难度非常高,代码维护难度压力也很大,因此这个解释器的设计任务便很明确了,软件设计需要高度抽象,协议的适配有配置文件来承担。具体的做法如下:我们对各个车场的主要数据结构进行高度抽象,由于主要数据有很多数据帧组成,每个数据帧容量固定并且标识和数据有明确规定,因此我们将主要协议中的id和数据进行关系建模,将增提协议标识作为一个根节点,已主要id作为根节下的叶子结点,使用xml的数据结构映射成整车协议链,核心代码采用jdom.jar与java的反射机制动态生成java对象,搭建一套可以基于可变模版的解释器,洗衣模版的产生可以由公交公司一共个excel协议文档进行转化得到,解释器支持协议模版热部署,这种可以将透传二进制数据直接映射成java的可序列化对象,将数据协议的复杂度简化,后期数据协议更改不会对软件产生影响,仅仅更改协议模版文件即可,最终沃恩使用了多个协议描述文件便兼容了这些复杂的数据协议,规避了数据巨大差异带来的技术风险。

        中间层我们使用独立构件风格中的隐式调用来简化构件件的 交互复杂度,降低系统耦合度。主要的视线手段是,我们采用了一个开源的消息中间件作为连接构件,这个构件是apache基金下的核心开源项目activemq,它是一款消息服务器,其性能和稳定性久经考验。由上下文提到的解释器解析出对象化数据经过activemq分发到各个订阅消息的系统,这些应用系统包括运营指挥调度,自动化机护,新能源电池安全监控等,这种多web应用的情况非常适合采用消息发布于消息订阅的机制,能够有小解决耦合问题,我们在编码过程发现只要采用这种风格的web应用,整个迭代过程效率极高,错误率降低,而且我们使用的spring框架,消息队列的管理完全基于简单的配置,清洗简单,维护性良好,例如整车安全主题,运营调度主题,机护维修主题等消息队列分类清晰,可以随时修改其结构也能够随时增其他主题的消息队列,不同的web系统监听的队列也可以随时变换组合,基于消息中间件的架构设计能够让系统的构件化思路的大良好实施,总体来说这种架构风格带来了非常清晰的数据流转架构,简化了编码难度,减低本项目的二次开发难度。

        应用系统层我们主要采用B/S的架构风格,主要用于解决公交推广难、维护难的问题。公交行业有一个明显的特点,公交子公司分布在全市各个地区,路途很远,且都是内网通讯,车联网络也是走的APN专网,一般是无法支持远程的,这给我们的系统推广以及后期维护带来了很大难题,我们可以想象如果我们使用C/S架构,更新客户端一旦遇到问题很可能需要全市各个站点跑一遍。这让我们在系统推广和维护方面面临较大压力。我们采用的B/S架构风格能够解决这个难题,并充分考量可现在的相关技术成熟度,例如现在的html5完全能够实现以前客户端的功能,项目中我们使用了大量的前端缓存技术与websocker技术,能够满足公交用户实时性交互等需求。这种风格中页面和逻辑处理存储在web服务上,维护和软件升级只要更新服务端即可,及时生效,用户体验较好,例如页面上需要优化,改一下js脚本或css文件就可以马上看到效果。

        该项目与2016年8月完成验收,这一年内共经历了2次大批量新购公交车辆介入,这几次介入过程平稳顺利,其中协议解释器软件性能没出现过问题,消息中间件的性能经过多次调优吞吐量也接近了硬盘IO极限,满足当前的消息交互总量,另外由于我们项目多次紧急状态下能够快速使用协议变动,得到过业主的邮件表扬。除了业主机房几次突发性的网络故障外,项目至今还未有重大的生产事故,项目组现留1开发人员和1售后在维护,系统的维护量是可控的,系统运行较为稳定。

        不足之处有两个方面,第一在架构设计的过程中我们忽略了PC配置,个别PC因为需要要兼容老的应用软件不允许系统升级,这些电脑系统老旧,其浏览器不支持html5,导致了系统推广障碍。第二在系统容灭方面还有待改善。针对第一种问题,我们通过技术研讨会说服业主可以新购pc,采用两台机器同时使用方式解决。针对第二种问题我们采用了服务器冗余和心跳检测等策略,在一台服务器暂停的情况下,另一个服务器接管,以增加可用性。

赠人玫瑰,手留余香,你的点赞是我不懈的动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/911373.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python-利用os,tkinter库编写一个伪恶意程序文件(Pro版)

前言:上一期我们简单学习了如何编写一个多次弹窗警告用户的exe伪恶意文件。我们知道了把Python初始文件编译为exe文件后,程序在没有Python环境的情况下也能正常运行。我们上次编写的程序仅仅只是伪造系统正在执行关机命令前的倒计时的假象,实…

大语言模型训练的全过程:预训练、微调、RLHF

一、 大语言模型的训练过程 预训练阶段:PT(Pre training)。使用公开数据经过预训练得到预训练模型,预训练模型具备语言的初步理解;训练周期比较长;微调阶段1:SFT(指令微调/有监督微调…

字节青训-小S的倒排索引

问题描述 小S正在帮助她的朋友们建立一个搜索引擎。为了让用户能够更快地找到他们感兴趣的帖子,小S决定使用倒排索引。倒排索引的工作原理是:每个单词都会关联一个帖子ID的列表,这些帖子包含该单词,且ID按从小到大的顺序排列。 例…

你需要了解的正则表达式相关知识

正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于匹配字符串的模式。它广泛应用于文本查找、替换、验证等场景,尤其是在数据处理、网络爬虫、编程等领域非常有用。下面将详细介绍正则表达式的基本语法、常用元字符…

掌握分布式系统的38个核心概念

天天说分布式分布式,那么我们是否知道什么是分布式,分布式会遇到什么问题,有哪些理论支撑,有哪些经典的应对方案,业界是如何设计并保证分布式系统的高可用呢? 1. 架构设计 这一节将从一些经典的开源系统架…

【C++进阶】智能指针的使用和原理(2)

5. shared_ptr和weak_ptr 5.1 shared_ptr循环引用问题 shared_ptr大多数情况下管理资源⾮常合适,⽀持RAII,也⽀持拷贝。但是在循环引⽤的场景下会导致资源没得到释放内存泄漏,所以我们要认识循环引用的场景和资源没释放的原因,并…

【Uniapp】Uniapp Android原生插件开发指北

前言 在uniapp开发中当HBuilderX中提供的能力无法满足App功能需求,需要通过使用Andorid/iOS原生开发实现时,或者是第三方公司提供的是Android的库,这时候可使用App离线SDK开发原生插件来扩展原生能力。 插件类型有两种,Module模…

linux进程的状态之环境变量

我们在前面了解了进程的状态及相关概念 接下来我们接着上一篇进程的状态接着了解环境变量 进程的状态 文章目录 目录 文章目录 前言 二、环境变量 1、常见环境变量 2、查看环境变量 3、修改PATH 4、HOME 5、PATH ​编辑 6、和环境变量相关的命令 三、环境变量的组织…

揭秘集装箱箱号自动识别原理,箱号识别算法

集装箱箱号自动识别算法是一种高效且实用的软件工具。它利用相机、手机或其他摄像头捕获集装箱箱号图像,并通过深度学习的OCR(光学字符识别)识别技术对集装箱号码进行准确识别。要想进行集装箱箱号识别,需要以下几个基本步骤&…

AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。

2024-10-31,由清华大学和北京大学共同创建的AndroidLab数据集,为安卓自主代理的训练和评估提供了一个包含操作环境、行动空间和可复现基准的系统框架,这对于推动安卓代理技术的发展具有重要意义。 数据集地址:Android Instruct|A…

使用axois自定义基础路径,自动拼接前端服务器地址怎么办

请求路径: http://localhost:5173/http://pcapi-xiaotuxian-front-devtest.itheima.net/home/category/head 很明显多拼接了路径地址 查看基础路径文件发现: //axios基础封装 import axios from axiosconst httpInstance axios.create({baseURL: /h…

Densenet模型花卉图像分类

项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

【Mysql NDB Cluster 集群(CentOS 7)安装笔记一】

Mysql NDB Cluster 集群(CentOS 7)安装笔记 NDB集群核心概念 NDBCLUSTER(也称为NDB)是一个内存存储引擎,提供高可用性和数据保存功能。 NDBCLUSTER存储引擎可以配置一系列故障转移和负载平衡选项,但从集群级别的存储引擎开始是最容易的。NDB集群的NDB存储引擎包含一整套…

Pattern program MPAT 详解

本文为VIP文章,主要介绍Pattern中元素与格式、常用指令、地址&数据产生指令等。 目录 一、pattern概述 二:Pattern构成元素 1、pattern构成元素:MPAT、END 2、pattern构成元素:pattern file name 3、pattern构成元素:SDEF 4、Pattern构成元素:REGISETR 5、Pa…

【通义灵码】AI编码新时代

目录 一.初识灵码,开启新篇 安装 登录 二.灵码相伴,探索新境 实时续写 自然生成 单元测试生成 解释代码 优化建议 快捷键 三.智慧流转,高效开发 驱动移植 LVGL框架 项目总结 四.融合创新,携手同行 一.初识灵码&#…

RabbitMQ客户端应用开发实战

这一章节我们将快速完成RabbitMQ客户端基础功能的开发实战。 一、回顾RabbitMQ基础概念 这个RabbitMQ的核心组件,是进行应用开发的基础。 二、RabbitMQ基础编程模型 RabbitMQ提供了很多种主流编程语言的客户端支持。这里我们只分析Java语言的客户端。 上一章节提…

PySide6百炼成真(2)

文章目录 1.简单的登录页面2.简单的计算器 本篇根据前面所学做两个小demo 制作一个简单的登录页面制作一个计算器 因为还没有学习布局流等,所以就只能拖拉到设计师中. 1.简单的登录页面 下面就到计算器了,在图形界面中计算器就跟我们编程语言的hello,world一样,所以一定要自己…

群控系统服务端开发模式-应用开发-上传工厂开发

现在的文件、图片等上传基本都在使用oss存储。而现在常用的oss存储有阿里云、腾讯云、七牛云、华为云等,但是用的最多的还是前三种。而我主要封装的是本地存储、阿里云存储、腾讯云存储、七牛云存储。废话不多说,直接上传设计图及说明,就一目…

服务器被病毒入侵如何彻底清除?

当服务器遭遇病毒入侵时,彻底清除病毒是确保系统安全和数据完整性的关键步骤。这一过程不仅需要技术上的精准操作,还需要严密的计划、合理的资源调配以及后续的防范措施。以下是一篇关于如何在服务器被病毒入侵时彻底清除病毒的详细指南。 一、初步响应与…

修改 title标题图标

路径 \web\views\webclient_templates.xml \web\static\src\webclient\webclient.js 再升级web模块