【架构论文-1】面向服务架构(SOA)
【摘要】
本文以我参加公司的“生产线数字孪生”项目为例,论述了“面向服务架构设计及其应用”。该项目的目标是构建某车企的数字孪生平台,在虚拟场景中能够仿真还原真实产线的动作和节拍,实现虚实联动,从而提前规避问题,节约成本,预测节拍,进行故障诊断和预测维护,从而完成系统和设备产线的优化。在此项目中,我担任系统架构师以及主要管理人员,主导了项目的开发,架构设计,项目管理等工作。本文首先分析了面向服务架构的主要技术和标准的具体内容,并说明在构建面向服务架构中遇到的问题和具体实施效果。实践证明,采用面向服务的架构设计,降低了系统的耦合,使软件有了更好的开放性和扩展性,满足了客户的业务要求,使得开发工作取得了成功。此数字孪生平台于2022年6月验收上线,目前已经稳定运行一年多,得到了客户的一致认可。
【背景】
近年来,随着数字孪生技术的兴起,虚拟仿真在工业互联网和智能制造领域具有越来越广泛的应用背景。通过数字孪生和工业生产过程相结合,可实现实时监测、预测分析、远程控制和优化调整,提高生产效率,降低成本和风险。2021年12月,某新能源汽车车企决定发起“车间数字孪生”项目,实现生产线节拍的高效提升,实现数字化技术的全面覆盖。该项目投资800万,计划6个月完工,我司成功拿下该项目。2021年12月,我作为系统架构设计师,全面负责“车间产线数字孪生”项目的架构设计工作,整个项目采用了面向服务SOA的架构来进行项目的开发,将业务进行拆分,单独开发部署,提高了项目的灵活性,确保了项目的顺利交付。
【过渡】
在本项目中,需求方对性能和可用性等质量属性有要求,提出系统在某模块出现问题后,尽可能少地影响其他模块,修复系统要在10分钟内完成。介于以上质量属性,为了将各个模块间解耦,为了提升修复问题的速度,为了提升部署修复后模块的速度,经过公司讨论后决定使用面向服务SOA架构来开发项目,下面说明实现SOA的主要技术和标准以及每种技术和标准的具体内容。最后描述本次项目开发过程中构件面向服务架构时遇到了哪些问题和解决方案以及个人感悟。
【理论】
SOA是一个组件模型,它将应用程序的不同功能单元进行拆分,并通过服务之间良好的接口联系起来,使得构建在各种各样的系统中的服务可以以通用的方式进行交互,与SOA紧密相关的技术主要有UDDI、WSDL、SOAP。其中UDDI是统一发布、描述、集成协议,提供了一种服务发布、查找、定位的方法。以便被需要该服务的用户发现和使用,UDDI是SOA的基础设施,对应着服务注册中心的角色,是服务注册的规范;WSDL是服务描述语言,服务器通过WSDL说明自己有什么服务可以对外调用,它有一套基于XML的语法定义,包含服务实现定义和服务接口定义,服务内容描述通过WSDL标准实现;SOAP是简单对象访问协议,定义了一种方法将XML消息从A点传到B点,采用Http作为底层通讯协议,RPC作为一致性的调用途径,XML作为数据传输的格式,通过SOAP应用程序可以在网络中进行数据交换和远程调用过程。
【实践】
SOA的主要实现方式有WebService、ESB和服务注册表,本次在项目中使用的是WebService的方式实现SOA。在该方式中包含三个重要角色,分别是服务提供者,服务请求者和服务注册中心,下面说明具体的构建过程以及遇到的问题和实施效果。
- 服务提供者,主要完成服务的设计、定义、描述和发布工作。在此数字孪生项目中,我们使用了Spring Boot作为服务提供者的框架,Spring Boot提供了快速构建和部署的能力。使用Spring Boot可以简化程序的配置和开发流程。并使用Spring Web来创建RESTFUL API端点,用以提供一套结构清晰、标准统一、方便扩展的接口,我们可以使用RESTFUL API作为服务提供者的接口标准。通过定义合适的API端点和参数,来实现设备数据的接受、存储、查询和控制功能。我们选择了MongoDB作为数据库来存储实时设备数据,并使用了SpringData MongoDB来简化与MongoDB的交互。一旦服务提供者通过测试与调试,可以将其部署在生产环境中。可以使用Docker等容器化技术,将服务提供者打包为容器,并部署到适当的服务器或云平台。通过服务提供者,我们可以接收来自现场设备以及传感器的实时数据,并将其存储在MongoDB数据库中。同时,服务提供者实现了查询和控制功能,使得服务请求者可以通过发送请求和控制指令来获取设备数据以及运行状态。
- 服务注册中心,服务注册中心是连接服务提供者和服务请求者的纽带,服务提供者在此发布服务描述,服务请求者在此查找需要的服务。在此数字孪生项目中,我们使用了Spring Cloud Netflix Eureka 作为服务注册中心的框架,Spring Cloud Netflix Eureka是一个开源的服务注册和发现框架,提供了服务注册中心的发现。并与其他组件进行集成。使用Spring Boot来构建服务注册中心。我们的服务提供者发送注册请求将自身注册到服务。
- 服务请求者,服务的请求者即服务的消费者,通过UDDI可在服务注册中心查找、调用服务。在此数字孪生项目中,我们使用了Spring Boot作为服务请求者的框架,并使用Spring Web来创建RESTFUL API端点。使用Apache HttpClient作为HTTP客户端库来发送设备数据查询请求和控制指令发送请求。同时,我们作为Chart.js作为数据可视化框架来实时展示数据的图表,一旦服务请求者通过测试和调试,我们可以向数据管理系统发送查询请求,查询当前的设备数据,并将数据以图标的形式展示给用户,同时我们可以发送控制指令来改变设备运行的状态,例如调整机械臂的关节角速度和传感器的开关。
【结尾】
实践证明SOA架构的使用,成功降低了系统的耦合度,是软件有了更好的开放性和拓展性,各方面表现优异,同时项目也如期在23年年初正式上线,并得到了客户的一致好评。但项目建设过程中也存在一些不足,由于疫情的原因,很多同事无法在现场办公,影响了沟通效率。我们采用了视频电话+邮件确认的制度,保证了每个同事的信息共享,解决了信息传达的问题。作为一名软件从业人员,唯一不能停下来的技术学习的脚步,我们要紧跟时代发展,提高自身的技术,并灵活运用在每个项目中。
相关文章:
【架构论文-1】面向服务架构(SOA)
【摘要】 本文以我参加公司的“生产线数字孪生”项目为例,论述了“面向服务架构设计及其应用”。该项目的目标是构建某车企的数字孪生平台,在虚拟场景中能够仿真还原真实产线的动作和节拍,实现虚实联动,从而提前规避问题ÿ…...

