【架构论文-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 异常和错误 异常通常是指在程序运行中动态出现的非正常情况,这些情况往往是可以预见并可以在不停止程序的情况下动态地进行处理的。 错误通常是指那些会导致程序终止的,无法动态处理的非正常情况。例如,越界访问、栈溢出…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
