高 健 劉從軍
(1.江蘇科技大學(xué)計(jì)算機(jī)學(xué)院 鎮(zhèn)江 212003)(2.江蘇科大匯峰科技有限公司 鎮(zhèn)江 212003)
統(tǒng)一的不動(dòng)產(chǎn)登記制度是市場(chǎng)經(jīng)濟(jì)的一項(xiàng)基礎(chǔ)性制度[1],和每個(gè)人的切身利益息息相關(guān)。隨著信息化技術(shù)的高速發(fā)展,國(guó)務(wù)院提出關(guān)于推進(jìn)“互聯(lián)網(wǎng)+政務(wù)服務(wù)”建設(shè)的理念。而不動(dòng)產(chǎn)登記業(yè)務(wù)是政府政務(wù)服務(wù)當(dāng)中至關(guān)重要的一環(huán)。為了緩解不動(dòng)產(chǎn)登記窗口的壓力,不動(dòng)產(chǎn)登記網(wǎng)上預(yù)約系統(tǒng)應(yīng)運(yùn)而生。現(xiàn)有的不動(dòng)產(chǎn)登記網(wǎng)上預(yù)約系統(tǒng)都是采用傳統(tǒng)的單體應(yīng)用架構(gòu)[2],將所有功能,邏輯整合在一起,增加了代碼的復(fù)雜性,降低了代碼編寫(xiě)的效率,也增加了維護(hù)的難度。采用傳統(tǒng)的單體應(yīng)用架構(gòu)設(shè)計(jì)的不動(dòng)產(chǎn)登記網(wǎng)上預(yù)約系統(tǒng),不利于應(yīng)對(duì)日益增長(zhǎng)的業(yè)務(wù)量,同時(shí)也不利于應(yīng)對(duì)國(guó)家相關(guān)政策的調(diào)整。
采用微服務(wù)架構(gòu)[3]將復(fù)雜的系統(tǒng)應(yīng)用分解為不同的微服務(wù),解決了復(fù)雜性問(wèn)題,在功能相同的情況下,應(yīng)用被拆分為多個(gè)松耦合的服務(wù)。不同服務(wù)之間通過(guò)某種協(xié)議(通常是REST,RPC 等)進(jìn)行互相通信協(xié)作。微服務(wù)架構(gòu)模式提供了模塊化解決方案,用以解決單體式編碼很難實(shí)現(xiàn)的內(nèi)容,從而使單個(gè)服務(wù)很容易開(kāi)發(fā)、理解和維護(hù)。其次,該架構(gòu)允許使用不同的開(kāi)發(fā)團(tuán)隊(duì)開(kāi)發(fā)每項(xiàng)服務(wù)。不同的開(kāi)發(fā)團(tuán)隊(duì)依據(jù)服務(wù)的特性,選擇合適的開(kāi)發(fā)技術(shù),提供API 服務(wù)。第三,每個(gè)微服務(wù)可以獨(dú)立部署。開(kāi)發(fā)者不再需要考慮其他服務(wù)部署對(duì)本服務(wù)的影響,只需考慮部署自己的服務(wù)。這種改變可以加快部署速度。最后,微服務(wù)架構(gòu)模式使得每個(gè)服務(wù)獨(dú)立擴(kuò)展[4]。
Spring cloud 是基于微服務(wù)架構(gòu)的一款微服務(wù)框架。Spring cloud 是一系列框架的有序集合。Spring cloud 并非一款新技術(shù),它只是在spring boot的基礎(chǔ)上簡(jiǎn)化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開(kāi)發(fā),屏蔽掉了一些復(fù)雜的配置。例如服務(wù)發(fā)現(xiàn)注冊(cè)、配置中心、消息總線(xiàn)、負(fù)載均衡[5]、斷路器、數(shù)據(jù)監(jiān)控等都可以做到一鍵啟動(dòng)和部署。Spring cloud 給開(kāi)發(fā)者留出了一套簡(jiǎn)單易懂、易部署和易維護(hù)的分布式系統(tǒng)開(kāi)發(fā)工具包。
采用微服務(wù)架構(gòu)對(duì)不動(dòng)產(chǎn)登記網(wǎng)上預(yù)約系統(tǒng)進(jìn)行設(shè)計(jì),使用spring cloud 框架進(jìn)行開(kāi)發(fā),可以很好地解決傳統(tǒng)單體架構(gòu)帶來(lái)的影響。
微服務(wù)架構(gòu)是一種將一個(gè)復(fù)雜的,單一的應(yīng)用程序開(kāi)發(fā)為一小組的服務(wù)方法,不同的服務(wù)運(yùn)行在自己的進(jìn)程中,進(jìn)程之間通過(guò)輕量級(jí)機(jī)制(通常是HTTP資源的API)進(jìn)行通信[6]。這些不同的服務(wù)根據(jù)自身業(yè)務(wù)的功能劃分進(jìn)行構(gòu)建,并且可以使用自動(dòng)化部署機(jī)制自動(dòng)部署。不同的服務(wù),可以使用不同的編程語(yǔ)言進(jìn)行編寫(xiě),使用不同的數(shù)據(jù)存儲(chǔ)技術(shù)。它的主要特點(diǎn)是組件化、松耦合[7]、自治、去中心化,體現(xiàn)在以下幾個(gè)方面。
1)一組小的服務(wù)
專(zhuān)注服務(wù)的粒度,服務(wù)粒度要盡量小,每個(gè)服務(wù)盡量負(fù)責(zé)一項(xiàng)業(yè)務(wù),把焦點(diǎn)放在一件事情上。
2)獨(dú)立部署運(yùn)行和擴(kuò)展
每個(gè)服務(wù)都可以獨(dú)立部署,并在單個(gè)進(jìn)程中運(yùn)行。這樣每個(gè)服務(wù)的代碼可以根據(jù)實(shí)際情況,靈活的響應(yīng)和變化。
3)獨(dú)立開(kāi)發(fā)和演化
技術(shù)選擇非常靈活,不受傳統(tǒng)系統(tǒng)技術(shù)的限制。根據(jù)不同業(yè)務(wù)的不同類(lèi)型,選擇更加合適的技術(shù)進(jìn)行獨(dú)立的演化。在服務(wù)和服務(wù)之間集成了與語(yǔ)言無(wú)關(guān)的API。和單體架構(gòu)相比,微服務(wù)架構(gòu)是一種新興的一種架構(gòu)模式,它更加面向業(yè)務(wù)的創(chuàng)新。
4)獨(dú)立團(tuán)隊(duì)和自治
該團(tuán)隊(duì)負(fù)責(zé)服務(wù)的整個(gè)生命周期,在獨(dú)立環(huán)境中工作,并自行決策,無(wú)需統(tǒng)一的指揮中心。團(tuán)隊(duì)和團(tuán)隊(duì)通過(guò)松散的社區(qū)部落聯(lián)系在一起。
不動(dòng)產(chǎn)登記網(wǎng)上預(yù)約系統(tǒng)就是能夠使業(yè)務(wù)申請(qǐng)人不需要到不動(dòng)產(chǎn)登記大廳進(jìn)行業(yè)務(wù)的辦理,可以直接進(jìn)行網(wǎng)上的申請(qǐng),自行填寫(xiě)相關(guān)業(yè)務(wù)信息,并根據(jù)系統(tǒng)整理后所生成的收件清單上傳相應(yīng)的電子圖像資料,確認(rèn)所有信息填寫(xiě)無(wú)誤后,進(jìn)行業(yè)務(wù)的申請(qǐng)?zhí)峤?,此時(shí)網(wǎng)上預(yù)約系統(tǒng)將所有相關(guān)信息共享到不動(dòng)產(chǎn)登記中心、房產(chǎn)交易中心和地稅部門(mén),各個(gè)部門(mén)根據(jù)自己的職能進(jìn)行相關(guān)信息有效性的聯(lián)合審批。
申請(qǐng)人在提交了申請(qǐng)之后,如若想要查看自己申請(qǐng)的業(yè)務(wù)是否通過(guò),可以隨時(shí)登錄不動(dòng)產(chǎn)登記網(wǎng)上預(yù)約系統(tǒng)查詢(xún)相關(guān)業(yè)務(wù)審核的狀態(tài),同時(shí)也可通過(guò)其他方式查詢(xún)業(yè)務(wù)和進(jìn)度信息,比如關(guān)注微信公眾號(hào)等。
業(yè)務(wù)申請(qǐng)人在網(wǎng)上申請(qǐng)的業(yè)務(wù)如果在三家單位都一致審合通過(guò)的話(huà),網(wǎng)上預(yù)約系統(tǒng)能夠自動(dòng)通過(guò)短信或者微信這些方式,給申請(qǐng)人發(fā)送消息。
圖1 業(yè)務(wù)流程圖
網(wǎng)上預(yù)約系統(tǒng)包括業(yè)務(wù)網(wǎng)上預(yù)約申請(qǐng)、網(wǎng)上預(yù)審、稅款試算和消息通知等功能,為申請(qǐng)人提供網(wǎng)上預(yù)約申請(qǐng)服務(wù),中介或代理機(jī)構(gòu)在獲得管理部門(mén)認(rèn)證和授權(quán)后,可登錄網(wǎng)上預(yù)約系統(tǒng),填寫(xiě)業(yè)務(wù)申請(qǐng)關(guān)鍵信息,上傳相關(guān)材料的電子檔案,提交主管部門(mén)進(jìn)行網(wǎng)上預(yù)審,系統(tǒng)通過(guò)短信或微信平臺(tái)告知申請(qǐng)人預(yù)審結(jié)果。審核部門(mén)通過(guò)網(wǎng)上預(yù)審功能,縮短了群眾窗口滯留時(shí)間,加快了業(yè)務(wù)審核的速度,提高了政府的辦事效率。
圖2 網(wǎng)上預(yù)約功能模塊圖
根據(jù)不動(dòng)產(chǎn)登記流程及功能模塊劃分,依據(jù)微服務(wù)拆分原則,將系統(tǒng)拆分為以下幾個(gè)微服務(wù)。
1)預(yù)約申請(qǐng)
業(yè)務(wù)申請(qǐng)人根據(jù)網(wǎng)上預(yù)約操作流程填寫(xiě)相關(guān)信息,系統(tǒng)會(huì)自動(dòng)根據(jù)申請(qǐng)人申請(qǐng)業(yè)務(wù)的不同類(lèi)型進(jìn)行區(qū)分,從而生成不同的業(yè)務(wù)材料的清單,然后申請(qǐng)人上傳相應(yīng)的電子材料清單,再確認(rèn)相關(guān)填寫(xiě)是否有誤,確認(rèn)無(wú)誤后提交申請(qǐng),等待各個(gè)部門(mén)的審核。
2)網(wǎng)上預(yù)審
根據(jù)各部門(mén)的不同職能,不動(dòng)產(chǎn)登記部門(mén),房地產(chǎn)交易部門(mén)和稅務(wù)部門(mén)根據(jù)自己的職責(zé)劃分,審核業(yè)務(wù)信息的不同內(nèi)容。系統(tǒng)自動(dòng)收集并整合各部門(mén)的預(yù)審結(jié)果,并及時(shí)通知申請(qǐng)人。
3)消息通知
系統(tǒng)為業(yè)務(wù)申請(qǐng)人提供了不同的消息通知方法,滿(mǎn)足申請(qǐng)人及時(shí)查詢(xún)業(yè)務(wù)相關(guān)的進(jìn)度信息,以方便申請(qǐng)人及時(shí)了解業(yè)務(wù)預(yù)審結(jié)果。
4)業(yè)務(wù)對(duì)接
包括不動(dòng)產(chǎn)數(shù)據(jù)接口功能模塊,獲得商品房合同,存量房合同以及交易限制等信息;房產(chǎn)數(shù)據(jù)接口功能模塊,進(jìn)行房屋價(jià)格評(píng)估以及稅費(fèi)試算等;稅務(wù)數(shù)據(jù)接口功能模塊,獲得權(quán)利限制等信息。
5)系統(tǒng)管理
提供一些管理服務(wù),用于不動(dòng)產(chǎn)登記網(wǎng)上預(yù)約系統(tǒng)的日常維護(hù)以及相關(guān)的管理需求,從而能夠保證系統(tǒng)安全而穩(wěn)定的運(yùn)行。
根據(jù)微服務(wù)的特性以及系統(tǒng)微服務(wù)的拆分,微服務(wù)架構(gòu)模式采用代理微服務(wù)設(shè)計(jì)模式[8]和鏈?zhǔn)轿⒎?wù)設(shè)計(jì)模式[8]相結(jié)合的方式。
圖3 系統(tǒng)微服務(wù)架構(gòu)模式圖
在代理微服務(wù)設(shè)計(jì)模式下,客戶(hù)端并不聚合數(shù)據(jù),但會(huì)根據(jù)業(yè)務(wù)需求的差別調(diào)用不同的微服務(wù),比如系統(tǒng)管理微服務(wù),業(yè)務(wù)對(duì)接微服務(wù)和消息通知微服務(wù)。代理可以?xún)H僅委派請(qǐng)求,也可以進(jìn)行數(shù)據(jù)轉(zhuǎn)換工作。
鏈?zhǔn)轿⒎?wù)設(shè)計(jì)模式在接收到請(qǐng)求后會(huì)產(chǎn)生一個(gè)經(jīng)過(guò)合并的響應(yīng),在這種情況下,業(yè)務(wù)對(duì)接服務(wù)接收到請(qǐng)求后會(huì)與預(yù)約申請(qǐng)服務(wù)進(jìn)行通信,因?yàn)橄到y(tǒng)在調(diào)用預(yù)約申請(qǐng)微服務(wù)時(shí),必須通過(guò)業(yè)務(wù)對(duì)接微服務(wù)獲得來(lái)自房產(chǎn)等部門(mén)的相關(guān)信息。類(lèi)似地,業(yè)務(wù)對(duì)接服務(wù)會(huì)同網(wǎng)上預(yù)審服務(wù)進(jìn)行通信。所有服務(wù)都使用同步消息傳遞。
由于spring cloud 具有約定優(yōu)于配置[9];適合各種環(huán)境;隱藏了組件的復(fù)雜性性輕量級(jí)的組件:Eurake、Ribbon、Zuul 等;組件豐富;靈活的特點(diǎn),所以選擇spring cloud微服務(wù)框架用于構(gòu)建系統(tǒng)。
各個(gè)組件的配置使用運(yùn)行流程如下。
1)外部的請(qǐng)求通過(guò) API 網(wǎng)關(guān)(Zuul)[10]來(lái)訪(fǎng)問(wèn)內(nèi)部的微服務(wù)。
2)API 網(wǎng)關(guān)在接收到外部的請(qǐng)求后,從注冊(cè)中心(Eureka)獲取相應(yīng)的服務(wù)。
圖4 spring cloud系統(tǒng)架構(gòu)圖
3)通過(guò)Ribbon 進(jìn)行均衡負(fù)載后,調(diào)用后端具體的微服務(wù)實(shí)例。
4)微服務(wù)之間通過(guò)Feign(聲明式、模板化的Http客戶(hù)端[11])進(jìn)行通信處理業(yè)務(wù)。
5)Hystrix負(fù)責(zé)處理服務(wù)超時(shí)熔斷。
6)Turbine 監(jiān)控服務(wù)間的調(diào)用和熔斷相關(guān)指標(biāo)。
根據(jù)系統(tǒng)微服務(wù)架構(gòu)模式的選擇以及spring cloud架構(gòu)圖,設(shè)計(jì)如下系統(tǒng)結(jié)構(gòu)圖。
圖5 基于spring cloud的系統(tǒng)設(shè)計(jì)圖
首先,外部的請(qǐng)求通過(guò)API 網(wǎng)關(guān)(Zuul)來(lái)訪(fǎng)問(wèn)內(nèi)部服務(wù),比如消息通知,系統(tǒng)管理等。其次,服務(wù)網(wǎng)關(guān)收到外部的請(qǐng)求后,從注冊(cè)中心(Eureka)獲取已注冊(cè)的可用的服務(wù)。接著,由Ribbon 通過(guò)相應(yīng)的負(fù)載均衡算法進(jìn)行均衡負(fù)載后,分發(fā)到后端具體的微服務(wù)實(shí)例。
微服務(wù)之間通過(guò)Feign 進(jìn)行通信處理業(yè)務(wù),不同微服務(wù)之間通過(guò)采用輕量級(jí)的通信機(jī)制互相溝通(通常是基于HTTP的RESTful API)。
5.2.1 服務(wù)治理
預(yù)約申請(qǐng),網(wǎng)上預(yù)審,消息通知,業(yè)務(wù)對(duì)接,系統(tǒng)管理這五個(gè)微服務(wù)在啟動(dòng)時(shí),會(huì)周期性往服務(wù)發(fā)現(xiàn)組件(Eureka Server)發(fā)送心跳信息[12],將自己的網(wǎng)絡(luò)地址,名稱(chēng),和端口號(hào)等注冊(cè)到服務(wù)發(fā)現(xiàn)[13]組件Eureka Server當(dāng)中,服務(wù)發(fā)現(xiàn)組件會(huì)保存這些信息。服務(wù)消費(fèi)者即外部的請(qǐng)求會(huì)通過(guò)查詢(xún)服務(wù)發(fā)現(xiàn)組件里保存的網(wǎng)絡(luò)地址信息來(lái)調(diào)用不同服務(wù)提供者的接口,即調(diào)用不同微服務(wù)實(shí)例[14]。微服務(wù)網(wǎng)絡(luò)地址發(fā)生變更(例如實(shí)例增減或者IP 端口發(fā)生變化等)時(shí),會(huì)重新注冊(cè)到服務(wù)發(fā)現(xiàn)組件。使用這種方式,服務(wù)消費(fèi)者就無(wú)須人工修改提供者的網(wǎng)絡(luò)地址。
圖6 微服務(wù)的注冊(cè)發(fā)現(xiàn)圖
5.2.2 負(fù)載均衡
Robbin 是spring cloud 使用的一種負(fù)載均衡器。同一個(gè)微服務(wù)功能可能會(huì)開(kāi)啟很多個(gè),此時(shí)需要一種微服務(wù)的調(diào)用規(guī)則,這樣才能準(zhǔn)確地調(diào)用響應(yīng)的微服務(wù)。所以,只要為Robbin 配置了提供服務(wù)者的同一類(lèi)微服務(wù)的地址列表后,我們的Robbin就可以基于某種負(fù)載均衡的算法自動(dòng)的幫助服務(wù)事物消費(fèi)者去請(qǐng)求服務(wù)。默認(rèn)情況下,Robbin為我們提供了循環(huán),隨機(jī)負(fù)載均衡算法,我們還可以自定義負(fù)載均衡算法。當(dāng)請(qǐng)求調(diào)用某個(gè)微服務(wù)時(shí),比如業(yè)務(wù)對(duì)接微服務(wù),通過(guò)Ribbon 發(fā)送請(qǐng)求,然后Ribbon 進(jìn)行負(fù)載均衡算法將請(qǐng)求轉(zhuǎn)發(fā)到某個(gè)微服務(wù)實(shí)例。在多個(gè)實(shí)例的情況下,其中某個(gè)實(shí)例出現(xiàn)問(wèn)題,Ribbon 會(huì)轉(zhuǎn)而調(diào)用其他的實(shí)例,不會(huì)影響系統(tǒng)的正常使用。
圖7 客戶(hù)端負(fù)載均衡
5.2.3 服務(wù)網(wǎng)關(guān)與容錯(cuò)保護(hù)
API 網(wǎng)關(guān)(zoul)將預(yù)約申請(qǐng),網(wǎng)上預(yù)審,消息通知,業(yè)務(wù)對(duì)接,系統(tǒng)管理這五個(gè)微服務(wù)統(tǒng)一接入,隱藏了系統(tǒng)架構(gòu)的具體實(shí)現(xiàn)的細(xì)節(jié)。此時(shí)API 服務(wù)網(wǎng)關(guān)就成了不同微服務(wù)訪(fǎng)問(wèn)的統(tǒng)一入口。這樣客戶(hù)端所有的請(qǐng)求都會(huì)經(jīng)過(guò)API服務(wù)網(wǎng)關(guān),服務(wù)網(wǎng)關(guān)再將服務(wù)請(qǐng)求路由到合適的微服務(wù),以提供具體的微服務(wù)處理。
圖8 服務(wù)網(wǎng)關(guān)與容錯(cuò)處理
Hystrix 熔斷器是一種容錯(cuò)保護(hù)機(jī)制,熔斷器Hystix 是一種容錯(cuò)管理工具,通過(guò)隔離和控制服務(wù),防止整個(gè)系統(tǒng)被拖垮,為延遲和故障提供更大的容錯(cuò)能力。復(fù)雜的分布式體系結(jié)構(gòu)[15]通常具有很多依賴(lài)性,當(dāng)應(yīng)用程序與其他服務(wù)高度耦合時(shí),它非常危險(xiǎn)并且容易出現(xiàn)故障。這種故障很容易傷害服務(wù)的調(diào)用者,最終導(dǎo)致連續(xù)的錯(cuò)誤,并且應(yīng)用程序本身也有被拖垮的風(fēng)險(xiǎn)。當(dāng)某一個(gè)微服務(wù)發(fā)生故障時(shí),它會(huì)向調(diào)用方返回一個(gè)服務(wù)降級(jí)處理(fallback),而不是長(zhǎng)時(shí)間的等待或者拋出調(diào)用方無(wú)法處理的異常,這樣就保證了服務(wù)調(diào)用方的線(xiàn)程不會(huì)被長(zhǎng)時(shí)間不必要的占用,從而避免了故障在分布式系統(tǒng)中的蔓延乃至崩潰。
1)降低了系統(tǒng)的復(fù)雜性,將系統(tǒng)分為預(yù)約申請(qǐng);網(wǎng)上預(yù)審;消息通知;業(yè)務(wù)對(duì)接;系統(tǒng)管理五個(gè)獨(dú)立的模塊,模塊的邊界清晰,由于不同模塊交于不同的團(tuán)隊(duì)開(kāi)發(fā),提高了代碼的質(zhì)量。
2)提高了部署頻率,若是修改了某一模塊的代碼,只需將該模塊重新部署,不需要對(duì)整個(gè)系統(tǒng)進(jìn)行部署。
3)提高了系統(tǒng)可靠性,一個(gè)模塊的代碼出現(xiàn)bug,不會(huì)影響整個(gè)系統(tǒng)的使用,其他模塊可以正常使用。不動(dòng)產(chǎn)登記的業(yè)務(wù)量是非常龐大的,若是單體架構(gòu),一個(gè)小bug 可能會(huì)影響了整個(gè)系統(tǒng)的使用,給政府的工作帶來(lái)不便以及人民帶來(lái)不必要的麻煩。
4)擴(kuò)展能力得到了提升,系統(tǒng)可以根據(jù)業(yè)務(wù)模塊的需要進(jìn)行伸縮。不動(dòng)產(chǎn)登記業(yè)務(wù)往往隨著國(guó)家政策的調(diào)整發(fā)生變化,這就需要良好的擴(kuò)展能力。
5)有利于技術(shù)的創(chuàng)新,開(kāi)發(fā)不同模塊的開(kāi)發(fā)人員,在開(kāi)發(fā)時(shí)可以選擇新興的技術(shù),不需要都使用相同的開(kāi)發(fā)語(yǔ)言。
不動(dòng)產(chǎn)登記是國(guó)家一項(xiàng)重要的政策,用于保障人民的利益,不動(dòng)產(chǎn)登記網(wǎng)上預(yù)約系統(tǒng)的出現(xiàn),是從線(xiàn)下辦理向線(xiàn)上辦理服務(wù)的轉(zhuǎn)變,提高了政府的辦事效率,提高市民對(duì)政府工作的滿(mǎn)意度。傳統(tǒng)的不動(dòng)產(chǎn)登記網(wǎng)上預(yù)約系統(tǒng)采用傳統(tǒng)單體架構(gòu)不利于系統(tǒng)的擴(kuò)展及維護(hù),以及應(yīng)對(duì)日益增長(zhǎng)的業(yè)務(wù)量和國(guó)家政策的變化。采用微服務(wù)架構(gòu)理論,結(jié)合微服務(wù)架構(gòu)的設(shè)計(jì)思想,結(jié)合spring cloud 框架設(shè)計(jì)的不動(dòng)產(chǎn)登記網(wǎng)上預(yù)約系統(tǒng)可以很好地解決這些問(wèn)題。