刚刚!更新宁德时代社招Verify测评语言理解数字推理SHL题库、网盘资料、高分答案
宁德时代社招入职的Verify测评主要分为两大块:语言理解和数字推理。语言理解部分包括阅读理解、逻辑填空和语句排序,要求在17分钟内完成30题。数字推理部分包括数字序列、数学问题解决和图表分析,同样要求在17分钟内完成18题。这些测评题目旨…...

C++笔记---智能指针
1. 什么是智能指针 1.1 RALL设计思想 RAII(Resource Acquisition Is Initialization,资源获取即初始化)是一种资源管理类的设计思想,广泛应用于C等支持对象导向编程的语言中。它的核心思想是将资源的管理与对象的生命周期紧密绑定…...
CentOS 7系统中更改YUM源为阿里云的镜像源
引言 更换阿里的镜像源可以带来诸多好处,包括提高下载速度、提升稳定性、同步更新、简化配置、节省带宽资源以及增强系统安全性等。因此,对于使用CentOS系统的用户来说,更换阿里的镜像源是一个值得考虑的选择。 1.备份yum源 mv /etc/yum.r…...

Python酷库之旅-第三方库Pandas(206)
目录 一、用法精讲 961、pandas.IntervalIndex.mid属性 961-1、语法 961-2、参数 961-3、功能 961-4、返回值 961-5、说明 961-6、用法 961-6-1、数据准备 961-6-2、代码示例 961-6-3、结果输出 962、pandas.IntervalIndex.length属性 962-1、语法 962-2、参数 …...

3.4CQU数学实验???
meshgrid 是一个用于生成网格点坐标的函数。它常用于在二维或三维空间中创建坐标网格,用于可视化和数据处理。 在二维情况下,meshgrid 函数接受两个一维数组作为输入,并返回两个二维数组,这两个数组中的元素分别表示了所有可能的…...

