APP下载

基于微服务的远程培训实时合格方案设计与实现

2021-04-22杜冬梅许志坤苏健

电脑知识与技术 2021年8期

杜冬梅 许志坤 苏健

摘要:远程培训是邮政网络学院的重要功能。由于学员参加远程培训,通过课程学习、作业、考试、问卷等多个环节才能合格,所以判断学员培训是否合格逻辑比较复杂。传统技术架构进行班级合格的实时处理,消耗系统性能,影响正常业务开展,一般在晚上空闲时间采用批处理方式进行处理,学员当天培训合格,滞后一天获得培训结果。采用微服务架构,合理进行微服务拆分,结合消息队列等机制,可以在保证系统正常运行的情况下,对学员培训合格进行实时处理,提高了学员参加远程培训的学习体验。

关键词:Spring Cloud;Eureka;Zuul;RocketMQ

中图分类号:TP311      文献标识码:A

文章编号:1009-3044(2021)08-0149-03

Abstract: Distance training is an important function of post network college. Because the trainees can pass the remote train by course study, homework, examination and other links , the logic of judging whether the trainees are qualified or not is very complex. The real-time processing in the form of single application consumes the system performance, so the general application system uses batch processing in the idle time at night. Using microservice architecture, combined with message queue, can realize real-time judgment for the remote training base on the normal operation of the system.The learning experience of distance training is improved.

Key words: Spring Cloud; Eureka; Zuul; RocketMQ

1 背景

遠程培训是邮政网络培训学院重要功能,学员参加远程培训,通过课程学习、作业、考试等多个环节才能合格,学员完成满足班级合格的任一条件,都可能触发班级合格。采用传统的单体应用模式,如果在学员完成任一操作后都实时判断是否班级合格,在学习高峰时段会大大影响系统性能。所以一般情况下,应用系统会在晚上定时处理班级合格,第二天将合格情况反馈给学员。学员培训合格后会滞后一天得到培训结果,这对于需要培训班合格才能参加后续考试、竞赛或其他活动的学员,带来诸多不便。

采用基于微服务架构的远程培训实时合格方案,结合消息队列机制,系统可以实时进行培训班合格的处理,方便学员参加后续活动的同时,给学员带来了更好的学习体验。

2 微服务架构

2.1 综述

当前流行的微服务架构中,Dubbo 和Spring Cloud使用的相对较多。Dubbo在服务治理方面很出色但开发难度稍大,且在网关、服务跟踪等方面都不及Spring Cloud[1]。反观Spring Cloud则包含分布式配置、网关、服务跟踪、断路器等功能,具备一整套解决方案[2]。

2.2 服务治理组件Eureka

Eureka是Spring Cloud的注册中心[2]。微服务之间互相调用,通过Eureka进行。在注册中心注册的服务,才能被发现、获取并调用。Eureka作为Spring Cloud核心组件,使得当某个微服务增加或减少服务节点后,不需要通知调用方增加或减少的IP地址等相关调用信息,应用系统通过水平扩展提高系统性能更加便捷。

2.3 服务网关Zuul

Spring Cloud Zuul 是微服务架构中的API网关。服务调用端调用后端的微服务,不能直接调用,而是通过Zuul根据请求的url进行服务转发。Zuul位于后端服务和调用端之间,简化了客户端调用时的复杂度,通过Zuul还可以对调用方的权限进行检查控制,所以它同时也可以提供监控、安全等相关服务[2]。

2.4 消息中间件RocketMq

消息队列作为高并发系统的核心组件之一,能够帮助业务系统解构,提升开发效率和系统稳定性。消息中间件包括消息生产者和消费者两个角色:消息生产者负责创建消息并发送到消息服务器,消息消费者从消息服务器拉取消息并提交给应用消费[3]。Topic是消息最细粒度的订阅单位,是生产者传递消息和消费者提取消息的标识。消息中间件处理模型如下。

Rocket MQ 是一款分布式、队列模型的消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等,具有高性能、高可靠、高实时、分布式特点[4],支持拉(pull)和推(push)两种消息模式,具备亿级消息堆积能力。

2.5 微服务拆分

采用微服务架构进行应用系统设计,微服务划分十分重要。服务拆分的颗粒度是微服务架构应用系统实现的关键,是系统建成后运维工作、系统运行性能等的基础。尽量单一职责、高内聚低耦合、易拆分、易理解、易修改替换、易部署,都是好的微服务架构应有的特征[5]。

3 系统设计与实现

3.1 业务流程

学员参加远程培训班,合格条件从大的方面可以分为与具体课程有关、与具体课程无关两个方面。

与课程有关的培训班合格条件,包括课程学习、课程作业、课程考试。每个环节完成之后,需要判断课程所在的必修课或选修课是否合格,进而判断是否能够导致班级合格。与课程无关的培训班合格条件,包括综合考试、综合作业、集中互动、调查问卷。每个环节的合格,都可能导致学员班级合格。主要流程如下图。

3.2 微服务拆分

