蘇海鏈,沈雨絲,諶祖滕,張常斌,賴光均
(景德鎮(zhèn)學(xué)院,江西 景德鎮(zhèn) 333000)
Dubbo+Zookeeper是近年來比較流行的分布式服務(wù)的解決方案之一。Dubbo是Alibaba開源的分布式服務(wù)框架,主要是為了解決如何在網(wǎng)絡(luò)中安全地傳遞服務(wù),也就是網(wǎng)絡(luò)通信的安全問題,不是提供方提供服務(wù),就是消費(fèi)方消費(fèi)服務(wù)。Zookeeper則是一個(gè)服務(wù)中心,提供服務(wù)發(fā)現(xiàn)和注冊的功能,解決服務(wù)管理難的問題。它集成了分布式技術(shù)中的分布式服務(wù),分布式服務(wù)顧名思義就是將服務(wù)分別存放在不同服務(wù)器上,根據(jù)服務(wù)占用資源的不同來分配服務(wù)器資源,通過網(wǎng)絡(luò)進(jìn)行連接。而本方案將考試的核心功能放置在高性能的云服務(wù)器上,將不需要占用太多資源的登陸注冊、修改密碼、數(shù)據(jù)管理等功能放置在本地電腦上,以達(dá)到提高軟件響應(yīng)速度和運(yùn)行效率的目的。
傳統(tǒng)的醫(yī)師自我檢測考試往往采用筆試的方式,由于執(zhí)業(yè)醫(yī)師考試周期長,會(huì)導(dǎo)致物質(zhì)成本和時(shí)間成本較大,醫(yī)師模擬考試軟件就可以解決這一問題,用戶可以通過碎片化的時(shí)間檢測學(xué)習(xí)成果,并且可以不限地點(diǎn)只需要有網(wǎng)絡(luò)。只需要一套完整的題庫,考試試卷就可以由計(jì)算機(jī)自動(dòng)生成和批改,節(jié)約時(shí)間成本,讓學(xué)習(xí)效率大幅度提高,用戶只需要專注于對知識掌握程度的測驗(yàn)而不需要在考慮如何去獲取合適試卷,一切都可以由軟件自動(dòng)完成。用戶可以通過軟件快速查看到考試的成績,也可以隨時(shí)隨地的生成試卷進(jìn)行考試,不需要固定的時(shí)間和地點(diǎn),在有互聯(lián)網(wǎng)的地方就可以進(jìn)行考試。
基于分布式技術(shù)的臨床醫(yī)師模擬考試軟件使用Spring Boot框架進(jìn)行開發(fā)。這一框架是近年來比較流行的微服務(wù)框架,在其中可以快捷地集成分布式技術(shù),同時(shí)在Spring Boot框架中集成了SSM框架,而SSM框架則是非常流行的JavaEE企業(yè)級框架。本方案就是以Spring Boot框架集成的SSM框架搭建后端管理界面,然后集成分布式技術(shù)dubbo+zookeeper。這兩個(gè)分布式技術(shù)是比較流行的技術(shù),使用方便快速,其優(yōu)點(diǎn)是開發(fā)效率高、運(yùn)行速度快、軟件負(fù)載高、開發(fā)成本低[1]。
①登錄注銷功能:超級管理員進(jìn)行登錄,Shiro會(huì)接管賬號密碼并對賬號密碼進(jìn)行核對,核對無誤則進(jìn)入軟件后端。
②權(quán)限管理功能:超級管理員可以對管理員用戶和普通用戶進(jìn)行降權(quán)和升權(quán)操作。
③題庫管理功能:超級管理員可以對題庫進(jìn)行增刪改查的操作,可以生成excel表格。
④試卷管理功能:超級管理員可以對試卷進(jìn)行增刪改查的操作,可以生成excel表格。
⑤用戶管理功能:超級管理員可以對用戶進(jìn)行增刪改查的操作,可以生成excel表格。
⑥歷史考試記錄管理功能:超級管理員可以對歷史記錄進(jìn)行查看并且管理。
⑦修改密碼功能:超級管理員可以對管理員和自身進(jìn)行密碼管理,可以對指定用戶實(shí)施一鍵密碼還原。
⑧發(fā)布公告功能:超級管理員可以發(fā)布公告,公告會(huì)顯示在軟件首頁上。
①登錄注銷功能:與超級管理員相似進(jìn)行登錄,Shiro會(huì)接管賬號密碼并對賬號密碼進(jìn)行核對,核對無誤則進(jìn)入軟件后端。
②試卷管理功能:超級管理員可以對試卷進(jìn)行增刪改查的操作,可以查看試卷預(yù)生成,并生成excel表格。
③用戶管理功能:超級管理員可以對用戶進(jìn)行增刪改查的操作,可以生成excel表格。
④歷史考試記錄管理功能:超級管理員可以對歷史記錄進(jìn)行查看并且管理。
⑤修改密碼功能:管理員對自身進(jìn)行密碼管理,并可以對指定用戶實(shí)施一鍵密碼還原。
⑥發(fā)布公告功能:超級管理員可以發(fā)布公告,公告會(huì)顯示在軟件首頁上
①考試功能:用戶登錄后可以選擇試卷進(jìn)行測試。
②錯(cuò)題查看功能:軟件會(huì)記錄下考試對應(yīng)的錯(cuò)題。并給出正確答案。
本系統(tǒng)采用SOA思想搭建,即面向服務(wù)的架構(gòu),集成了分布式技術(shù)中的分布式服務(wù),使用Spring Boot框架進(jìn)行開發(fā),以Spring Boot框架集成的SSM框架搭建后端管理界面,然后集成分布式技術(shù)dubbo+zookeeper,使用Shiro安全框架,以及Maven進(jìn)行依賴的管理,進(jìn)行數(shù)據(jù)庫的設(shè)計(jì),然后再使用逆向工程生成我們需要的代碼[2]??傮w分為三層架構(gòu),控制層、服務(wù)層和數(shù)據(jù)存儲(chǔ)層。
控制層:服務(wù)的消費(fèi)者,當(dāng)相應(yīng)的url請求過來,controller控制器就會(huì)去調(diào)用service公開的接口服務(wù),使用SpringMVC框架實(shí)現(xiàn),以Servlet為核心,負(fù)責(zé)接收前端數(shù)據(jù)并將處理好的數(shù)據(jù)傳遞給前端。
服務(wù)層:處理對應(yīng)的業(yè)務(wù)邏輯,被消費(fèi)者調(diào)用,消費(fèi)者只知道暴露的接口,而不知道真正的實(shí)現(xiàn)類,實(shí)現(xiàn)類是真正業(yè)務(wù)邏輯的實(shí)現(xiàn),對數(shù)據(jù)庫進(jìn)行相對應(yīng)的操作。
數(shù)據(jù)存儲(chǔ)層:采用主流的Mysql數(shù)據(jù)庫,Mysql是關(guān)系型數(shù)據(jù)庫管理系統(tǒng),使用結(jié)構(gòu)化查詢語言也就是SQL語言進(jìn)行數(shù)據(jù)庫管理。持久化框架使用基于Java的Mybatis框架,其高度可定制化的SQL語句,高效的存儲(chǔ)過程以及高級的對象關(guān)系映射使得代碼編寫更加簡潔方便。
圖1 系統(tǒng)架構(gòu)
軟件采用Dubbo+zookeeper分布式架構(gòu)管理,Dubbo主要使用RPC實(shí)現(xiàn)服務(wù)的調(diào)用,即客戶端和服務(wù)端共用一個(gè)接口(將接口打成一個(gè)jar包,在客戶端和服務(wù)端引入這個(gè)jar包),客戶端調(diào)用這個(gè)接口,服務(wù)端實(shí)現(xiàn)這個(gè)端口的功能,中間的網(wǎng)絡(luò)通信交給框架去實(shí)現(xiàn),而Zookeeper作為服務(wù)注冊中心,提供服務(wù)的發(fā)現(xiàn)和注冊功能,監(jiān)控各個(gè)服務(wù)之間的狀態(tài)信息[3]。
通常情況下,D u b b o 節(jié)點(diǎn)主要有P r o v i d e r、Consumer、Registry、Monitor、Container等五種角色。Provider主要是服務(wù)的提供方,提供服務(wù)所需要公開的接口,通過注冊服務(wù)實(shí)現(xiàn)多個(gè)服務(wù)進(jìn)行負(fù)載均衡,提高服務(wù)的并發(fā)量,同時(shí)避免出現(xiàn)服務(wù)的單點(diǎn)故障的發(fā)生,提高服務(wù)器的容錯(cuò)率。Consumer主要是服務(wù)的調(diào)用方,調(diào)用服務(wù)公開的接口,本次技術(shù)上的調(diào)用采用的是最少活躍調(diào)用數(shù)負(fù)載均衡,相比于其他的負(fù)載均衡算法,該算法可以在服務(wù)機(jī)器上自動(dòng)地實(shí)現(xiàn)性能低的機(jī)器所被調(diào)用的服務(wù)的次數(shù)更少,性能高的機(jī)器被調(diào)用的服務(wù)的次數(shù)就更高,從而實(shí)現(xiàn)整個(gè)集群整體性能的穩(wěn)定。Registry主要是服務(wù)的注冊中心,通過將多個(gè)服務(wù)注冊到多個(gè)服務(wù)中心處,提高服務(wù)的容錯(cuò),做到一臺(tái)服務(wù)宕機(jī),整體的服務(wù)依舊能繼續(xù)運(yùn)行,同時(shí)在服務(wù)中心處實(shí)現(xiàn),該技術(shù)使用Zookeeper實(shí)現(xiàn),通過Zookeeper的心跳檢測機(jī)制,可以在自定義時(shí)間去檢測該服務(wù)是否處于存活狀態(tài),同時(shí)在服務(wù)下線之后,通過服務(wù)的消費(fèi)端的監(jiān)測,實(shí)現(xiàn)自動(dòng)的調(diào)整服務(wù)的負(fù)載均衡,避免出現(xiàn)服務(wù)的雪崩現(xiàn)象,導(dǎo)致整體的服務(wù)宕機(jī),使用Zookeeper技術(shù)是為后續(xù)的大數(shù)據(jù)Hadoop框架使用Zookeeper做一致性。Monitor則是統(tǒng)計(jì)服務(wù)的調(diào)用次數(shù)和調(diào)用時(shí)間的監(jiān)控中心,通過服務(wù)的調(diào)用次數(shù),動(dòng)態(tài)的進(jìn)行性能優(yōu)化,在服務(wù)調(diào)用次數(shù)較少的時(shí)間內(nèi),進(jìn)行服務(wù)的更新,程序bug的修復(fù)。Container是服務(wù)運(yùn)行容器,使用的是Spring容器,是運(yùn)行服務(wù)的提供者,通過Spring容器,將服務(wù)動(dòng)態(tài)地放入容器中,用于服務(wù)消費(fèi)者進(jìn)行調(diào)用服務(wù)[4]。
Spring Boot提供了特有的啟動(dòng)器機(jī)制,并與此同時(shí)使用Maven這一管理工具,簡化了我們使用第三方j(luò)ar包的流程。我們只需要通過Maven配置文件導(dǎo)入我們所需的啟動(dòng)器就可以直接在項(xiàng)目中使用而不需要配置。
Spring Boot內(nèi)置了SpringMVC框架,SpringMVC是一個(gè)嚴(yán)格遵循MVC模式的框架,以Servlet為核心,負(fù)責(zé)接收前端數(shù)據(jù)并將處理好的數(shù)據(jù)傳遞給前端。同時(shí),Spring Boot還集成了Tomcat服務(wù)器,開發(fā)者在使用時(shí)就無需再外部導(dǎo)入服務(wù)器軟件,所以,Spring Boot是目前開發(fā)的首選框架。
該技術(shù)全部部署于Linux系統(tǒng)下,通過使用Linux命令和shell腳本語言來實(shí)現(xiàn)項(xiàng)目的自動(dòng)化部署,同時(shí)自動(dòng)收集日志文件,并定期刪除日志文件,防止日志文件過多導(dǎo)致服務(wù)器的內(nèi)存溢出,造成服務(wù)器的崩潰。
用戶在登錄框中輸入用戶名、密碼和驗(yàn)證碼點(diǎn)擊登錄,驗(yàn)證碼功能使用JS實(shí)現(xiàn),采用前端攔截的措施,使用正則表達(dá)式進(jìn)行用戶名和密碼的格式限制,驗(yàn)證碼無誤。前端通過Ajax方式使用post請求向后端傳輸?shù)卿浶畔?。后端的登陸?yàn)證則是由shiro框架實(shí)現(xiàn)的。后端取到用戶名和密碼,使用如下代碼執(zhí)行登錄驗(yàn)證[5]。
控制層核心代碼:
數(shù)據(jù)庫采取云端存儲(chǔ)的形式,使用WEB架構(gòu)的、以PHP語言為基礎(chǔ)的、對于MySQL的管理工具。它借由Web接口可以成為一個(gè)簡易方式輸入繁雜SQL語法的較佳途徑,尤其要處理大量資料的匯入及匯出更為方便。其中一個(gè)更大的優(yōu)勢在于,由于phpMyAdmin跟其他PHP程式一樣在網(wǎng)頁服務(wù)器上執(zhí)行,可以在任何地方使用這些程式產(chǎn)生的網(wǎng)頁,也就是于遠(yuǎn)端管理MySQL數(shù)據(jù)庫,方便建立、修改、刪除數(shù)據(jù)庫及資料表。也可借由phpMyAdmin建立常用的PHP語法,方便編寫網(wǎng)頁時(shí)所需要的SQL語法正確性。將單一用戶表分成用戶和管理員表的原因是為了方便節(jié)約性能。當(dāng)進(jìn)行簡單權(quán)限管理時(shí),超級管理員管理普通管理員而不會(huì)對用戶進(jìn)行權(quán)限管理,對于普通用戶來說只需要使用功能即可。而用戶管理也不需要對用戶的權(quán)限進(jìn)行更改,并且唯一具有權(quán)限管理的功能的角色只有超級管理員這一角色。其他表的設(shè)計(jì)都是為了實(shí)現(xiàn)對應(yīng)的功能,也是為了體現(xiàn)數(shù)據(jù)約束的完整性[6]。
本方案使用MySQL數(shù)據(jù)庫作為唯一數(shù)據(jù)庫,設(shè)計(jì)8張數(shù)據(jù)表,分別是章節(jié)表(chapter:存放章節(jié)信息)、班級表(examclass:存放班級信息)、考卷類型表(examtype:存放試卷類型信息)、用戶表(examuser:存放用戶的賬戶信息)、考卷信息表(library:存放試卷信息的數(shù)據(jù))、管理員表(manager:記錄管理員的各項(xiàng)數(shù)據(jù))、試題表(question:存放試題信息)、考試記錄表(record:存放考試記錄)。
至此,本方案的功能基本完善,普通用戶和管理員用戶的功能也基本完成。它使用的Spring Boot框架,開發(fā)便捷,軟件功能也相對完善。它在設(shè)計(jì)之初還有許多不完善的地方,開發(fā)過程中遇到的難點(diǎn)重點(diǎn)主要有:①前期layui框架和Spring Boot使用的默認(rèn)模板引擎的資源沖突問題,它會(huì)導(dǎo)致前端頁面顯示時(shí)出現(xiàn)顯示錯(cuò)誤,使用靜態(tài)資源過濾解決了這個(gè)問題;②顯示的渲染問題,由于使用動(dòng)態(tài)的渲染,導(dǎo)致使用編輯信息的功能時(shí)會(huì)使后端獲取的數(shù)據(jù)無法顯示或者顯示不完全,解決方法是在渲染表格和彈窗時(shí)添加數(shù)據(jù),然后等所有數(shù)據(jù)加載完成后,重載表格和彈窗;③文件上傳功能也是重難點(diǎn)之一,復(fù)雜文件的上傳并且是在同一頁面上使用兩個(gè)并行的表單上傳文件,并返回對應(yīng)路徑,遇到的問題是使用Ajax方式上傳文件會(huì)遇到文件上傳失敗或者文件獲取不到的問題。解決方法就是使用Ajax時(shí)嚴(yán)格限制上傳格式,并且在后端獲取時(shí)使用復(fù)雜文件對象接收,使用IO流的形式將文件存放到磁盤的固定位置。
開發(fā)過程中,本方案的創(chuàng)新點(diǎn)有:①使用Spring Boot框架集成dubbo+zookeeper分布式技術(shù)的應(yīng)用;②使用文件上傳功能,使題庫豐富且多樣化;③使用前端框架layui搭建后端管理模塊,頁面美觀且響應(yīng)速度快。