Linux(CentOS)开放端口/关闭端口
一、普通用户使用 sudo 操作,开放/关闭端口,80 1、检查端口是否开放 sudo firewall-cmd --zonepublic --query-port80/tcp 2、开放端口 sudo firewall-cmd --zonepublic --add-port80/tcp --permanent 3、重新加载(开放或关闭端口后都需…...
GreenDao适配AGP8.7+
升级配置 工具版本Android StudioLadybug 2024.2.1 Path2AGP8.7.2KPG1.8.21GGP3.3.1明细 classpath "com.android.tools.build:gradle:$agp_version"classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kgp_version"classpath "org.greenrobot:g…...
【前端】Typescript从入门到进阶
以下是 TypeScript 的常用知识点总结,涵盖了从基础到入门的内容,并配有代码示例: 1. TypeScript 基础 1.1 安装和配置 安装 TypeScript 并初始化配置文件: npm install -g typescript tsc --init 1.2 基本类型 TypeScript 提供…...

在 RHEL 8 | CentOS Linux release 8.5.2111上安装 Zabbix 6
1. 备份YUM源文件 cd /etc/yum.repos.d/ mkdir bak mv C* ./bak/ wget -O /etc/yum.repos.d/CentOS-Linux-BaseOS.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo yum clean all yum makecache2. 将 SELinux 设置为宽容模式,如下所示。 sudo s…...
光纤HDMI线怎么连接回音壁?
第一步:准备HDMI线、光纤线(TOSLINK线)、视频源设备、回音壁 第二步:连接HDMI线,找到视频源设备上的HDMI输出口,将HDMI线的一端插入这个接口,再把HDMI线的另一端插入回音壁的HDMI输入口。注意检…...
屏幕后期处理
1、屏幕后期处理效果 屏幕后期处理效果( Screen Post-Processing Effects)是一种在渲染管线的最后阶段应用的视觉效果,允许在场景渲染完成后对最终图像进行各种调整和效果处理,从而增强视觉体验 常见的屏幕后期处理效果有&#x…...
K8资源之endpoint资源EP资源
1 endpoint资源概述 endpoint资源在K8S中用来表s示vc与后端 Pod 之间的连接关系的对象。当创建svc时,svc根据标签是否相同或svc名字是否和ep名字相同,把svc和ip关联上。 删除svc时,会自动的删除同名的ep资源。 2 ep资源和svc的关联测试 […...

微软日志丢失事件敲响安全警钟
NEWS | 事件回顾 最近,全球最大的软件公司之一——微软,遭遇了一场罕见的日志丢失危机。据报告,从9月2日至9月19日,持续长达两周的时间里,微软的多项核心云服务,包括身份验证平台Microsoft Entra、安全信息…...

Qt生成应用程序exe
1. 将工程用MinGW编译器在release模式下编译,生成可执行文件XXX.exe,新建一个文件夹如:F:\Setup\minGW,把exe文件放到这个目录下。 2. 将该编译器的bin文件添加到PATH环境变量里:bin文件路径为:D:\Qt\Qt5.…...
C#中的HttpContent、HttpClientHandle、HttpWebRequest
C#中的HttpContent 在C#中,HttpContent 是 System.Net.Http 命名空间下的一个类,它是 HttpClient 类用来发送和接收HTTP内容的基础。HttpContent 表示HTTP请求或响应的正文内容,并且可以序列化和反序列化数据。 HttpContent 是一个抽象类&a…...
23.网工入门篇--------介绍一下园区网典型组网架构及案例实践
园区网典型组网架构主要分为小型、中型、大型三种类型,以下是详细介绍及相关案例实践: 小型园区网: 架构特点: 用户规模:适用于接入用户数量较少的场景,一般支持几个至几十个用户。覆盖范围:仅限…...

QT鼠标事件
QT鼠标事件 1.概述 这篇文章介绍如何使用事件和获取事件的信号 2.创建项目 创建一个widget类型项目,在widget.ui文件中添加一个label控件 然后在项目名称上右键选择Add new... 添加文件,选择 C Class 自定义类名Mylabel,选择基类Base …...

Ubuntu 的 ROS 操作系统turtlebot3环境搭建
引言 本文介绍如何在Ubuntu系统中为TurtleBot3配置ROS环境,包括安装和配置ROS Noetic的步骤,为PC端控制TurtleBot3提供操作指南。 安装和配置的过程分为PC设置、系统安装、依赖安装等部分,并在最后进行网络配置,确保PC端能够顺利…...

C++笔记---异常
1. 异常的概念 1.1 异常和错误 异常通常是指在程序运行中动态出现的非正常情况,这些情况往往是可以预见并可以在不停止程序的情况下动态地进行处理的。 错误通常是指那些会导致程序终止的,无法动态处理的非正常情况。例如,越界访问、栈溢出…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...