賈峰
(廣東理工職業(yè)學院,廣州 510091)
云筆記系統(tǒng)通過分布式存儲解決了筆記信息量膨脹的問題,業(yè)務端同時提供了Windows客戶端,并且數(shù)據(jù)平臺支持移動設備的接入,更加貼近學生的使用習慣,達到無處不學習、無處不筆記的效果。文獻[1]和[2]中涉及的云筆記系統(tǒng)基于單體架構(gòu),這樣的系統(tǒng)存在維護性差、可靠性低、并發(fā)能力有限等問題;文獻[3]雖然在項目中使用分布式的架構(gòu),但沒有指出如何實現(xiàn)微服務的調(diào)用。
傳統(tǒng)分布式云筆記系統(tǒng)中前端系統(tǒng)向后端發(fā)起http跨域請求訪問,當并發(fā)量增加情況下作為中轉(zhuǎn)器的nginx負載過高,另外如果對服務器數(shù)量進行增減,就要手動更改ngnix的配置文件,這樣服務的發(fā)現(xiàn)不夠靈活。因此需選用相對于小巧、靈活的Dubbo技術作為項目開發(fā)架構(gòu)。
RPC是遠程過程調(diào)用(Remote Procedure Call)的縮寫形式。RPC可以簡單理解為自己需要完成一項業(yè)務,但是由于諸多原因自己不能直接調(diào)用,只能通過第三方訪問的業(yè)務調(diào)用。
Dubbo是阿里SOA服務化治理方案的核心框架,作為分布式RPC框架,它提供阿里注冊中心機制,解耦了消費方和服務方動態(tài)發(fā)現(xiàn)的問題,并提供高可靠能力,大量采用微內(nèi)核和富插件思想,并提供靈活可擴展能力。
項目中引入Dubbo框架后,在遠程調(diào)用時能夠像本地調(diào)用一樣方便,讓調(diào)用者感知不到遠程調(diào)用的邏輯。Dubbo內(nèi)部是如何實現(xiàn)的?如圖1所示:①當生產(chǎn)者啟動時,會將服務信息(包括服務名稱、服務IP和端口)配置到注冊中心。②注冊中心動態(tài)維護服務列表,定時進行刷新。③消費訪問注冊中心,獲取最新的服務列表數(shù)據(jù),之后緩存到本地以便下次調(diào)用。④當用戶訪問消費者時,消費者查詢本地的服務列表進行負載均衡,訪問其中一個生產(chǎn)者獲取數(shù)據(jù)。⑤注冊中心通過心跳檢測機制訪問生產(chǎn)者,當生產(chǎn)者宕機時馬上更新服務列表并全網(wǎng)廣播,通知所有的消費者更新列表數(shù)據(jù)。
圖1 服務的注冊和發(fā)現(xiàn)
云筆記系統(tǒng)整體設計分為3層架構(gòu),設計思想為:最底層是數(shù)據(jù)訪問層,為服務支撐的基礎保障;中間層是業(yè)務層,里面對業(yè)務模塊進行細化和拆分,將系統(tǒng)用戶所需的功能抽取成多個微服務,微服務向下調(diào)用各服務提供API,向上對用戶訪問層提供微服務接口;用戶訪問層包括PC、手機等各種類型終端調(diào)用微服務接口,實現(xiàn)相應用戶功能,具體系統(tǒng)架構(gòu)如圖2所示。
圖2 系統(tǒng)架構(gòu)
本文重點說明業(yè)務微服務層設計,云筆記業(yè)務非常明確,將其拆分成3個子服務,分別是用戶服務、筆記本服務、筆記服務,每個子服務代表獨立的設計模塊,但技術架構(gòu)基本相同。初期可以先搭建3臺服務器Zookeeper服務器,形成了1個最輕量的負載集群,用來對服務模塊的提供方進行注冊。由于系統(tǒng)采用Dubbo的服務治理框架,隨著數(shù)據(jù)量和訪問量的上升,Dubbo可以使用權(quán)重算法分析負載,動態(tài)調(diào)配系統(tǒng)資源,另外非常重要一點是對服務進行管理和監(jiān)控,它可以保證系統(tǒng)長時間的在各種復雜的情況下正常運行。部署1臺RabbitMQ服務器,消息中間件需開辟一大塊內(nèi)存空間,實現(xiàn)數(shù)據(jù)短暫存儲。部署1臺Mysql服務器和1臺Re?dis服務器,數(shù)據(jù)訪問層數(shù)據(jù)庫實現(xiàn)主從讀寫分離,引入緩存機制之后,主要的目的為了降低用戶訪問物理設備的頻次,提高服務器響應效率。
通過對系統(tǒng)中數(shù)據(jù)的總體分析,可以確定系統(tǒng)中主要實體、屬性和實體之間的關系,其中幾個主要的E-R圖如圖3所示。用戶和筆記本之間是一對多的關系,即一個用戶可以擁有多個筆記本,而一個筆記本只能屬于一個用戶。筆記本與筆記是一對多的關系,即筆記本中可以保存多條筆記,每條筆記卻只能存在一個筆記本中。
圖3 E-R模型
用戶要獲取數(shù)據(jù)需向遠程業(yè)務服務器發(fā)送請求,消費者(控制層)通過定義的接口調(diào)用生產(chǎn)者(業(yè)務層),內(nèi)部利用Dubbo協(xié)議完成數(shù)據(jù)傳輸,如圖4所示。整個系統(tǒng)包括主項目dubbo-cloudnote以及3個子項目:①dubbocloudnote-interface,②dubbo-cloudnote-provider,③dubbo-cloudnote-consumer,其中②和③必須依賴于接口項目①。項目①中只定義pojo及業(yè)務層用戶、筆記本和筆記模塊中的接口。
圖4 獲取遠程數(shù)據(jù)
項目②中需要定義數(shù)據(jù)訪問層mapper接口及業(yè)務層各接口的實現(xiàn)類,內(nèi)部使用TCP-IP協(xié)議進行調(diào)用。SpringBoot致力于快速方便地開發(fā)單個微服務,解決ssm大量手工配置的問題,在SpringBoot中配置文件applcation.yml中添加信息如下:指定dubbo包路徑org.gdpi,掃描后代包,定義服務名稱provider-note,服務名稱和接口一一對應,連接Zookeeper服務注冊中心,提供1個主服務和2個備份服務,主服務協(xié)議端口為2181,使用dubbo協(xié)議,定義服務的端口為20880,每個服務都有自己特定的端口不能重復,如果定義多個provider-note則服務端口號不同。
dubbo:
scan:
basePackages:com.gdpi
application:
name:provider-note
registry:
address:zookeeper://192.168.126.129:2181?
backup=192.168.126.129:2182,192.168.126.129:2183
protocol:
name:dubbo
port:20880
舉例筆記服務生產(chǎn)者接口實現(xiàn):業(yè)務方法loadNotes功能是根據(jù)用戶ID查詢筆記信息,其中注解@Service(timeout=3000)規(guī)定服務器響應時間3秒超時,內(nèi)部實現(xiàn)RPC調(diào)用,@service引入的包則是com.alibaba.dubbo.config.annotation.Service。
public class NoteServiceImpl implements NoteService{
@Autowired
private NoteMapper noteMapper;
public List
......
}
}
綜上所述,對老年護理事業(yè)大力發(fā)展,在對老年人進行治療的同時,為其提供了更多情感上、心靈上、生活上的幫助,對于構(gòu)建老有所依的和諧社會具有十分重要的意義。因此為盡快將健全的社區(qū)衛(wèi)生服務體系建立起來,對衛(wèi)生資源進行合理利用,需要醫(yī)療護理人員做出更多的努力。
項目③只定義控制層controller,舉例筆記服務消費者實現(xiàn):利用dubbo的方式為接口創(chuàng)建代理對象,內(nèi)部同樣實現(xiàn)RPC調(diào)用,遠程RPC調(diào)用就像調(diào)用自己本地服務一樣簡單。消費者在服務器內(nèi)部完成了負載均衡,稱之為客戶端負載均衡,關鍵字leastactive表示挑選當前負載壓力小的生產(chǎn)者進行訪問。
@RestController
public class NoteController{
@Reference(loadbalance="leastactive")
private NoteService noteService;
@RequestMapping("/loadnotes")
public NoteResult findAll(String noteBookId){
......
}
}
該架構(gòu)相比傳統(tǒng)分布式架構(gòu),解決了開發(fā)者在分布式跨域請求過程的繁瑣的過程,運行更加穩(wěn)定,實現(xiàn)“高內(nèi)聚低耦合”的核心理念。本系統(tǒng)的后期,考慮開發(fā)更多的擴展功能,利用分布式搜索引擎增加了用戶搜索,系統(tǒng)可以作為共享資源分享自己的筆記,并收藏其他人分享的筆記資源擴充自己的知識行囊。