方 昉,侯 琳
(塔里木油田公司信息與通訊技術(shù)中心,庫爾勒 841000)
信息化建設(shè)對于油田公司的生產(chǎn)運(yùn)行及經(jīng)營管理起到了顯著的支撐和促進(jìn)作用,但同時由于軟件系統(tǒng)規(guī)模日漸龐大,功能也越來越復(fù)雜,當(dāng)油田公司原有業(yè)務(wù)需求發(fā)生變化,需要在舊系統(tǒng)上做相應(yīng)的功能調(diào)整及擴(kuò)展時,傳統(tǒng)的單體式架構(gòu)會帶來開發(fā)難度大、開發(fā)成本高、開發(fā)周期長等一系列問題。而微服務(wù)架構(gòu)的提出和應(yīng)用無疑為解決這些問題帶來的希望,它使得信息服務(wù)的軟件架構(gòu)在產(chǎn)生變動時的維護(hù)成本大大降低,并顯著提高了穩(wěn)定性。
微服務(wù)最早由Mar tin Fowler與James Lewis 于2014年共同提出,旨在通過將功能模塊分解到各個獨(dú)立的離散的服務(wù)中,從而降低系統(tǒng)的耦合性以提供更加靈活的服務(wù)支持[1]。其實,微服務(wù)就是一些協(xié)同工作的小而自治的服務(wù)。其框架特征主要有:由多個分布式服務(wù)組成,多個獨(dú)立的服務(wù),共同組成系統(tǒng);每個服務(wù)單獨(dú)部署,運(yùn)行在獨(dú)立的容器(進(jìn)程)里;服務(wù)可以采用不同的技術(shù)路線進(jìn)行獨(dú)立的設(shè)計、開發(fā)、部署;分布式管理[2]。
以微服務(wù)為理念,基于Spring boot技術(shù),采用Spr ing Cloud為微服務(wù)的技術(shù)框架,運(yùn)用智能網(wǎng)關(guān)、動態(tài)路由、服務(wù)注冊與發(fā)現(xiàn)、斷路器、客戶端負(fù)載均衡、JWT(安全認(rèn)證協(xié)議)、docker容器等相關(guān)技術(shù),構(gòu)建一套數(shù)據(jù)服務(wù)體系,以實現(xiàn)塔里木油田信息服務(wù)平臺的各種業(yè)務(wù)功能,見圖1。
圖1 總體框架圖
目前油田信息服務(wù)平臺數(shù)據(jù)服務(wù),由三臺服務(wù)器(10.79.1.144、10.79.1.236、10.79.1.175)組成,均采用Linux Centos7操作系統(tǒng)作為數(shù)據(jù)服務(wù)基礎(chǔ)環(huán)境,分別搭建了Docker集群、安全網(wǎng)關(guān)、服務(wù)注冊中心、微服務(wù)應(yīng)用集群、MongoDB副本集,整體應(yīng)用部署見圖2:
平臺基于docker,swarm,etcd,shipyarn相關(guān)技術(shù),搭建了docker集群,主要為微服務(wù)應(yīng)用的部署提供環(huán)境支持,通過docker鏡像,使微服務(wù)應(yīng)用可以在開發(fā)、測試、生產(chǎn)環(huán)境中,實現(xiàn)無縫銜接;并利用JWT(JSON Web Token),作為框架安全認(rèn)證協(xié)議,采用Nginx服務(wù)端負(fù)載均衡,同時結(jié)合Spring cloud微服務(wù)框架,運(yùn)用其相關(guān)組件,搭建GateWay 集群、Eureka集群,實現(xiàn)了智能網(wǎng)關(guān)、動態(tài)路由、配置中心等功能,后續(xù)可以根據(jù)微服務(wù)應(yīng)用需要選擇相應(yīng)的數(shù)據(jù)庫獨(dú)立部署至docker容器中。
圖2 應(yīng)用部署圖
本文以塔里木油田信息服務(wù)平臺為應(yīng)用場景,以微服務(wù)架構(gòu)技術(shù)實現(xiàn)平臺上的“待辦/已辦事宜”業(yè)務(wù)。2.2.1 數(shù)據(jù)庫設(shè)計
“待辦/已辦事宜”業(yè)務(wù)采用了Mongodb NOSQL 文檔數(shù)據(jù)庫作為數(shù)據(jù)存儲,主要表(collection)結(jié)構(gòu)見表1:
表1 數(shù)據(jù)結(jié)構(gòu)表
主要表字段具體含義:
stid:實例ID,即實例的惟一標(biāo)識;pid:業(yè)務(wù)ID,即待辦事宜涉及相關(guān)系統(tǒng)的業(yè)務(wù)編碼;ywxtbm:業(yè)務(wù)系統(tǒng)編碼,即待辦事宜涉及的系統(tǒng)編碼;jgnbm:功能編碼,即待辦事宜涉及相關(guān)系統(tǒng)的業(yè)務(wù)功能編碼;jyhid:接收人ID,即接收人的惟一標(biāo)識;jyhdwbm:接收人單位編碼,即接收人單位的惟一標(biāo)識;yhid:發(fā)送人ID,即發(fā)送人的惟一標(biāo)識。
2.2.2 服務(wù)接口設(shè)計
采用Restful風(fēng)格WebApi,提供的主要功能包括三類服務(wù):
(1)數(shù)據(jù)插入更新服務(wù)。提供向數(shù)據(jù)庫插入或更新待辦事宜信息。如圖3包括兩個接口。
圖3 插入更新接口圖
(2)待辦信息查詢。提供根據(jù)用戶名(yhid)或用戶名(yhid)+系統(tǒng)編碼(xtbm)方式查詢待辦信息如圖4。
圖4 待辦信息查詢接口圖
(3)已辦信息查詢。提供根據(jù)用戶名(yhid)+系統(tǒng)編碼(xtbm)方式查詢已辦信息如圖5,返回結(jié)果按時間倒序排列。
圖5 已辦信息查詢接口圖
2.2.3 服務(wù)部署及訪問流程控制
“待辦、已辦事宜”微服務(wù)中數(shù)據(jù)存儲使用了mongodb,采用主從方式部署,服務(wù)以docker容器形式多副本部署以提供負(fù)載均衡,使用spr ing cloud提供服務(wù)的注冊發(fā)現(xiàn)、服務(wù)治理以及安全網(wǎng)關(guān)與路由等功能。當(dāng)用戶請求已辦事宜數(shù)據(jù)服務(wù)時,調(diào)用主要過程如下:
外部請求到達(dá)Nginx,并通過Nginx負(fù)載轉(zhuǎn)發(fā)至docker集群的Zuul集群。請求中的token令牌將與JWT安全認(rèn)證,當(dāng)令牌認(rèn)證通過后,由ribbon從客戶端向Eureka服務(wù)注冊中心,獲取服務(wù)注冊列表,并返回負(fù)載量最低的已辦任務(wù)的注冊地址,然后再通過Zuul智能路由至已辦任務(wù)服務(wù)實例。當(dāng)某個已辦服務(wù)實例調(diào)用出現(xiàn)異常時,將觸發(fā)Hyst r ix 服務(wù)保護(hù)機(jī)制,并進(jìn)行服務(wù)的降級,進(jìn)而熔斷該節(jié)點(diǎn)微服務(wù)的調(diào)用,快速返回錯誤的響應(yīng)信息,當(dāng)檢測到該節(jié)點(diǎn)已辦任務(wù)服務(wù)調(diào)用響應(yīng)正常后,恢復(fù)調(diào)用鏈路。
微服務(wù)架構(gòu)本身具有擴(kuò)展性、穩(wěn)定性、安全性等特性,油田信息服務(wù)平臺通過部署微服務(wù)架構(gòu)并結(jié)合Docker技術(shù),實現(xiàn)數(shù)據(jù)高效共享服務(wù),有效地提高了開發(fā)效率,降低了運(yùn)維成本?!?/p>