跨系統(tǒng)接口的服務(wù)鏈監(jiān)控
SOA團隊 2020-03-16
由于所有跨系統(tǒng)的接口服務(wù)都通過ESB服務(wù)總線進行封裝代理后接入,因此理論上說從實際業(yè)務(wù)服務(wù)調(diào)用實例數(shù)據(jù)和日志中是可以反推出來端到端的業(yè)務(wù)流程的,也就是可以通過服務(wù)實例和服務(wù)鏈的監(jiān)控來間接的監(jiān)控跨系統(tǒng)的業(yè)務(wù)流轉(zhuǎn)是否正常。簡單來說,比如一個采購訂單,基于一個采購訂單號,我們實際上可以通過服務(wù)監(jiān)控數(shù)據(jù)來分析到該訂單是否已經(jīng)從采購系統(tǒng)導入到ERP,是否已經(jīng)進行了報賬申請,是否已經(jīng)進行了付款等,實際上這些信息從服務(wù)實例日志中都可以提取出來。
要完成這件事情,有兩個關(guān)鍵點要做,即首先要對服務(wù)鏈本身進行進行服務(wù)鏈流程建模,其次是能夠?qū)Σ杉娜罩镜妮斎胼敵鲋心軌蜃ト〕鼋Y(jié)構(gòu)化的關(guān)鍵業(yè)務(wù)字段信息。只要做到這兩點,我們就很容易實現(xiàn)可視化的跨系統(tǒng)服務(wù)鏈監(jiān)控功能。
■ 服務(wù)鏈流程建模的功能實現(xiàn)
在前面我們做ESB服務(wù)設(shè)計器的時候,已經(jīng)剝離了原流程引擎中進行服務(wù)編排或可視化流程建模的能力。實際上這里的設(shè)計本身也就是一個多個服務(wù)編排設(shè)計的過程,將多個服務(wù)編排設(shè)計到一起。注意在這個過程中還需要允許有分支,也允許并行。服務(wù)鏈監(jiān)控最終形成的也是一個完整的服務(wù)鏈監(jiān)控樹。只是這個監(jiān)控樹的形成是通過可視化的服務(wù)組合編排工具來實現(xiàn)的而已。
針對不同的跨系統(tǒng)業(yè)務(wù)監(jiān)控,都需要針對不同場景設(shè)計不同的服務(wù)監(jiān)控模型。比如現(xiàn)在設(shè)計一個采購訂單服務(wù)鏈監(jiān)控模型,我們建設(shè)對該模型進行簡化,具體如下通過建模工具形成如下模型樹。
合同導入服務(wù)-》采購訂單導入服務(wù)-》采購接收服務(wù)-》報賬申請服務(wù)-》應(yīng)付發(fā)票導入服務(wù)-》付款服務(wù)。
即在這些服務(wù)組合編排好后,我們需要維護對于每個服務(wù)對于的業(yè)務(wù)關(guān)鍵字提取字段,即可以根據(jù)XPath方式來說明是從XML結(jié)構(gòu)里面哪里去提取關(guān)鍵的業(yè)務(wù)字段值,如采購訂單號。那么我們在查找實例的時候主要就是用這個來解析業(yè)務(wù)報文里面的內(nèi)容進行匹配。一個服務(wù)本身運行涉及到成功和失敗,在流程實例查看的時候,最好方式是成功類服務(wù)和失敗類服務(wù)單獨進行顯示,以方便區(qū)分,同時如果該服務(wù)運行成功,未運行或運行失敗都能夠有明確的背景色分開展示。
注意,在上面這個服務(wù)鏈里面本身是存在1對多映射關(guān)系的。這種映射關(guān)系全部在點擊流程活動節(jié)點的時候再去顯示明細。對于兩個活動節(jié)點之間本身是1對1映射還是1對多,也可以在監(jiān)控模板設(shè)置的時候進行維護。
■ 業(yè)務(wù)日志采集和查詢
采用基于Solr進行業(yè)務(wù)關(guān)鍵字查詢和報文日志全文檢索。即我們不再需要對服務(wù)運行報文數(shù)據(jù)全部進行結(jié)構(gòu)化數(shù)據(jù),只需要對這些數(shù)據(jù)建立元數(shù)據(jù)索引信息,有了索引后Solr基本就可以快速的檢索和定位到具體的服務(wù)。
對于當前的服務(wù)日志,我們已經(jīng)完成了將Blob結(jié)構(gòu)的數(shù)據(jù)準實時的采集并提取索引信息,進入到Solr庫,實現(xiàn)了基于業(yè)務(wù)關(guān)鍵字的服務(wù)實例查詢能力,而原來我們只能基于服務(wù)實例號進行服務(wù)日志的查詢?;赟olr查詢速度相當快,基本都是10多毫秒就能快速的完成服務(wù)日志的檢索能力。在Solr實現(xiàn)了索引數(shù)據(jù)的創(chuàng)建,基于業(yè)務(wù)關(guān)鍵字的查詢能力后,接下來分析如何和服務(wù)鏈監(jiān)控進行整合。
舉例來說,對于采購訂單服務(wù)鏈監(jiān)控,進入該功能后我們直接輸入采購訂單號,然后基于訂單號我們做如下事情:
1. 首先找到采購訂單服務(wù)鏈監(jiān)控流程模板,然后基于流程模板知道涉及哪些服務(wù)。
2. 找到流程模板中維護的Xpath檢索項。
3. 基于Xpath檢索項找的信息,拼裝Solr查詢關(guān)鍵字,然后進行Solr查詢查找到對應(yīng)服務(wù)日志記錄。
4. 將服務(wù)日志記錄提取出來對應(yīng)到流程實例具體的活動節(jié)點上面。形成關(guān)聯(lián),并區(qū)分成功失敗,當前狀態(tài)。
5. 完成流程實例圖的顯示。
最終完成的服務(wù)鏈監(jiān)控效果圖參考如下:
對于服務(wù)鏈監(jiān)控,按照前面的思路完全可以做到通過服務(wù)的監(jiān)控和關(guān)聯(lián),來逆向?qū)崿F(xiàn)跨系統(tǒng)交互流程的監(jiān)控,即從服務(wù)鏈為主的監(jiān)控轉(zhuǎn)變到跨系統(tǒng)流程交互的監(jiān)控。其本質(zhì)仍然是跨系統(tǒng)間的接口服務(wù)集成和協(xié)同。
整體思路,仍然是先進行跨系統(tǒng)交互流程建模,如下就是一個最簡單的模型:
我們完全可以采用流程設(shè)計和建模工具來完成上圖的流程模型,當然如果采用類似支持BPMN標準的流程建模工具還可以進一步完成類似含職能帶的跨系統(tǒng)交互流程圖。
在這個跨系統(tǒng)交互流程圖中,銜接各個業(yè)務(wù)系統(tǒng)的仍然是相互之間的接口和服務(wù),我們?nèi)匀皇前凑找粋€核心單據(jù)為基本元素來進行設(shè)計,比如項目編號,合同編號,采購訂單編號等。以這個編號來完成整個跨系統(tǒng)端到端流程的分析。
在建模的過程中,兩個系統(tǒng)間的連接線就是關(guān)鍵的服務(wù),但是由于不是直接的服務(wù)間的連接,因此仍然需要建立服務(wù)之間的關(guān)聯(lián)性。比如我們整體跨系統(tǒng)監(jiān)控都是以采購訂單號來進行跟蹤的話,我們就需要定義采購訂單這個元素在每一個接口服務(wù)中對應(yīng)的XML-Element的位置,以確保這些服務(wù)之間本身能夠關(guān)聯(lián)起來。
整體我們看到實現(xiàn)的思路和服務(wù)鏈監(jiān)控基本相同。
仍然是先根據(jù)業(yè)務(wù)關(guān)鍵字查詢功能,精確查詢出相關(guān)的服務(wù)實例數(shù)據(jù)。然后將服務(wù)實例數(shù)據(jù)映射到流程圖上面,形成流程圖實例。對于已經(jīng)成功運行的服務(wù)標注為綠色,對于接口調(diào)用失敗的服務(wù)標注為紅色,對于還沒有執(zhí)行到的服務(wù)標注為灰色。
同時更加有意義的事情是,我們完全可以用動畫效果模擬這個跨系統(tǒng)接口交互流程。即能夠動態(tài)的看到各個接口被觸發(fā)和調(diào)用的前后順序。同時看到前后接口觸發(fā)的大致時間間隔信息。通過這種實現(xiàn)能夠很方便我們實現(xiàn)圍繞核心業(yè)務(wù)對象的端到端流程監(jiān)控能力。
當然這是一種變通的端到端流程監(jiān)控實現(xiàn)思路,核心是先進行流程建模,然后再通過業(yè)務(wù)關(guān)鍵字檢索功能動態(tài)搜索匹配的服務(wù)日志調(diào)用數(shù)據(jù),再對流程圖進行實例化解析。由于采用了Solr全文檢索能力,這個比我們完全自頂向下的來進行端到端流程監(jiān)控實現(xiàn)更加高效。
從以服務(wù)為核心的監(jiān)控轉(zhuǎn)到以跨系統(tǒng)交互活動為核心,以實現(xiàn)了服務(wù)鏈監(jiān)控到端到端流程監(jiān)控的轉(zhuǎn)變。