《工业控制计算机》2021年第34卷第3期
1Spring Cloud 微服务框架
微服务是一种系统架构的设计风格[1],目的是将一个独立的系统拆分成多个小型的服务模块,这些小型的服务模块是各自独立运行,占各自的进程,每个服务可以独立部署、独立维护、独立扩展,各个服务之间是通过HTTP 的Restful API 进行通信,相互协作完成整个系统的功能实现[2]。
随着互联网和云计算的进步,微服务越来越受到从业者的关注。微服务解决了复杂性的问题,可以将一个整体的程序分解成一组服务,开发人员可以致力于单个服务的独立开发,可以自由选择任何有用的技术,只要符合API 标准即可[3-4]。每个服务可以独立部署,独立调整,只要对外提供服务的API 不变即可。多个服务之间的交互可以使用调度机制进行解决,本文涉及的就是使用调度机制把多个微服务的功能进行串联,实现整个程序的联动。1.1网关层
网关层用于接收外部系统请求,或者直接来自客户全的请求,使用配置路由的方式转发到不同的微服务,此方式屏蔽了各个微服务的具体实现,只暴露同一个入口。API 网关是一个独立的服务器,是整个系统的唯一入口[5]。API 网关封装了整个系统的内部架构,为所有的客户端或者消费端提供一个API 信息。网关层还具有其它职责,比如身份验证、负载均衡、静态响应处理等等[6]。
1.2配置中心
所谓配置中心,就是所有服务器上的所有服务的配置信息的中心。将所有服务的配置通过配置中心存储到数据库中或者其他存储设备中,各个服务组件是从配置中心去拉取各自的配置信息。本系统集成了Spring Cloud Config ,Config 配置中心统一管理所有服务模块的配置。1.3Feign 组件
本系统模块之间的调用使用Feign 组件,各个模块con⁃troller 层提供接口,将Feign 的路由配置信息和controller 层的路由关联,路由就可以到所调用的controller 层方法[7]。
2任务设计整体思想2.1任务生成中心
任务调度的大概思想如下所示,请求从外部(第三方或者前端)触发之后,经过网关,转发到任务调度中心的模块,此模块的功能主要是做任务的生成和分解,在任务中心生成不同的任务,任务生成中心模块和数据库进行交互,把生成的任务进行入库操作。2.2任务调度中心
使用分布式锁机制从数据库获取待分配的任务列表进行分配处理,转发到不同的服务模块,如图1中的服务A 、服务B 、服务C 等,可以新增新的服务,使用系统的注册中心的自动发现功能,新的服务可以加入到整体架构中,在任务处理层通过不同的服务模块处理不同的任务,完成不同的业务需求,再完成任务处理之后回调任务调度中心更新当前任务的状态,即:调度模块基于分布式调度框架、设计任务调度器。定时获取任务中心生成的待处理的任务列表,并转发到相应的模块执行操作。如图2。
图1微服务架构
基于Spring Cloud 实现任务调度微服务化的设计与实现
Task Scheduling Microservice Based on Spring Cloud 顾芒芒
吴铭程(中移(苏州)软件技术有限公司,江苏苏州200015)
摘要:介绍了一种基于Spring Cloud 的分布式微服务架构的任务调度机制的实现。微服务架构是一种架构的概念,将功能分解到各个单独的服务中来实现解耦,从而降低系统的耦合性,提供更加灵活的服务,在项目迭代开发工程中,实现专人负责专项模块,提升团队开发效率,加快迭代速度。利用任务调度机制,可以进一步实现模块之间的解耦,降低维护成本,方便交接。
关键词:任务调度;微服务
Abstract 押This paper introduces the implementation of a task scheduling mechanism that based on the Spring Cloud distributed microservice architecture.The microservice architecture is an architectural concept that decomposes functions into individual services to achieve decoupling熏
thereby reducing the coupling of the system熏provide more flexible services.In the
iterative project development project熏a dedicated person can be in charge of a special module熏which improves development efficiency for team and accelerates the iteration speed.Use the task scheduling mechanism to further realize the decoupling of modules熏reduce maintenance costs熏and facilitate handover.
Keywords 押task
scheduling熏microservice
117
基于Spring Cloud 实现任务调度微服务化的设计与实现图2调度生成和任务调度处理
猿任务处理3.1任务生成器3.1.1任务拆分
根据不同的任务进行拆分,单一任务只要拆分成一个任务,批量任务可以拆分成多个相同任务,组合任务可以拆分成不同类型的任务。任务拆分在任务生成中心进行处理。
(1)只能拆成一个任务
根据用户的单一请求生成一个对应的任务,进行入库持久化操作,如图3所示。
图3一个任务的生成流程
(2)能拆成多个相同类型的任务
根据用户的批量请求或者其他操作,生成多个相同类型的任务,进行入库操作,如图4所示。
图4多个相同类型的任务生成流程
(3)需要拆成不同类型的任务
任务之间有先后的执行顺序。根据用户的定制化的请求,需要生成多个不同类型的任务,且不同类型的任务的执行顺序有依赖关系,需要把任务和任务之间的关联关系进行入库操作,流程如图5所示。
图5多种不同类型的任务生成流程
3.1.2任务状态
任务状态可区分如下几类:
1)待分发状态(初始状态,INIT ):当请求从前端或者第三方产生的时候,会经过网关在任务中心生成一条或者多条任务,并把任务持久化到数据库中,此时的任务状态是初始状态。
2)执行中状态(PROGRESS ):当任务调度器对任务进行分发,会立刻把任务的状态设置为PROGRESS 状态,此时下一轮分发初始状态的任务就不会查到已经执行的任务了。
3)已完成成功状态(SUCESS ):任务调度器把任务分发到不同的服务模块之后,各个服务模块根据自己的处理结果反馈给任务调度器模块,成功就是SUCCESS 。
4)失败状态(FAILURE ):各个服务模块根据自己的处理结果反馈给任务调度器模块,失败就是FAILURE 。3.2任务调度器
3.2.1可执行任务获取
对于未开始执行(即任务状态为初始状态)的任务,需要使用定时器进行触发生成调度任务的请求,获取到待执行的任务进行转发到相应的服务模块,调用不同的服务模块进行处理。
有依赖关系的任务需要添加任务执行前校验,验证前置条件是否满足,如果前置条件全部满足,则进行相应的操作,比如任务A 和任务B ,任务B 的执行条件必须是任务A 执行完成之后才能执行,如图5所示的任务之间的依赖关系,那么在获取任务列表的时候,任务B 是否能够获取到依赖任务A 是否已经完成。
可以采用策略模式调用任务的处理方法,可执行的任务列表的获取可以使用乐观锁的方式,在微服务的架构中,一般单个服务是以会起多个副本在不同的服务器上进行调度的,可以保证系统的稳定性和健壮性。但是此时会引发一个问题,当多个服务副本在调度的时候,获取任务列表的时候,可能会重复获取相同的任务,这就会导致任务的重复执行。为了规避这个问题,引入了乐观锁的机制。
乐观锁在数据进行提交的时候,才会对数据的冲突与否进行检测,如果发现冲突了,则不能进行更新,平台侧使用时间戳记录机制实现乐观锁,使用乐观锁的目的是解决高并发或者服务多副本情况下造成的冲突[8]。平台侧在调度任务服务、监控任务服务、资源同步服务等模块使用了乐观锁。
平台使用乐观锁的目的是分页查询目标列表的时候不要查询到重复数据,在服务多副本条件下,每个副本都分页查询列表,可能会获取相同的数据,为了解决这个问题,引入了乐观锁,使用时间戳记录机制实现乐观锁,根据更新时间去锁定分页查询的页数,任何服务拿到乐观锁,在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则通过,否则就是版本冲突,不会进行更新,这就保证了不同的线程不会拿到相同的数据。3.2.2可执行任务分发执行
在获取到可执行任务之后,把任务的状态置为执行中的状态,根据任务的类型,把任务分发到不同的处理模块进行处理,任务之间的交互使用Feign ,图1中的服务A 、服务B 、服务C 就是处理不同类型的服务模块,当系统集成新的业务的时候,只需要新增处理模块,整个系统的改动量相对较小。
任务到达任务处理模块之后,如果出现异常、执行成功、执行失败都要回调任务调度中心,通知任务调度器,当前任务的处理结果,如果不把处理结果反馈给任务调度中心,当前任务就会成为僵尸任务,即没有任何处理结果,需要单独的业务处理这种任务
。
118
《工业控制计算机》2021年第34卷第3期
(上接第116页)
的所有属性,包括柜编号、柜名称、容量等信息。柜是支存放的实际载体,要严格按照支登记的位置摆放对应支。
3)支存取记录表,具体结构如表3所示,主要记录支存取时的记录信息,方便查,包括支编号、存取时间、存取类型等。
表3支存取记录表
4)异常报警记录表,具体结构如表4所示,主要记录支异常出库的报警记录,包括支编号、报警时间、支型号等。
表4异常报警记录表
5)支审批表,具体结构如表5所示,主要是对所有支审批信息的描述,包括申请人、申请单位、用途、申请时间等。
4结束语
本文提出的支管理系统融入物联网思想,通过在支上绑定电子标签,利用RFID技术将电子标签上的编号信息作为支标识传到后台的服务器里进行处理,改变了传统管理模式,这种信息化的管理形式,大大提高了支管理的安全性和效率。
参考文献
分布式和微服务的关系[1]李昕朔.中美支管理制度比较研究[J].湖北警官学院学报,2014,
27(4):48-51
[2]李泉林,郭龙岩.综述RFID技术及其应用领域[J].中国电子商情(RFID技术与应用),2006(1):51-62
[3]吴欢欢,周建平,许燕,等.RFID发展及其应用综述[J].计算机应用
与软件,2013(12):203-206
[4]薛茹.基于SSM框架的Web系统研究与应用[J].计算机产品与流
通,2018(7):30-31
[5]赵海国.Ajax支持下的ECharts图形报表技术的应用[J].电子技术,
2018,47(4):66-69
[收稿日期:2021.1.4]
3.3任务监视器
3.3.1僵尸任务获取
如何判定一个任务是僵尸任务呢?当一个任务长时间处于执行中(即任务状态为PROGRESS)的状态时
候,则说明当前任务已经处于僵尸状态,不会再进行操作。这种任务如果不进行处理,任务就永远属于停滞状态,没有任何返回结果,这对于一个系统的稳定性和健壮性是个致命的错误,因此,要出僵尸任务,并对这些僵尸任务进行处理。
获取僵尸任务的时候,需要给个时间间隔来判断执行时间是否超过这个时间间隔的阈值,这个阈值的设置可以根据不同的业务场景和需求设计。若超过这个时间间隔阈值,就是僵尸任务;若未超过阈值,则该任务不是僵尸任务,跳过该任务。
僵尸任务的获取和可执行任务的获取一样,都是使用乐观锁,进行分页获取数据,保证数据不会重复下发。
3.3.2僵尸任务处理
(1)置为初始状态
把僵尸任务的状态设置成初始状态,任务调度器就能在定时业务中重新获取当前任务,即对当前任务进行二次分发,让当前任务重新执行一次。
(2)置为失败状态
把僵尸任务状态置为失败状态,让用户或者第三方从新下发一样的请求,经过网关,在任务生成中心产生一个新的任务,重新走一遍任务处理流程。
4结束语
任务调度中心是使用Spring Cloud实现的微服务调度机制,系统集成了配置中心和注册中心等功能,使用一种声明式的Web服务客户端Feign。
任务系统需要根据任务数量基进行任务生成中心和任务调度中心服务模块副本的设计,可以根据业务量启动多个副本[9],此系统需要考虑多副本的并发控制,针对并发处理情况使用乐观锁的时间戳机制,解决并发处理问题,可以提高任务处理效率和防止任务重复执行。
参考文献
[1]洪华军,吴建波,冷文浩.一种基于微服务架构的业务系统设计与实
现[J].计算机与数字工程,2018,46(1):149-154
[2]马雄.基于微服务架构的系统设计与开发[D].南京:南京邮电大学,
2017
[3]周立.Spring Cloud与Docker微服务架构实战眼M演.北京:电子工业
出版社,2017
[4]李娜.基于Spring Cloud微服务架构的应用[J].电子技术与软件工
程,2019(12):142
[5]廖俊杰,陶智勇.微服务API网关的设计及应用[J].自动化技术与应
用,2019(8):85-88
[6]张才俊,李子乾,马永波,等.一种基于Spring cloud的微服务构建
方法:CN201810250328.7[P].2018-03-26
[7]汪茹洋,林皓,李继鸿,等.基于spring cloud的微服务构建方法及
spring cloud微服务架构:CN201911425792.6[P].2019-12-31 [8]郝娉婷,胡亮,姜婧妍,等.基于多管理节点的乐观锁协议[J].吉林大
学学报(工学版),2017,47(1):227-234
[9]欧阳桂秀.Docker集的服务创建及伸缩的实现[J].福建电脑,2020,
36(10):43-45
[收稿日期:2021.1.12
]表5支审批表
119
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论