从业务流程中可看出,课程合格的各个条件相互独立。遵循微服务拆分原则,将班级合格的各个条件课程学习、课程作业、课程考试、综合考试等划分为7个独立的微服务。学员在网院完成班级培训的某项学习任务,通过网关调用相应微服务,进行消息队列的生成,消息消费者获取消息队列的消息,进行班级合格的处理,保证学员实时合格。

3.3 技术架构

系统采用基于Spring Cloud的微服务架构,注册配置中心采用Eurake,网关采用Zuul,消息队列采用Rocket MQ,技术架构图如下。

接入端提供全局的负载均衡功能,具有大量、高并发的接入请求处理能力;业务应用通过服务注册的方式调用基础服务功能;采用消息处理方式,在服务请求量大的情况下采用异步调用,保证用户体验的友好性;课程学习、课程作业等基础服务彼此独立,某一个服务的改造升级不会影响其他服务的功能,便于平台的功能扩展;采用redis内存数据库集群提高系统运行性能。

3.4 系统实现

系统实现的核心为消息队列,消息队列机制保证了业务繁忙时间,班级合格处理不影响主流业务的正常开展。

3.4.1 消息队列生成

以课程学习为例,课程学习完成,生成消息并发送到消息队列。

package cn.cpoc.cla.portal.cla.mq.channel.impl;

import cn.cpoc.cla.channel.ClaClaQuesProvChanSource;

Import ...;

@EnableBinding({ ClaCourseStudyProvChanSource.class})

@Service

public class ClaCourseStudyProvChanSourceServiceImpl implements ClaCourseStudyProvChanSourceService {

@Autowired

private ClaCourseStudyProvChanSource claCourseStudyProvChanSource;

@Override

public boolean courseStudySource(PxClassClassrcdInfo pxClassClassrcdInfo) {

String uuid= UUID.randomUUID().toString();

Message message = MessageBuilder.withPayload(pxClassClassrcdInfo)

.setHeader(MessageConst.PROPERTY_KEYS, uuid+"--"+pxClassClassrcdInfo.getClassclassrcdid().toString())

.setHeader(MessageConst.PROPERTY_TAGS, ClaCourseStudyProvChanSinkService.COURSE_STUDY_SINK_METHOD_TAG)

.setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON).build();  ---生成消息

return claCourseStudyProvChanSource.source().send(message);  --发送到消息队列

}

}

3.4.2 消息队列监听

课程学习、课程考试、综合考试等分别有各自的消息監听,监听消息队列中属于自己的消息,进行相应处理。以课程学习为例,消息监听实现如下。

package cn.cpoc.cla.course.study.provider.channel.impl;

import cn.cpoc.cla.channel.ClaCourseExamProvChanSink;

import ...;

....

public class ClaCourseStudyProvChanSinkServiceImpl implements ClaCourseStudyProvChanSinkService {

private final static Logger logger = LoggerFactory.getLogger(ClaCourseStudyProvChanSinkServiceImpl.class);

@Autowired

private IBjhgByKcxxService iBjhgByKcxxService;

/* 学员通过课程学习触发班级合格*/

@Override

@StreamListener(value = ClaCourseStudyProvChanSink.SINK_CHANNEL,condition = COURSE_STUDY_SINK_METHOD)

public void courseStudySink(@Payload PxClassClassrcdInfo pxClassClassrcdInfo,@Header(name = "KEYS") Object key) {

try{

logger.info("key:"+key+" pxClassClassrcdInfo:"+pxClassClassrcdInfo.toString());

long count =redisTemplate.opsForValue().increment(key.toString(), 1);

logger.info("pxClassClassrcdInfo conut:" + count );

if(count==1){

redisTemplate.expire(key.toString(), 4, TimeUnit.DAYS);

iBjhgByKcxxService.setBjhbByKcxx(pxClassClassrcdInfo); --班級合格处理

}else{

logger.info("courseStudySink repeat key:" + key +" pxClassClassrcdInfo:"+pxClassClassrcdInfo.toString());

}

}

}

4 结束语

采用微服务架构实现远程培训班的实时合格功能,在学习高峰期会以消息队列的形式进行异步处理,不影响远程培训主流业务的运行性能。学员完成培训班学习后,合格信息会很快反馈给学员,提升了学员的学习体验。同时,如果培训班合格条件发生变化,微服务架构会以修改或增加单个微服务的方式快速应对业务变化。

参考文献:

[1] 谭锋.Spring Cloud Alibaba微服务原理与实战[M].北京:电子工业出版社,2020.

[2] 方志朋.深入理解Spring Cloud与微服务构建[M].北京:人民邮电出版社,2018.

[3] 欧志芳.基于RocketMQ实现异构数据库同步[J].网络安全技术与应用,2016(12):99-100.

[4] 马跃,颜睿陽,孙建伟.基于RocketMQ的MQTT消息推送服务器分布式部署方案[J].计算机系统应用,2018,27(6):83-86.

[5] 克里斯·理查森.微服务架构设计模式[M].北京:机械工业出版社,2019.

【通联编辑:谢媛媛】