基于架构软件设计方法及应用

      随着国内外化工行业的繁荣与发展,从2018年开始,某能源集团下属的化工部,连续投资建设了MES(生产制造)系统、设备管理系统、安全管控系统、能源管理系统。这些系统建设得都非常好,无论是业务的切合度,还是系统的运行情况都非常良好。但是这些系统都是各自运行,相互独立。也就形成了一个个所谓的信息孤岛。为了消除这些信息孤岛,该化工部又投资建设了化工生产综合运营管控系统,简称运营管控系统。正好是我们公司承建了该系统,作为公司技术骨干,我有幸担任该系统的架构师,负责整个系统的架构设计。

     运营管控系统主要是集成、整合生产、安全、设备、能源这几个系统。系统主要通过页面或者报表的形式给各相关单位提供查询、分析以及录入数据的功能,同时也为化工部领导做决策分析时提供数据支撑。经过仔细梳理,运营管控系统分为5个大模块,工厂模型、工作台、通用服务、业务活动监测、运营管控。

   我们知道,基于架构的软件设计强调由商业,质量和功能需求的组合驱动软件架构设计。强调用视角与视图描述软件架构,用用例与质量场景描述需求。基于架构的软件设计有三个基础,即功能分解,架构风格的选择,以及软件模板的使用。按照基于架构的软件设计方法的理论,整个过程包括架构需求、架构设计、架构文档化、架构复审、架构实现和架构演化六个阶段。这六个阶段可以说是一步接一步。这六个阶段的具体工作内容,这里就不一一论述了。在我们实际开发过程中,重点是架构需求,架构设计,架构实现这三个阶段。

架构需求

     在需求的前期阶段,我们采用了用户访谈和调查问卷结合的方式,把需求调研团队分成了几组,分别进行需求收集。通过与化工部业务专家的进行详细沟通。我们对运营管控主要业务功能、用户角色等有了整体、全面的了解。之后又制作了调查问卷表格,下发给各级单位业务人员,经过整理分析后,我们基本获悉了各级业务活动、过程细节。在需求的中期阶段,我们在化工部领导的协助和安排下,前往各个化工厂进行实地调研,对化工生产现场进行了观摩,了解了在现在各个化工厂生产方式以及具体生产流程。在需求的后期阶段,我们基本上已经掌握大部分业务需求,通过快速原型法构造出了一个运营管控原型系统,供专家和用户试用与反馈,让用户也参与到设计中,提供了工作流程方面、业务领域方面不可或缺的经验,也为以后项目通过验收提供了有力支持。

架构设计

     在此阶段主要解决的问题是如何合理设计与描述软件架构。根据4+1的视图模型,我们基本按从5个不同的视角来描述软件体系架构,其中包括场景视图、逻辑视图、实现视图、进程视图、物理视图。场景视图使用UML模型中的用例图来进行建模,结合用户需求,在系统中设定了数据录入员、调度员、业务专家、系统管理员等用户角色,并分别为这些角色标识了相应用例。逻辑视图使用UML模型中的包图来进行建模。经过项目组分析讨论,决定采用B\S架构风格开发,将系统分为前端VUE部分和后端Springboot服务两部分,也就是业界比较常见前后分离模式。前端VUE直接部署在Nginx下,后端Springboot都是Jar包形式运行,基本上是一个服务一个Jar包。物理视图使用UML模型中的部署图来进行建模,部署图其实就是服务器如何部署。化工部所有的系统都部署在能源集团的内网,不存在什么内外部署的方式。根据实际情况,我们知道该系统同时在线访问人数不超过100人,按集团运维规定,所有的服务都采用了双节点部署方式。

