杜冬梅 許志坤 蘇健
摘要:遠(yuǎn)程培訓(xùn)是郵政網(wǎng)絡(luò)學(xué)院的重要功能。由于學(xué)員參加遠(yuǎn)程培訓(xùn),通過(guò)課程學(xué)習(xí)、作業(yè)、考試、問(wèn)卷等多個(gè)環(huán)節(jié)才能合格,所以判斷學(xué)員培訓(xùn)是否合格邏輯比較復(fù)雜。傳統(tǒng)技術(shù)架構(gòu)進(jìn)行班級(jí)合格的實(shí)時(shí)處理,消耗系統(tǒng)性能,影響正常業(yè)務(wù)開(kāi)展,一般在晚上空閑時(shí)間采用批處理方式進(jìn)行處理,學(xué)員當(dāng)天培訓(xùn)合格,滯后一天獲得培訓(xùn)結(jié)果。采用微服務(wù)架構(gòu),合理進(jìn)行微服務(wù)拆分,結(jié)合消息隊(duì)列等機(jī)制,可以在保證系統(tǒng)正常運(yùn)行的情況下,對(duì)學(xué)員培訓(xùn)合格進(jìn)行實(shí)時(shí)處理,提高了學(xué)員參加遠(yuǎn)程培訓(xùn)的學(xué)習(xí)體驗(yàn)。
關(guān)鍵詞:Spring Cloud;Eureka;Zuul;RocketMQ
中圖分類號(hào):TP311? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):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 背景
遠(yuǎn)程培訓(xùn)是郵政網(wǎng)絡(luò)培訓(xùn)學(xué)院重要功能,學(xué)員參加遠(yuǎn)程培訓(xùn),通過(guò)課程學(xué)習(xí)、作業(yè)、考試等多個(gè)環(huán)節(jié)才能合格,學(xué)員完成滿足班級(jí)合格的任一條件,都可能觸發(fā)班級(jí)合格。采用傳統(tǒng)的單體應(yīng)用模式,如果在學(xué)員完成任一操作后都實(shí)時(shí)判斷是否班級(jí)合格,在學(xué)習(xí)高峰時(shí)段會(huì)大大影響系統(tǒng)性能。所以一般情況下,應(yīng)用系統(tǒng)會(huì)在晚上定時(shí)處理班級(jí)合格,第二天將合格情況反饋給學(xué)員。學(xué)員培訓(xùn)合格后會(huì)滯后一天得到培訓(xùn)結(jié)果,這對(duì)于需要培訓(xùn)班合格才能參加后續(xù)考試、競(jìng)賽或其他活動(dòng)的學(xué)員,帶來(lái)諸多不便。
采用基于微服務(wù)架構(gòu)的遠(yuǎn)程培訓(xùn)實(shí)時(shí)合格方案,結(jié)合消息隊(duì)列機(jī)制,系統(tǒng)可以實(shí)時(shí)進(jìn)行培訓(xùn)班合格的處理,方便學(xué)員參加后續(xù)活動(dòng)的同時(shí),給學(xué)員帶來(lái)了更好的學(xué)習(xí)體驗(yàn)。
2 微服務(wù)架構(gòu)
2.1 綜述
當(dāng)前流行的微服務(wù)架構(gòu)中,Dubbo 和Spring Cloud使用的相對(duì)較多。Dubbo在服務(wù)治理方面很出色但開(kāi)發(fā)難度稍大,且在網(wǎng)關(guān)、服務(wù)跟蹤等方面都不及Spring Cloud[1]。反觀Spring Cloud則包含分布式配置、網(wǎng)關(guān)、服務(wù)跟蹤、斷路器等功能,具備一整套解決方案[2]。
2.2 服務(wù)治理組件Eureka
Eureka是Spring Cloud的注冊(cè)中心[2]。微服務(wù)之間互相調(diào)用,通過(guò)Eureka進(jìn)行。在注冊(cè)中心注冊(cè)的服務(wù),才能被發(fā)現(xiàn)、獲取并調(diào)用。Eureka作為Spring Cloud核心組件,使得當(dāng)某個(gè)微服務(wù)增加或減少服務(wù)節(jié)點(diǎn)后,不需要通知調(diào)用方增加或減少的IP地址等相關(guān)調(diào)用信息,應(yīng)用系統(tǒng)通過(guò)水平擴(kuò)展提高系統(tǒng)性能更加便捷。
2.3 服務(wù)網(wǎng)關(guān)Zuul
Spring Cloud Zuul 是微服務(wù)架構(gòu)中的API網(wǎng)關(guān)。服務(wù)調(diào)用端調(diào)用后端的微服務(wù),不能直接調(diào)用,而是通過(guò)Zuul根據(jù)請(qǐng)求的url進(jìn)行服務(wù)轉(zhuǎn)發(fā)。Zuul位于后端服務(wù)和調(diào)用端之間,簡(jiǎn)化了客戶端調(diào)用時(shí)的復(fù)雜度,通過(guò)Zuul還可以對(duì)調(diào)用方的權(quán)限進(jìn)行檢查控制,所以它同時(shí)也可以提供監(jiān)控、安全等相關(guān)服務(wù)[2]。
2.4 消息中間件RocketMq
消息隊(duì)列作為高并發(fā)系統(tǒng)的核心組件之一,能夠幫助業(yè)務(wù)系統(tǒng)解構(gòu),提升開(kāi)發(fā)效率和系統(tǒng)穩(wěn)定性。消息中間件包括消息生產(chǎn)者和消費(fèi)者兩個(gè)角色:消息生產(chǎn)者負(fù)責(zé)創(chuàng)建消息并發(fā)送到消息服務(wù)器,消息消費(fèi)者從消息服務(wù)器拉取消息并提交給應(yīng)用消費(fèi)[3]。Topic是消息最細(xì)粒度的訂閱單位,是生產(chǎn)者傳遞消息和消費(fèi)者提取消息的標(biāo)識(shí)。消息中間件處理模型如下。
Rocket MQ 是一款分布式、隊(duì)列模型的消息中間件,支持事務(wù)消息、順序消息、批量消息、定時(shí)消息、消息回溯等,具有高性能、高可靠、高實(shí)時(shí)、分布式特點(diǎn)[4],支持拉(pull)和推(push)兩種消息模式,具備億級(jí)消息堆積能力。
2.5 微服務(wù)拆分
采用微服務(wù)架構(gòu)進(jìn)行應(yīng)用系統(tǒng)設(shè)計(jì),微服務(wù)劃分十分重要。服務(wù)拆分的顆粒度是微服務(wù)架構(gòu)應(yīng)用系統(tǒng)實(shí)現(xiàn)的關(guān)鍵,是系統(tǒng)建成后運(yùn)維工作、系統(tǒng)運(yùn)行性能等的基礎(chǔ)。盡量單一職責(zé)、高內(nèi)聚低耦合、易拆分、易理解、易修改替換、易部署,都是好的微服務(wù)架構(gòu)應(yīng)有的特征[5]。
3 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
3.1 業(yè)務(wù)流程
學(xué)員參加遠(yuǎn)程培訓(xùn)班,合格條件從大的方面可以分為與具體課程有關(guān)、與具體課程無(wú)關(guān)兩個(gè)方面。
與課程有關(guān)的培訓(xùn)班合格條件,包括課程學(xué)習(xí)、課程作業(yè)、課程考試。每個(gè)環(huán)節(jié)完成之后,需要判斷課程所在的必修課或選修課是否合格,進(jìn)而判斷是否能夠?qū)е掳嗉?jí)合格。與課程無(wú)關(guān)的培訓(xùn)班合格條件,包括綜合考試、綜合作業(yè)、集中互動(dòng)、調(diào)查問(wèn)卷。每個(gè)環(huán)節(jié)的合格,都可能導(dǎo)致學(xué)員班級(jí)合格。主要流程如下圖。
3.2 微服務(wù)拆分
從業(yè)務(wù)流程中可看出,課程合格的各個(gè)條件相互獨(dú)立。遵循微服務(wù)拆分原則,將班級(jí)合格的各個(gè)條件課程學(xué)習(xí)、課程作業(yè)、課程考試、綜合考試等劃分為7個(gè)獨(dú)立的微服務(wù)。學(xué)員在網(wǎng)院完成班級(jí)培訓(xùn)的某項(xiàng)學(xué)習(xí)任務(wù),通過(guò)網(wǎng)關(guān)調(diào)用相應(yīng)微服務(wù),進(jìn)行消息隊(duì)列的生成,消息消費(fèi)者獲取消息隊(duì)列的消息,進(jìn)行班級(jí)合格的處理,保證學(xué)員實(shí)時(shí)合格。
3.3 技術(shù)架構(gòu)
系統(tǒng)采用基于Spring Cloud的微服務(wù)架構(gòu),注冊(cè)配置中心采用Eurake,網(wǎng)關(guān)采用Zuul,消息隊(duì)列采用Rocket MQ,技術(shù)架構(gòu)圖如下。
接入端提供全局的負(fù)載均衡功能,具有大量、高并發(fā)的接入請(qǐng)求處理能力;業(yè)務(wù)應(yīng)用通過(guò)服務(wù)注冊(cè)的方式調(diào)用基礎(chǔ)服務(wù)功能;采用消息處理方式,在服務(wù)請(qǐng)求量大的情況下采用異步調(diào)用,保證用戶體驗(yàn)的友好性;課程學(xué)習(xí)、課程作業(yè)等基礎(chǔ)服務(wù)彼此獨(dú)立,某一個(gè)服務(wù)的改造升級(jí)不會(huì)影響其他服務(wù)的功能,便于平臺(tái)的功能擴(kuò)展;采用redis內(nèi)存數(shù)據(jù)庫(kù)集群提高系統(tǒng)運(yùn)行性能。
3.4 系統(tǒng)實(shí)現(xiàn)
系統(tǒng)實(shí)現(xiàn)的核心為消息隊(duì)列,消息隊(duì)列機(jī)制保證了業(yè)務(wù)繁忙時(shí)間,班級(jí)合格處理不影響主流業(yè)務(wù)的正常開(kāi)展。
3.4.1 消息隊(duì)列生成
以課程學(xué)習(xí)為例,課程學(xué)習(xí)完成,生成消息并發(fā)送到消息隊(duì)列。
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);? --發(fā)送到消息隊(duì)列
}
}
3.4.2 消息隊(duì)列監(jiān)聽(tīng)
課程學(xué)習(xí)、課程考試、綜合考試等分別有各自的消息監(jiān)聽(tīng),監(jiān)聽(tīng)消息隊(duì)列中屬于自己的消息,進(jìn)行相應(yīng)處理。以課程學(xué)習(xí)為例,消息監(jiān)聽(tīng)實(shí)現(xiàn)如下。
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;
/* 學(xué)員通過(guò)課程學(xué)習(xí)觸發(fā)班級(jí)合格*/
@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); --班級(jí)合格處理
}else{
logger.info("courseStudySink repeat key:" + key +" pxClassClassrcdInfo:"+pxClassClassrcdInfo.toString());
}
}
}
4 結(jié)束語(yǔ)
采用微服務(wù)架構(gòu)實(shí)現(xiàn)遠(yuǎn)程培訓(xùn)班的實(shí)時(shí)合格功能,在學(xué)習(xí)高峰期會(huì)以消息隊(duì)列的形式進(jìn)行異步處理,不影響遠(yuǎn)程培訓(xùn)主流業(yè)務(wù)的運(yùn)行性能。學(xué)員完成培訓(xùn)班學(xué)習(xí)后,合格信息會(huì)很快反饋給學(xué)員,提升了學(xué)員的學(xué)習(xí)體驗(yàn)。同時(shí),如果培訓(xùn)班合格條件發(fā)生變化,微服務(wù)架構(gòu)會(huì)以修改或增加單個(gè)微服務(wù)的方式快速應(yīng)對(duì)業(yè)務(wù)變化。
參考文獻(xiàn):
[1] 譚鋒.Spring Cloud Alibaba微服務(wù)原理與實(shí)戰(zhàn)[M].北京:電子工業(yè)出版社,2020.
[2] 方志朋.深入理解Spring Cloud與微服務(wù)構(gòu)建[M].北京:人民郵電出版社,2018.
[3] 歐志芳.基于RocketMQ實(shí)現(xiàn)異構(gòu)數(shù)據(jù)庫(kù)同步[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2016(12):99-100.
[4] 馬躍,顏睿陽(yáng),孫建偉.基于RocketMQ的MQTT消息推送服務(wù)器分布式部署方案[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2018,27(6):83-86.
[5] 克里斯·理查森.微服務(wù)架構(gòu)設(shè)計(jì)模式[M].北京:機(jī)械工業(yè)出版社,2019.
【通聯(lián)編輯:謝媛媛】