陳德權(quán)
(1.福建省基礎(chǔ)地理信息中心,福建 福州 350002)
隨著自然資源管理業(yè)務(wù)的不斷拓展和深入,自然資源外業(yè)現(xiàn)場(chǎng)核查已成為業(yè)務(wù)管理的核心工作之一。近年來(lái),福建省自然資源廳開展的土地利用變更調(diào)查、土地整治項(xiàng)目管理[1-2]、移動(dòng)執(zhí)法監(jiān)察[3-4]等自然資源管理業(yè)務(wù)均在各自業(yè)務(wù)系統(tǒng)的支持下,以手持GNSS移動(dòng)設(shè)備為外業(yè)核查的技術(shù)手段,對(duì)相關(guān)業(yè)務(wù)進(jìn)行監(jiān)管。未來(lái)還將在地質(zhì)災(zāi)害點(diǎn)核查、違法用地督察、礦山生態(tài)治理等更多的全省自然資源管理業(yè)務(wù)上進(jìn)行深入應(yīng)用。為避免相同業(yè)務(wù)功能的重復(fù)建設(shè),需在現(xiàn)有業(yè)務(wù)系統(tǒng)的基礎(chǔ)上構(gòu)建統(tǒng)一的自然資源外業(yè)核查系統(tǒng),為各類自然資源管理業(yè)務(wù)提供統(tǒng)一的外業(yè)核查數(shù)據(jù)來(lái)源,因此需要充分考慮跨平臺(tái)服務(wù)接口的兼容性、服務(wù)拓展與可擴(kuò)充性以及全省多業(yè)務(wù)應(yīng)用帶來(lái)的高并發(fā)問(wèn)題。微服務(wù)架構(gòu)[5-7]則可用來(lái)解決上述問(wèn)題。本文設(shè)計(jì)了基于分布式微服務(wù)架構(gòu)的自然資源外業(yè)核查系統(tǒng),提升了系統(tǒng)的可靠性和穩(wěn)定性。系統(tǒng)采用領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)方法將自然資源核查業(yè)務(wù)劃分為細(xì)粒度的微服務(wù)[6],以實(shí)現(xiàn)服務(wù)之間的高度解耦;核查終端還可根據(jù)實(shí)際業(yè)務(wù)需要,調(diào)用微服務(wù)進(jìn)行功能組合,有效應(yīng)對(duì)業(yè)務(wù)拓展的需要。
系統(tǒng)由支撐層、數(shù)據(jù)層、微服務(wù)層、服務(wù)網(wǎng)關(guān)和應(yīng)用層組成,各部分按照一定的標(biāo)準(zhǔn)和協(xié)議緊密結(jié)合在一起,為自然資源核查業(yè)務(wù)提供信息化支撐,如圖1所示。支撐層依托數(shù)字福建云計(jì)算平臺(tái)提供的虛擬化計(jì)算資源,形成數(shù)據(jù)存儲(chǔ)集群、應(yīng)用服務(wù)集群以及相關(guān)的安全設(shè)施服務(wù)。數(shù)據(jù)層根據(jù)數(shù)據(jù)類型分類存儲(chǔ),其中核查業(yè)務(wù)數(shù)據(jù)庫(kù)存儲(chǔ)相關(guān)的業(yè)務(wù)數(shù)據(jù);空間數(shù)據(jù)庫(kù)存儲(chǔ)與空間位置相關(guān)的數(shù)據(jù),如圖斑數(shù)據(jù)、地名點(diǎn)數(shù)據(jù)、軌跡點(diǎn)數(shù)據(jù)等;圖片數(shù)據(jù)庫(kù)存儲(chǔ)外業(yè)核查的照片;業(yè)務(wù)系統(tǒng)交換數(shù)據(jù)存儲(chǔ)從第三方自然資源業(yè)務(wù)系統(tǒng)中生成的核查任務(wù)數(shù)據(jù);Redis緩存數(shù)據(jù)庫(kù)存儲(chǔ)緩存數(shù)據(jù),可提高微服務(wù)獲取數(shù)據(jù)的效率。微服務(wù)層由數(shù)據(jù)倉(cāng)儲(chǔ)接口、微服務(wù)和服務(wù)注冊(cè)中心構(gòu)成,其中數(shù)據(jù)倉(cāng)儲(chǔ)接口向下與數(shù)據(jù)層中的各類數(shù)據(jù)完成數(shù)據(jù)讀寫操作,向上為微服務(wù)提供統(tǒng)一的數(shù)據(jù)操作接口;微服務(wù)利用領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)方法將外業(yè)核查業(yè)務(wù)劃分為細(xì)粒度的服務(wù),并部署在多臺(tái)服務(wù)器的Nginx下,以實(shí)現(xiàn)服務(wù)的集群[7];服務(wù)注冊(cè)中心負(fù)責(zé)微服務(wù)的注冊(cè)、發(fā)現(xiàn)與管理,通過(guò)心跳包監(jiān)測(cè)微服務(wù)的運(yùn)行狀態(tài)。服務(wù)網(wǎng)關(guān)將服務(wù)注冊(cè)中心的微服務(wù)對(duì)外映射,并利用負(fù)載均衡調(diào)度算法實(shí)現(xiàn)前后端路由控制和轉(zhuǎn)發(fā)。應(yīng)用層由核查終端和管理端共同實(shí)現(xiàn)對(duì)自然資源核查業(yè)務(wù)的管理,并通過(guò)服務(wù)接口為其他業(yè)務(wù)系統(tǒng)提供核查數(shù)據(jù)來(lái)源。
圖1 系統(tǒng)總體架構(gòu)
自然資源外業(yè)核查系統(tǒng)的主要數(shù)據(jù)為核查業(yè)務(wù)數(shù)據(jù)、與業(yè)務(wù)緊密結(jié)合的空間數(shù)據(jù)以及外業(yè)核查采集的圖片數(shù)據(jù)。為了提高系統(tǒng)查詢效率,本文以Redis數(shù)據(jù)庫(kù)為系統(tǒng)的緩存數(shù)據(jù)庫(kù),存儲(chǔ)系統(tǒng)中被頻繁調(diào)用的業(yè)務(wù)數(shù)據(jù)和統(tǒng)計(jì)分析數(shù)據(jù)。此外,系統(tǒng)需通過(guò)服務(wù)層的數(shù)據(jù)接口實(shí)現(xiàn)與自然資源管理信息化系統(tǒng)核查業(yè)務(wù)的數(shù)據(jù)對(duì)接,存儲(chǔ)相關(guān)數(shù)據(jù)到業(yè)務(wù)系統(tǒng)交換數(shù)據(jù)庫(kù)中,通過(guò)標(biāo)準(zhǔn)化的數(shù)據(jù)清洗規(guī)則,實(shí)現(xiàn)各類業(yè)務(wù)數(shù)據(jù)向標(biāo)準(zhǔn)核查業(yè)務(wù)數(shù)據(jù)的轉(zhuǎn)換。
基于微服務(wù)架構(gòu)的系統(tǒng)需要把業(yè)務(wù)拆分為多個(gè)服務(wù),合理的微服務(wù)劃分能使系統(tǒng)具備良好的靈活性和擴(kuò)展性,在演進(jìn)過(guò)程中仍然保持敏捷。領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)是一種圍繞具體業(yè)務(wù)進(jìn)行領(lǐng)域建模與分析的方法。首先通過(guò)調(diào)研收集自然資源外業(yè)核查的業(yè)務(wù)需求,分析得到業(yè)務(wù)領(lǐng)域事件;再尋找完成該事件所涉及的角色和命令;然后圍繞領(lǐng)域事件確定系統(tǒng)的聚合和限界上下文;最后確定系統(tǒng)的領(lǐng)域模型,領(lǐng)域上下文之間的低耦合,便于未來(lái)的業(yè)務(wù)擴(kuò)展。
在自然資源外業(yè)核查業(yè)務(wù)中,下發(fā)核查任務(wù)和上報(bào)核查任務(wù)就是典型的領(lǐng)域事件。任務(wù)管理員通過(guò)下發(fā)指令將任務(wù)下發(fā)到外業(yè)核查員;外業(yè)核查員通過(guò)上報(bào)指令將經(jīng)過(guò)采集的任務(wù)信息發(fā)送給任務(wù)管理員,由此可確定系統(tǒng)的一個(gè)聚合是“任務(wù)”,由這個(gè)聚合來(lái)發(fā)布領(lǐng)域事件,包括創(chuàng)建、修改、刪除、下發(fā)、上報(bào)等。限界上下文可根據(jù)系統(tǒng)的聚合來(lái)確定,并建立上下文的映射關(guān)系,如任務(wù)上下文與圖片上下文、地圖圖斑上下文產(chǎn)生上下游協(xié)作關(guān)系,限界上下文之間通過(guò)系統(tǒng)事件來(lái)協(xié)作。通過(guò)對(duì)業(yè)務(wù)的不斷迭代分析,即可形成系統(tǒng)的領(lǐng)域模型。
通過(guò)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),明確了系統(tǒng)微服務(wù)的邊界,每個(gè)服務(wù)可獨(dú)立開發(fā)、測(cè)試、部署與維護(hù),各服務(wù)之間高度解耦。微服務(wù)的設(shè)計(jì)充分考慮了移動(dòng)終端和第三方應(yīng)用系統(tǒng)跨平臺(tái)調(diào)用的需要,采用基于REST風(fēng)格的服務(wù)接口,消息通信協(xié)議支持JSON和Protobuf兩種輕量級(jí)格式,服務(wù)請(qǐng)求者可根據(jù)自己的需要靈活設(shè)置。一般來(lái)說(shuō),移動(dòng)終端的應(yīng)用適合采用比JSON更輕便更高效的Protobuf數(shù)據(jù)格式[8]。
為了更好地滿足業(yè)務(wù)擴(kuò)展需要,系統(tǒng)采用業(yè)務(wù)邏輯與數(shù)據(jù)操作解耦的方式來(lái)實(shí)現(xiàn)微服務(wù)。在服務(wù)接口內(nèi)部不直接與數(shù)據(jù)層交互,而是通過(guò)開發(fā)統(tǒng)一的數(shù)據(jù)倉(cāng)儲(chǔ)接口來(lái)完成相關(guān)數(shù)據(jù)的讀寫操作。數(shù)據(jù)倉(cāng)儲(chǔ)接口可根據(jù)業(yè)務(wù)需要不斷擴(kuò)展豐富,服務(wù)內(nèi)部只需根據(jù)領(lǐng)域事件發(fā)送相關(guān)命令,調(diào)取對(duì)應(yīng)倉(cāng)儲(chǔ)接口中的信息即可完成業(yè)務(wù)操作。
微服務(wù)的架構(gòu)決定了整個(gè)系統(tǒng)的業(yè)務(wù)功能是由大量的服務(wù)接口支撐的,若采用手動(dòng)管理和維護(hù)服務(wù)目錄的方式則無(wú)法保證系統(tǒng)的穩(wěn)定運(yùn)行,因此需要引入服務(wù)注冊(cè)中心。面向服務(wù)發(fā)布者提供服務(wù)注冊(cè)接口,微服務(wù)運(yùn)行時(shí)通過(guò)注冊(cè)接口向服務(wù)注冊(cè)中心登記該服務(wù),并將服務(wù)健康檢查的入口寫入注冊(cè)中心,在注冊(cè)中心運(yùn)行過(guò)程中自動(dòng)將心跳包發(fā)送至健康檢查的入口,以檢測(cè)服務(wù)的運(yùn)行狀態(tài)。
系統(tǒng)采用Consul開源的服務(wù)注冊(cè)中心,提供了服務(wù)注冊(cè)與發(fā)現(xiàn)、服務(wù)配置、服務(wù)監(jiān)測(cè)等一體化的解決方案,并有配套的開源二次開發(fā)工具包,可方便地實(shí)現(xiàn)服務(wù)的注冊(cè)與監(jiān)聽。Consul采用去中心化的部署方式,可在多臺(tái)服務(wù)器上安裝部署,形成服務(wù)注冊(cè)中心的集群。單個(gè)服務(wù)注冊(cè)中心的故障不會(huì)影響整個(gè)系統(tǒng)的運(yùn)行。自然資源外業(yè)核查系統(tǒng)的微服務(wù)在服務(wù)注冊(cè)中心的注冊(cè)情況如圖2所示。
圖2 服務(wù)注冊(cè)中心
一個(gè)完整的業(yè)務(wù)被拆分為多個(gè)微服務(wù)集,每個(gè)微服務(wù)均會(huì)配置相應(yīng)的接口說(shuō)明,而這些服務(wù)直接對(duì)外向應(yīng)用層提供接口則顯得雜亂無(wú)章,且無(wú)法實(shí)現(xiàn)服務(wù)的訪問(wèn)控制,服務(wù)的鑒權(quán)也無(wú)法集中統(tǒng)一控制,每個(gè)服務(wù)都要單獨(dú)進(jìn)行身份驗(yàn)證,因此需要設(shè)計(jì)一個(gè)服務(wù)網(wǎng)關(guān),自動(dòng)從服務(wù)注冊(cè)中心中獲取所有注冊(cè)的微服務(wù),集成在線接口說(shuō)明文檔,實(shí)現(xiàn)服務(wù)的負(fù)載均衡和路由控制,并在此基礎(chǔ)上構(gòu)建微服務(wù)鑒權(quán),實(shí)現(xiàn)服務(wù)的統(tǒng)一身份認(rèn)證。
系統(tǒng)采用Ocelot開源的API網(wǎng)關(guān),支持從Consul服務(wù)注冊(cè)中心自動(dòng)獲取已注冊(cè)的服務(wù)。網(wǎng)關(guān)設(shè)計(jì)如圖3所示。在服務(wù)網(wǎng)關(guān)內(nèi)部采用IdentityServer實(shí)現(xiàn)服務(wù)的身份驗(yàn)證,通過(guò)驗(yàn)證后,網(wǎng)關(guān)根據(jù)所發(fā)起的HTTP請(qǐng)求去Consul服務(wù)注冊(cè)中心匹配相應(yīng)的微服務(wù)的完整地址;再通過(guò)Ocelot組件提供的動(dòng)態(tài)路由機(jī)制轉(zhuǎn)發(fā)到下游的微服務(wù)中,并得到相應(yīng)的數(shù)據(jù)。在進(jìn)行路由轉(zhuǎn)發(fā)時(shí),網(wǎng)關(guān)會(huì)根據(jù)配置的負(fù)載均衡策略選擇從負(fù)載相對(duì)較低的服務(wù)器上請(qǐng)求微服務(wù)。當(dāng)請(qǐng)求的微服務(wù)出現(xiàn)異常時(shí),Ocelot會(huì)根據(jù)配置的QoS信息做相應(yīng)的處理;若異常次數(shù)超出設(shè)置,則自動(dòng)熔斷該服務(wù),直接在網(wǎng)關(guān)生成異常信息并返回請(qǐng)求終端,避免反復(fù)調(diào)用服務(wù)出錯(cuò)而占用系統(tǒng)資源和網(wǎng)絡(luò)資源。
圖3 服務(wù)網(wǎng)關(guān)架構(gòu)
在高并發(fā)的微服務(wù)架構(gòu)中,通過(guò)服務(wù)的負(fù)載均衡技術(shù)可實(shí)現(xiàn)系統(tǒng)的高可用性和服務(wù)集群。本文通過(guò)Ocelot網(wǎng)關(guān)提供的負(fù)載均衡組件來(lái)實(shí)現(xiàn)微服務(wù)的軟負(fù)載。Ocelot框架內(nèi)置RoundRobin(輪詢)、LeastConnection(最少連接數(shù))等多種負(fù)載均衡策略。當(dāng)網(wǎng)關(guān)收到服務(wù)請(qǐng)求時(shí),將先調(diào)用內(nèi)部的負(fù)載均衡組件,負(fù)載均衡組件根據(jù)負(fù)載均衡算法從可用的微服務(wù)列表中選擇一個(gè)負(fù)載相對(duì)較低的服務(wù)進(jìn)行轉(zhuǎn)發(fā),從而降低系統(tǒng)的壓力。系統(tǒng)利用Consul配合Ocelot能較好地滿足微服務(wù)的負(fù)載均衡需求。
微服務(wù)采用分布式集群部署,在微服務(wù)調(diào)度策略的支撐下能有效降低系統(tǒng)的響應(yīng)時(shí)間。由于每個(gè)微服務(wù)接口均需與數(shù)據(jù)庫(kù)進(jìn)行交互,因此數(shù)據(jù)庫(kù)的I/O操作也是影響系統(tǒng)性能的主要因素之一,在高并發(fā)情況下將引起數(shù)據(jù)庫(kù)的I/O堵塞,增加客戶端請(qǐng)求時(shí)間,嚴(yán)重時(shí)可能直接導(dǎo)致數(shù)據(jù)庫(kù)宕機(jī)。為了有效降低數(shù)據(jù)庫(kù)的讀寫操作,系統(tǒng)采用分布式多級(jí)緩存技術(shù),將頻繁使用的業(yè)務(wù)數(shù)據(jù)建立動(dòng)態(tài)緩存,下次訪問(wèn)時(shí)即可直接從緩存中獲取數(shù)據(jù),減少數(shù)據(jù)庫(kù)的I/O操作,從而提高系統(tǒng)的性能。
本文采用Redis分布式緩存和內(nèi)存緩存相結(jié)合的多級(jí)緩存技術(shù)來(lái)提高數(shù)據(jù)訪問(wèn)速度,以分布式緩存為緩存數(shù)據(jù)的藍(lán)本,在此基礎(chǔ)上建立服務(wù)器的內(nèi)存緩存,服務(wù)接口直接從內(nèi)存中讀取使用頻率高的數(shù)據(jù)。分布式多級(jí)緩存的技術(shù)架構(gòu)如圖4所示。由于內(nèi)存緩存設(shè)置在各服務(wù)器內(nèi)部,使用緩存時(shí)可能出現(xiàn)數(shù)據(jù)不一致的情況,如一個(gè)微服務(wù)接口在服務(wù)器A中更新了一個(gè)緩存數(shù)據(jù),但在服務(wù)器B的內(nèi)存緩存中仍為舊的緩存數(shù)據(jù)。因此,在分布式緩存和服務(wù)器內(nèi)存緩存之間需建立緩存控制總線,用于同步分布式緩存與各服務(wù)器內(nèi)存緩存的數(shù)據(jù),時(shí)刻保持系統(tǒng)緩存數(shù)據(jù)的一致性。
圖4 分布式多級(jí)緩存架構(gòu)
微服務(wù)啟動(dòng)時(shí)會(huì)向緩存控制總線發(fā)送訂閱命令,總線就會(huì)自動(dòng)記錄該服務(wù)器的信息。當(dāng)服務(wù)器中的內(nèi)存緩存更新時(shí),首先向Redis分布式緩存寫入數(shù)據(jù),再向緩存控制總線發(fā)布緩存更新消息,總線通知其他服務(wù)器需要更新緩存數(shù)據(jù),服務(wù)器收到通知后從分布式緩存中獲取相應(yīng)的數(shù)據(jù)并更新到本地的內(nèi)存緩存中,這樣就保證了所有服務(wù)器緩存數(shù)據(jù)的一致性。
微服務(wù)部署在服務(wù)網(wǎng)關(guān)的下游,專注于實(shí)現(xiàn)自然資源外業(yè)核查相關(guān)業(yè)務(wù),若每個(gè)微服務(wù)在調(diào)用時(shí)均需進(jìn)行身份認(rèn)證,將會(huì)帶來(lái)資源的浪費(fèi),且服務(wù)內(nèi)部都要完成同一套認(rèn)證邏輯也不利于后期的系統(tǒng)維護(hù),因此需在微服務(wù)的上游網(wǎng)關(guān)層實(shí)現(xiàn)服務(wù)鑒權(quán),而各微服務(wù)實(shí)例只需專注各自的業(yè)務(wù)邏輯即可。
Ocelot為IdentityServer提供了很好的支持,在網(wǎng)關(guān)內(nèi)部統(tǒng)一實(shí)現(xiàn)基于IdentityServer的服務(wù)認(rèn)證鑒權(quán),采用JWT[9]的無(wú)狀態(tài)驗(yàn)證機(jī)制實(shí)現(xiàn)客戶端和服務(wù)端的身份認(rèn)證與權(quán)限控制。用戶首次登錄系統(tǒng)時(shí),網(wǎng)關(guān)的服務(wù)鑒權(quán)模塊將根據(jù)用戶名和密碼進(jìn)行身份驗(yàn)證,形成Token密鑰返回給服務(wù)請(qǐng)求方。在后續(xù)服務(wù)請(qǐng)求的Head中加入Token信息,網(wǎng)關(guān)的鑒權(quán)模塊首先驗(yàn)證該Token的有效性,驗(yàn)證通過(guò)后再判斷該用戶是否具備所請(qǐng)求的微服務(wù)的權(quán)限,通過(guò)后才將請(qǐng)求的信息轉(zhuǎn)發(fā)到下游對(duì)應(yīng)的微服務(wù)接口中,處理完成后將結(jié)果返回給服務(wù)請(qǐng)求方。
系統(tǒng)利用分布式多級(jí)緩存技術(shù)提高微服務(wù)鑒權(quán)的效率,將用戶登錄信息進(jìn)行多級(jí)緩存,同時(shí)設(shè)置過(guò)期時(shí)間,到期后自動(dòng)刪除對(duì)應(yīng)的緩存。在服務(wù)鑒權(quán)模塊進(jìn)行身份驗(yàn)證時(shí),首先從緩存中查詢?cè)撚脩羰欠翊嬖诘卿浶畔ⅲ舸嬖趧t直接從緩存中獲取Token返回給服務(wù)請(qǐng)求方;若不存在則通過(guò)數(shù)據(jù)庫(kù)驗(yàn)證用戶信息,通過(guò)后再生成Token返回給服務(wù)請(qǐng)求方,同時(shí)將登錄信息通過(guò)緩存總線緩存到Redis以及各集群服務(wù)器中以備下次驗(yàn)證使用。
為了檢驗(yàn)基于微服務(wù)架構(gòu)的自然資源外業(yè)核查系統(tǒng)是否能滿足全省自然資源管理的業(yè)務(wù)需要,本文采用開源的wrk性能測(cè)試工具對(duì)系統(tǒng)進(jìn)行并發(fā)測(cè)試。wrk專門用于測(cè)試基于HTTP協(xié)議的服務(wù)端性能,可充分利用單機(jī)多核CPU性能,通過(guò)線程和事件的模式對(duì)服務(wù)端產(chǎn)生大量的負(fù)載。本次測(cè)試通過(guò)編寫lua腳本模擬客戶端發(fā)起的請(qǐng)求數(shù)據(jù),利用wrk調(diào)用腳本,并開啟8線程分別模擬100 個(gè)、200 個(gè)和500個(gè)并發(fā),每次持續(xù)測(cè)試30 s,測(cè)試結(jié)果如圖5所示。
由壓力測(cè)試結(jié)果可知,在同一個(gè)網(wǎng)絡(luò)環(huán)境下,系統(tǒng)的平均響應(yīng)時(shí)間并沒有隨著并發(fā)數(shù)的增加而出現(xiàn)較大幅度的增長(zhǎng),平均響應(yīng)時(shí)間約增長(zhǎng)20 ms,總體響應(yīng)時(shí)間約為120 ms,系統(tǒng)一直保持較平穩(wěn)的狀態(tài),說(shuō)明基于微服務(wù)架構(gòu)的自然資源外業(yè)核查系統(tǒng)可解決全省大規(guī)模使用時(shí)帶來(lái)的性能問(wèn)題。
本文基于微服務(wù)架構(gòu)設(shè)計(jì)并實(shí)現(xiàn)了面向全省應(yīng)用的自然資源外業(yè)核查系統(tǒng),可為全省自然資源各業(yè)務(wù)系統(tǒng)提供統(tǒng)一的外業(yè)核查數(shù)據(jù)來(lái)源,解決了傳統(tǒng)單體應(yīng)用開發(fā)模式帶來(lái)的負(fù)載不均衡和不易擴(kuò)展等問(wèn)題。微服務(wù)采用分布式集群部署方式,在服務(wù)網(wǎng)關(guān)和服務(wù)注冊(cè)中心的支持下實(shí)現(xiàn)了服務(wù)的負(fù)載均衡和性能優(yōu)化,能滿足一定的高并發(fā)和高可用的性能要求。
圖5 壓力測(cè)試結(jié)果