架构实现

     在这个阶段主要是解决系统构件开发和组装问题。构件来源主要是使用原有的构件和开发新构件。运营管控系统需要与MES系统和安全管控系统进行数据同步,我们使用Apache开源组件ETL实现数据同步;微服务架构的基础框架,如springboot,Spring Cloud、Eureka等。对于常见信息系统共同具备的用户管理、角色权限管理、日志记录、内容维护、消息中心等基本功能,在原来的项目中都有成熟的构件,无需再次开发。对于运营管控系统中所特有的构件,根据具体业务,我们单独开发。在运营管控系统中,我们用到了多种设计模式,例如用单例模式来实现各类编码的生成。构件实现完成后,我们根据不同业务类型,采用了不同的构件组装方式。例如设备管理系统需要从运营管控的工厂模型模块中获取物料信息,采用MQ消息机制。这个过程是不同的系统之间同步数据,采用异步消息方式;涉及审批流程的业务,采用基于工作流的组装方式。

         从运营管控整体开发来看,良好的架构风格选择降低了模块之间的耦合度,同时提高了系统的安全性,可用性和可靠性等多项指标,更大程度的满足系统需求,保证系统后期的快速二次开发和数据接入。但在系统开发过程中也遇到一些问题,有些控制层代码跳过了服务层,直接与持久层的交互使得代码有些混乱,后面我们统一成了三层模式,控制层、服务层、持久层。在服务层我们采用了Redis作为缓存,虽然增加了系统的复杂性,但数据访问速率得到了极大的提高。

      运营管控系统于2023年4月顺利上线,到现在稳定运行半年有余。总的来说,我们在该项目的架构风格选择等方面还是积累了不少的经验,整个团队都有了不同程度进步。同时也暴露出我们团队在开发方面还是存在一些不足。尽力争取在以后的系统开发中,我们能做到更好,走得更远。
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

狂神说笔记 快速入门Nginx

公司产品出现瓶颈? 我们公司项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个jar包启动应用就够了,然后内部tomcat返回内容给用户。 但是慢慢的,使用我们平台的用户越来…

【考研复习】二叉树的特殊存储|三叉链表存储二叉树、一维数组存储二叉树、线索二叉树

文章目录 三叉链表存储二叉树三叉链表的前序遍历(不使用栈)法一三叉链表的前序遍历(不使用栈)法二 一维数组存储二叉树一维数组存储二叉树的先序遍历 线索二叉树的建立真题演练 三叉链表存储二叉树 三叉链表结构体表示如下图所示…

HBase之Compaction

目录 Compaction触发条件相关参数 文件选取策略ExploringCompactionPolicy常见优化 Compaction 随着memstore的不断flush,storefile的数量将会不断增加。compaction将通过合并storefile来减少文件数量,并提高读性能。conpaction以store为单位 Compacti…

飞书开发学习笔记(六)-网页应用免登

飞书开发学习笔记(六)-网页应用免登 一.上一例的问题修正 在上一例中,飞书登录查看网页的界面显示是有误的,看了代码,理论上登录成功之后,应该显示用户名等信息。 最后的res.nickName是用户名,res.i18nName.en_us是英…

BASE理论

BASE理论 介绍 BASE理论是指基本可用(Basically Available)、软状态(Soft State)和最终一致性(Eventually Consistent)。与CAP理论不同,BASE理论重点强调分布式系统的可用性、灵活性和实时性。…

IntelliJ IDEA 安装 GitHub Copilot插件 (最新)

注意: GitHub Copilot 插件对IDEA最低版本要求是2021.2,建议直接用2023.3,一次到位反正后续要升级的。 各个版本的依赖关系,请参照: ##在线安装: 打开 IntelliJ IDEA扩展商店,输入 "Git…

Gitlab CI如何实现安全获取ssh-key拉取依赖项目,打包成品

文章目录 前言配置流程注册ssh-keygit runner映射文件方法1 .gitlab-ci.yml使用方法2 docker build 实现 总结 前言 之所以写这篇文章是由于存在以下场景: 当前的项目编译需要依赖别的项目协同编译,如何将别的项目也pull到该项目里,编译成品…

解决跨域的方法

针对不同情况和需求,可以采取以下几种方法来解决跨域问题: JSONP(JSON with Padding):由于在 script 标签中不存在跨域限制,所以可以通过动态创建 script 标签,将需要获取的数据包装成一个函数&…

2023-11-16 精神分析-企业主的土皇帝做法-分析

