面向数字化生产的执行制造系统设计与实现

2023-10-22 08:00陈华品朱望纯
桂林电子科技大学学报 2023年3期
关键词:镜像调用容器

陈华品,朱望纯

(桂林电子科技大学 电子工程与自动化学院,广西 桂林 541004)

近年来,随着中国制造业迅猛发展,越来越多的人意识到制造业信息化在智能制造的关键地位,其中数字化工业软件深入到制造业信息化的各个环节。以执行制造系统(MES)为代表的生产调度与过程管理类工业软件迎来了巨大的需求空间。随着智能制造理念深入人心及工业互联网、大数据、云计算等技术不断向前推进,MES系统正沿着跨平台、网络化、智能化、虚拟化的方向发展,并涌现出一系列研究成果。

制造业越来越精细化、复杂化,导致执行制造系统复杂度攀升。在实际应用中面临生产数据如何互联互通、数据展示不直观、业务迭代与运维困难等诸多障碍[1],中外许多企业和研究人员做出了积极探索。陆文虎等[2]将微服务体系架构应用于MES系统业务功能设计,对MES系统微服务架构中的关键技术进行研究,通过微服务划分、统一调度、服务管理解决系统模块耦合度高、灵活性差的问题,并验证了微服务架构应用于复杂MES系统中的可行性。张祖军等[3]开发了一套基于B/S架构的MES系统,分析和实现了智能制造生产线下的业务功能和逻辑。黄启启等[4]基于微服务架构将复杂的仓储管控系统划分为多个协同、自治的微服务单元,通过消息中间件对多个微服务协同管理,实现系统的高性能、高可用。

目前,企业一般采用内部部署MES系统,自备服务器和机房,专人维护。在集群环境下,安装人员逐一进行环境配置、安装,存在重复性劳动、工作量巨大、部署效率低、资源浪费等问题,且在后期运行阶段,硬件设备更换、系统功能升级、版本维护都很困难。付琳琳等[5]研究了微服务特性和Docker虚拟化技术,对微服务容器化部署的需求和可行性进行分析,通过Dockerfile制作微服务镜像,使用容器编排工具Docker-Compose实现部署的容器化、自动化。上述研究在MES系统开发中引入微服务架构,在微服务部署时引入容器化方面做出了一系列深入的探索,对构建面向复杂业务的MES系统有一定的借鉴意义[6]。

为满足MES系统跨平台化、智能化、云化的需求,结合微服务架构,开发了一套按功能划分微服务单元的MES系统,通过SpringCloud微服务组件完成独立、非耦合的微服务业务单元之间的信息交互,结合Jenkins和Docker实现持续集成和容器化部署,实现执行制造系统的可扩展、高可用。

1 基于微服务的MES系统架构

1.1 软件设计架构的演变

随着企业级应用系统业务规模和复杂度的持续攀升,软件架构随着需求端的变化不断发展与迭代,前后经历了从最初的单体式架构、分布式系统过渡到面向服务的架构(serviceorientedarchitecture,简称SOA),再到流行的微服务架构的演变[7]。

SOA 基于面向服务的思想,将可重用功能抽取为组件,以服务的方式进行调用,项目与服务之间采用企业服务总线(ESB)进行通信。由于ESB在SOA中仍处于核心位置,这种中心化致使SOA 难以实现真正的面向服务和组件化[8]。而微服务是一组功能职责单一、低内聚高耦合的服务组件化解决方案,组件之间通过轻量级的通信机制进行通信,组件由注册中心统一管理服务列表,通过服务调用的方式向其他组件开放服务地址和服务功能。相比于SOA,微服务架构强调去ESB,去中心化,具有更大的灵活性,其划分的细粒度更小,可重用性更高,数据独立存储[9]。SOA与微服务架构的特性对比如表1所示。

表1 SOA与微服务架构对比

基于微服务的MES系统将系统功能微服务化,通过WEB API向外部提供服务。不同的微服务具有平台无关性,微服务的调用与位置、编程语言、系统配置无关,具有高度的可重用性,易于对业务功能与模块水平垂直拆分、切割[10]。

1.2 MES平台总体架构设计

本系统基于微服务架构开发,结合持续集成和容器化部署的MES系统,总体架构如图1所示。

最上层是用户访问层,主要用于用户交互和后台管理,提供用户友好界面并简化操作逻辑,根据用户请求指令向用户展示结果。网关层是整个MES平台系统的唯一入口,通过Nginx放置前端静态资源,并接收用户Http请求,将用户的请求按照Nginx配置的路由规则分发到不同的网关服务器上,可避免系统单点故障,提高可用性。

中间层是业务层,基于数据驱动将MES系统提供的服务划分为独立运行部署的5个核心微服务单元,分别是系统管理微服务、物料BOM 管理微服务、工艺管理微服务、计划管理微服务、数据可视化微服务。每个微服务单元都相互独立,通过提供RESTful风格的API接口对外发布应用服务接口,当接收到用户的合法服务请求指令时,会调用相应的微服务实例,并返回调用结果。

数据层负责存储MES系统的所有数据,由Redis缓存和MySQL数据库组成。为减少数据库的访问量,提高系统并发能力,引入Redis缓存机制,将用户数据和热门数据放在缓存中,通过缓存将大多数请求拦截在访问数据库之前,提高了响应时间,大大降低了MySQL数据库访问压力。

基础设施层主要包括服务器、存储、网络等物理硬件,系统采用阿里云ECS作为生产部署服务器,为整个系统运行提供环境支撑[11]。

2 微服务在MES系统中的应用

2.1 MES微服务划分

MES系统主要功能包括系统管理、物料BOM管理、工艺管理、工单计划管理、数据可视化显示等微服务单元。

1)系统管理微服务。系统主要面向后台管理,包括对用户、部门、角色、权限信息的维护。使用基于角色的访问控制模型对用户身份进行校验和授权,管理云平台中各类角色用户的在本平台中的各种访问权限的赋予和撤销,保证了内部资源的安全性。

2)物料管理模块。模块主要进行原材料的统一编码、数量核算,物料属性的定义、修改、维护、查询等基本操作,按照配料计划中生成的配料单指定某个生产线的所有原材料,并按照入库、出库、转移等物料流转关键点对每一类物料的交接数量、物料种类、名称、转移时间、所在位置信息等进行详细的记录,实现原材料的有效追溯与统计。

3)工艺管理微服务。工艺管理模块针对离散制造业工艺流程不连续的特点,根据不同产品的特点进行工艺调整。按照生产工序,一个完整的加工流程可以分解成若干子过程,根据订单需求以及具体产线情况进行设计。

4)计划管理微服务。工单计划管理模块综合考虑客户订单信息和设备数量、产线数量、人员班组等信息,对各类产品进行合理的分配、排产,将工单分配到具体的产线和工作班组进行生产。

5)数据可视化微服务。模块设计包括设备状态、生产计划完成率分析和最终产品质量分析。系统通过二维或三维柱形图、折线图和表格等多种表现形式,以数字化大屏方式对MES系统中实时数据或统计数据的展示。

2.2 MES系统微服务组件的治理实现

基于SpringCloudAlibaba搭配Springcloud相关组件进行服务治理,整个MES系统服务治理流程如图2所示。系统中将所有微服务单元注册并发布到注册中心(NacosServer);服务调用方通过API网关查找注册中心的服务列表信息;根据获取的服务地址直接调用相关服务[13],进而完成MES系统数据的交互。

微服务治理组件主要包括Gateway网关路由、Nacos服务注册与配置中心、OpenFeign远程服务调用,Sentinel限流熔断4个部分。

1)Gateway网关路由。网关作为内部微服务的唯一入口,通过Gateway整合NacosDiscovery,完成面向服务的动态路由转发。API网关将自身参数信息注册到NacosServer注册中心,并通过整合Nacos获取系统中所有serviceId与实例地址的映射关系;通过匹配application.yml文件对RouteId、URI、Predicate和Filter参数配置路由规则,并将外部请求路由到相应的的serviceId。

2)Nacos服务注册发现和配置中心。Nacos组件兼具传统微服务组件中的注册中心和配置中心的功能。在pom 文件中引入Maven依赖后,在应用启动类中添加@EnableDiscoveryClient注解开启服务注册功能。在yaml配置文件中添加服务名称和Nacos地址等信息,Nacos 启动时就将所有MES微服务的元数据信息(如Host、Port、健康检查URL等)集中注册到NacosServer(服务注册中心)中,在服务调用时通过查询NacosServer维护的服务列表获取服务实例[14]。