摘要: 中午在一阵头痛中被一阵电话声吵醒, 原来是个企业主给我的电话。 说明下, 此企业主是从阿里出来的, 阿里多年,被熏陶的深入骨髓。不过也不一定非要和工作过的企业有关, 但是必然脱不了关系。 本文记录这通诡异的电话带来的思考。 事先声明: 这几天一直在发…

数据结构-二叉树力扣题

目录 1.相同的树 2.二叉树中查找值为x的节点 3.单值二叉树 4.对称二叉树 5.二叉树的前序遍历 6.另一颗树的子树 层序遍历: 7.二叉树遍历 8.判断二叉树是否是完全二叉树 一个特殊的性质: 1.相同的树 题目链接:力扣(LeetC…

NativeScript开发ios应用,怎么生成测试程序?

在 NativeScript 中,要部署 iOS 应用程序,你需要遵循以下一般步骤: 1、确保开发环境: 确保你的开发环境中已经安装了 Xcode,并且你有一个有效的 Apple 开发者账号。 2、构建 iOS 应用: 在你的 NativeScri…

docker mysql 启动报错

使用docker 启动MySQL报一下错误: Cant read dir of /etc/my.cnf.d (errcode 2 - No such file or directory)我的启动命令是: sodu docker run -p 3307:3306 --name mysql \ -v D:/docker/data/mysql/logs:/var/log/mysql \-v D:/docker/data/mysql/c…

新版软考高项试题分析精选(四)

请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 1、一般而言,大型软件系统中实现数据压缩功能,工作在OSI参考模型的( )。 A.应用层 B.表示层 C.会话层 D.网络层…

【验证码逆向专栏】百某网数字九宫格验证码逆向分析

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未…

vue中ref的用法

vue中ref的用法 在项目中使用ref时有时候直接取值,有时候返回的却是一个数组,不知其中缘由,后查了一下ref用法,所以总结一下. 1.绑定在dom元素上时&#xff0c;用起来与id差不多&#xff0c;通过this.$refs来调用: <div id"passCarEchart" ref"passCarEch…

[PyTorch][chapter 63][强化学习-QLearning]

前言&#xff1a; 这里结合走迷宫的例子,重点学习一下QLearning迭代更新算法 0,1,2,3,4 是房间&#xff0c;之间绿色的是代表可以走过去。 5为出口 可以用下图表示 目录&#xff1a; 策略评估 策略改进 迭代算法 走迷宫实现Python 一 策略评估 强化学习最终是为了…

构建Docker基础镜像(ubuntu20.04+python3.9.10+pytorch-gpu-cuda11.8)

文章目录 一、前置条件1.创建 ubuntu 镜像源文件【sources.list】2.下载 python 安装包【Python-3.9.10.tgz】 二、构建方法1.构建目录2.创建DockerFile3.打包镜像 一、前置条件 1.创建 ubuntu 镜像源文件【sources.list】 内容如下 deb http://mirrors.aliyun.com/ubuntu/ …

自定义View之Measure(二)

measure 用来测量 View 的宽和高&#xff0c;它的流程分为 View 的 measure 流程和 ViewGroup 的measure流程&#xff0c;只不过ViewGroup的measure流程除了要完成自己的测量&#xff0c;还要遍历地调用子元素的measure&#xff08;&#xff09;方法。 上一回说到performMeasur…

【Python 千题 —— 基础篇】输出列表累加和

题目描述 题目描述 输出列表的累加和。题中有一个包含数字的列表 [110, 309, 130, 48, 392, 10, 9]&#xff0c;使用 for 循环输出这个列表中所有项加起来的和。 输入描述 无输入。 输出描述 输出列表的累加和。 示例 示例 ① 输出&#xff1a; 列表的累加和是&#…

SQL编写规范【干货】

编写本文档的目的是保证在开发过程中产出高效、格式统一、易阅读、易维护的SQL代码。 1 编写目 2 SQL书写规范 3 SQL编写原则 获取所有软件开发资料&#xff1a;点我获取