3)OpenFeign远程服务调用。OpenFeign是一种声明式的REST客户端组件。引入OpenFeign的Maven 依赖后,在Application 类中添加@EnableFeignClients注解扫描可调用的服务端;利用@FeignClient注解的Name或Value属性可以在服务调用接口上添加指定服务名称,在控制访问层Controller通过注解@RequestMapping绑定服务提供的的REST 接口;在服务调用方创建调用类,通过@Autowired引入定义好的接口并创建调用方法,通过服务名称即可实现声明式调用。

4)Sentinel限流熔断。Sentinel是保障微服务高可用的流量控制组件。服务模块引入Sentinel的Maven依赖后,在配置文件application.yml中配置SentinelDashboard的地址就可以启动项目,并在SentinelDashboard中新建流控规则,当函数调用异常时,也可以设置服务熔断对应方法。通过@SentinelResource注解的Value值设置限流规则,通过配置fallback属性,异常时执行fallback=“handlefallback”指定方法优化错误界面。

2.3 基于Nginx反向代理和Redis缓存高可用设计

2.3.1 基于Nginx和keepalive的高可用负载均衡

Nginx是开源、高性能的Web服务器,将静态资源部署在Nginx上,以提高访问速度。Nginx接收用户http请求时进行反向代理,按照配置的fair策略(按照响应时间优先分配)将请求分发给相应的网关服务器,对API网关集群进行负载均衡,增加系统稳定性。

使用Nginx+keepalive双主配置实现集群的高可用,两台机器互为主备。当出现某台Nginx宕机时,Keepalived检测到故障以后将其关闭,另一台Nginx通过获取VIP(虚拟IP)继续对外提供服务,实现Nginx集群的高可用;当其中一台机器故障时,通过VRRP协议(虚拟路由冗余协议)为基础使用2个VIP的自动切换,实现故障转移和自动恢复[15]。

2.3.2 Redis缓存设计

为提高系统的并发能力,系统设计使用Redis数据库作为MySQL数据库的缓存,以减轻数据库的访问压力。对于一些公共接口数据例如用户信息、物料信息、订单信息等不会发生频繁变化的热点数据,做缓存配置即可。Redis缓存实现读写操作的流程如图3所示。

图3 Redis缓存处理流程

Jedis是Redis官方推荐的用于实现Redis操作的客户端。JedisClient接口包含Redis的CURD 操作方法,JedisClentPool类对JedisClient接口的抽象方法进行实现,然后通过Mapper接口进行相应的数据库操作。当请求到达Redis后,进行读写操作的判断,读操作首先用JedisClient.get()方法查询缓存,根据返回的JSON是否为空确定是否查询数据库并添加到缓存;写操作直接操作数据库后更新缓存。

3 数据可视化技术研究

3.1 基于Echarts的生产数据可视化

Echarts开源可视化库提供了一种简单易用,快速配置图表的方法,具有直观、可交互、个性化定制等诸多优点,利用Echarts提供的多维的、多种形态的图表类型,非常适合MES系统中实时数据或统计数据的展示。在使用Echarts实现数据可视化时,首先引入Echarts的依赖库,即在标签中引入<scriptsrc="js/ECharts.js"></script>,然后基于所需的图表准备合适宽高的DOM 节点,获取DOM 容器后通过Echarts.init()方法完成初始化[16]。Echarts动态数据可视化流程如图4所示。

图4 Echarts动态数据可视化流程

生产数据可视化需要获取动态数据,实时刷新,获取图表数据必然要和数据库建立连接。在前台通过ajax技术按照一定频率发出异步请求,由后台服务器查询数据库数据,得到后台JSON 数据,前台得到返回值;将通过数据库获取的动态JSON数据用于配置Echarts的series属性,最后调用set-option方法按照动态数据绘制曲线。

4 微服务MES系统容器化部署

4.1 微服务容器化部署整体流程

将MES系统按照业务功能划分为独立的微服务之后,每个微服务单元独立部署,将会面临重复进行手动部署效率低下、如何实现自动化部署的问题。Docker容器技术的出现为解决微服务应用部署难题提供了新的思路,结合持续集成工具Jenkins的自动化构建与自动化部署功能,简化人工部署测试的繁琐流程,可以有效解决MES系统微服务部署难题[17]。MES系统基于持续集成和容器化部署时序如图5所示。

图5 持续集成容器化部署时序

4.2 Jenkins构建插件配置

Jenkins持续集成工具拥有的强大功能源自于其庞大的插件资源库,可按需配置,制定个性化部署方案。在MES微服务系统的部署中需用到Maven插件和Gitee 插件。GiteeJenkinsPlugin 插件通过WebHook机制设置事件触发,Jenkins自动拉取最新代码,并将结果的状态码返回给Gitee平台。Maven Integration插件对获得的代码进行编译和打包,并生成Maven构建报告。

4.3 微服务容器镜像构建

镜像构建是通过Docker将开发完成的微服务实例和依赖打包并构建轻量级、可移植的微服务容器镜像。构建镜像的方法有多种,最常用的是通过Dockerfile基本操作命令编写dockerfile文本,在Alpine基础镜像上结合微服务Jar包定制个性化Docker镜像,使用Dockerbuild命令执行Dockerfile文本即可得到新的镜像[18],最终完成微服务容器镜像的构建。

4.4 镜像管理与分发

通过系统的微服务构建多个镜像后,将会面临容器镜像管理问题。Docker官方开源了DockerRegistry,用于构建私有镜像仓库。通过DockerHub创建私有仓库,将构建好的微服务镜像通过Dockerpush命令上传到私有仓库,通过DockerPull命令在生产服务器端拉取镜像,完成镜像的集中管理与分发[19]。

4.5 部署实例

系统选用阿里云ECS作为生产部署服务器,结合Gitee插件和Maven插件,通过Jenkins持续集成工具完成MES系统代码的拉取、编译和构建;将微服务Jar包制作成Docker镜像,并上传到远程Docker仓库中,方便镜像管理和分发;根据Jenkinsfile流水线脚本依次将项目代码自动部署到生产服务器,并按顺序启动。与传统部署方式相比,本系统采用的部署方法大大提升了部署效率,有利于最终实现持续交付[20]。

5 MES系统的实现与性能测试

5.1 MES系统的实现

基于微服务架构与上述关键技术对MES系统进行功能实现,按照功能对MES系统进行微服务划分,结合相关微服务组件进行微服务治理,从而实现按需组件化开发,并在阿里云ECS服务器远程成功运行。总体应用开发效果如图6所示。

图6 总体应用的开发效果

5.2 MES系统的性能测试

系统测试服务器型号为阿里云ECS通用性ga6,规格为4核16Gib内存,操作系统为Centos8.0、64位,JDK 版本为1.8,数据库为Redis2.8.4 和MySQL8.0,部署服务器采用Tomcat7.0版本,对单体架构和微服务拆分的MES系统进行单台服务器独立部署,使用压测工具Jmeter分别发送请求,记录下二者在相同并发条件下的测试数据。

实验条件:使用ApacheJmeter作为压力测试工具,设置线程数为100,模拟100个用户,所有线程启动时间Ramp-UpPeriod为1s,循环次数分别为1、2、5、8、10,用于模拟并发数分别为100、200、500、800、1000时访问接口的响应时间,设置持续时间60 s,观察响应时间、标准差、请求错误率等指标的变化情况。不同开发架构下的响应时间数据如图7所示。

图7 Jmeter响应时间性能对比

5.3 MES系统的测试结果分析

在并发测试结果中,通过数据对比可知,在线程数为100 时,通过改变循环次数,在并发量(简称QPS)相同的情况下,微服务架构下系统平均响应时间均远小于单体架构下系统平均响应时间。从错误率数据来看,随着单体架构并发数的增加,错误率随之增加,但始终小于5%。微服务架构较为稳定,在并发量达到1000时仍没有出现请求出错的情况,且各个业务正常访问的平均响应时间都控制在1s以内。结合响应时间标准差、吞吐量等指标可知,用微服务架构设计发开的系统多项性能都得到了提升。

6 结束语

根据MES系统业务特点,分析以往单体架构、SOA架构下系统的性能瓶颈问题。采用基于微服务架构设计全新的MES系统,按照业务功能划分微服务实例并设计独立的数据库,通过Redis缓存机制来提高数据库访问能力,结合微服务组件实现微服务治理;结合微服务应用部署效率低、版本维护困难的痛点,设计基于Jenkins和Docker的自动化持续集成部署方案。实际应用效果和实验说明所提方案相比传统设计架构在并发性能、部署维护效率方面有大幅提升,并能更好的支持业务扩展。后期可探索通过对相关微服务搭建集群来提高可用性,配合集群部署,以在企业级开发中发挥更大作用。

猜你喜欢
镜像调用容器
Different Containers不同的容器
镜像
难以置信的事情
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
镜像
基于系统调用的恶意软件检测技术研究
取米
镜像
利用RFC技术实现SAP系统接口通信