自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何用圖形分析來(lái)可視化微服務(wù)架構(gòu)

譯文
開(kāi)發(fā) 前端
本文將通過(guò)分析基于Spring Cloud的微服務(wù)系統(tǒng)、jQAssistant和Neo4j,與您討論如何用圖形技術(shù),來(lái)實(shí)現(xiàn)檢測(cè)反模式、可視化全系統(tǒng)、以及跨服務(wù)影響分析。

【51CTO.com快譯】您是否已在自己手頭的項(xiàng)目中使用到了微服務(wù)?在使用的過(guò)程中,您是否碰到過(guò)一些意料之外的問(wèn)題?本文將通過(guò)分析基于Spring Cloud的微服務(wù)系統(tǒng)、jQAssistant和Neo4j,與您討論如何用圖形技術(shù),來(lái)實(shí)現(xiàn)檢測(cè)反模式(antipattern)、可視化全系統(tǒng)、以及跨服務(wù)影響分析。

背景介紹

幾年前,我應(yīng)客戶要求用微服務(wù)來(lái)重寫(xiě)他們的IT系統(tǒng)??墒堑搅碎_(kāi)發(fā)的末期,我們碰到了代碼缺陷、未能回歸等問(wèn)題。雖然現(xiàn)場(chǎng)團(tuán)隊(duì)進(jìn)行了反復(fù)審查,也召開(kāi)了重構(gòu)會(huì)議,但是由于系統(tǒng)相當(dāng)龐大(生產(chǎn)環(huán)境中的微服務(wù)超過(guò)了13個(gè)),實(shí)在難以調(diào)整,而且收效甚微,因此最終產(chǎn)品的質(zhì)量遠(yuǎn)未達(dá)到他們的期望。

可見(jiàn),人們往往會(huì)低估從傳統(tǒng)方法轉(zhuǎn)換為微服務(wù)架構(gòu)的難度,特別是當(dāng)生產(chǎn)環(huán)境中有成千上萬(wàn)行代碼時(shí),人們時(shí)常無(wú)法對(duì)目標(biāo)系統(tǒng)擁有清晰的認(rèn)識(shí),未能確定待執(zhí)行任務(wù)的優(yōu)先級(jí),直到出現(xiàn)問(wèn)題時(shí)已為時(shí)已晚。

使用圖形分析來(lái)識(shí)別問(wèn)題并修復(fù)微服務(wù)架構(gòu)

經(jīng)過(guò)研究,我發(fā)現(xiàn)了一個(gè)非常實(shí)用的工具—jQAssistant。它能夠幫助我將代碼、軟件架構(gòu)、及其附帶的所有規(guī)則,都轉(zhuǎn)換成為Neo4j中的圖形。

我發(fā)現(xiàn)圖形的轉(zhuǎn)換將有助于:檢測(cè)反模式,進(jìn)行影響分析,改善數(shù)據(jù)治理,以及促進(jìn)團(tuán)隊(duì)之間的溝通等方面。下面,我們將通過(guò)分析一個(gè)具體應(yīng)用示例,來(lái)詳細(xì)討論圖形化轉(zhuǎn)換的過(guò)程。

一個(gè)應(yīng)用示例

在此,我們將使用經(jīng)典的Piggy Metrics項(xiàng)目。它是由Spring Boot和Spring Cloud開(kāi)發(fā),基于MongoDB數(shù)據(jù)庫(kù)的個(gè)人記賬式微服務(wù)應(yīng)用。

該應(yīng)用程序的圖形轉(zhuǎn)換相對(duì)比較簡(jiǎn)單。如上圖所示,我們只需準(zhǔn)備構(gòu)建應(yīng)用所需的JAR文件,然后通過(guò)命令行將JAR文件提供給jQAssistant即可。幾秒鐘之后,您將會(huì)獲得對(duì)應(yīng)的簡(jiǎn)單圖形。

如上圖代碼段所述,來(lái)自Piggy Metrics應(yīng)用的類–UserController是一個(gè)標(biāo)準(zhǔn)的Spring RestController。它定義了兩個(gè)名為getUser和createUser的方法。兩者都帶有綠色的@RequestMapping注釋。在這些注釋中,我們可以找到與各個(gè)NPC相映射的HTTP動(dòng)詞。最后則是名為userService的調(diào)用。下圖便是該controller所對(duì)應(yīng)的圖形。

由圖可見(jiàn),代碼的不同部分會(huì)被通過(guò)各種節(jié)點(diǎn)與關(guān)系來(lái)表示。例如:在左側(cè),紅色的節(jié)點(diǎn)表示JAR文件,它通過(guò)CONTAINS關(guān)系鏈接到藍(lán)色UserController類。而UserController類本身會(huì)鏈接到getUser和createUser方法,以便進(jìn)一步調(diào)用其他方法。當(dāng)然,我們?cè)谇懊娲a中看到的注釋、請(qǐng)求映射、以及參數(shù)等,都會(huì)以綠色顯示在圖形中。據(jù)此,我們將能夠輕松地檢查代碼、類或模塊之間的循環(huán)依賴關(guān)系,命名約定的遵循,以及測(cè)試是否覆蓋了特定代碼等架構(gòu)規(guī)則。

松耦合的微服務(wù)

許多人認(rèn)為:松散耦合的微服務(wù)是通過(guò)HTTP、異步協(xié)議、以及消息協(xié)議進(jìn)行通信的,而此類通信并不能反映到字節(jié)碼上。我們卻需要在此基礎(chǔ)上使用圖形來(lái)表示代碼。也就是說(shuō),除了語(yǔ)言和框架,我們還會(huì)在應(yīng)用中通過(guò)軟件架構(gòu),這一更高層次的概念,來(lái)表示API、以及不同的工程實(shí)踐。

下面讓我們回到上面的UserController例子。由于采用了Spring框架,因此我們可以遍歷圖形,以使用各種正確的注釋來(lái)標(biāo)識(shí)出方法,進(jìn)而關(guān)聯(lián)映射到一些HTTP動(dòng)詞上。

上圖展示了一個(gè)Cypher查詢。通過(guò)瀏覽帶有@RequestMapping注解的方法,HTTP信息被輸入到了圖中。端點(diǎn)(Endpoint)作為一個(gè)新的概念被引入到了圖中。圖中左側(cè)藍(lán)色的代碼行,能夠以指令的形式,將endpoint標(biāo)簽添加到發(fā)現(xiàn)的內(nèi)容中,并將HTTP映射信息,添加到那些作為REST端點(diǎn)被公開(kāi)的已知方法節(jié)點(diǎn)上。在此,我們定義了一些淺藍(lán)色的REST端點(diǎn)。它們能夠與前文提到的getUser和createUser兩種方法,及其不同的路徑相匹配。

參照端點(diǎn)定義的方式,我們還可以定義HTTP客戶端的相關(guān)概念。例如:由于Piggy Metrics應(yīng)用采用了Feign庫(kù)在兩項(xiàng)服務(wù)之間進(jìn)行HTTP調(diào)用,因此我們可以使用它來(lái)遍歷圖形,并通過(guò)查找FeignClient注釋、及其相關(guān)信息,來(lái)創(chuàng)建新的概念。

就像公開(kāi)某些REST端點(diǎn)的控制器一樣,我們制作了如上圖所說(shuō)的HTTP客戶端。它通過(guò)HTTP動(dòng)詞來(lái)調(diào)用URL。也就是說(shuō),我們可以將帶有URL信息的FeignClient標(biāo)簽作為新的概念添加到圖形中。

一旦確定了HTTP客戶端和REST端點(diǎn),我們就可以根據(jù)這些新的概念,輕松地將它們連接到各種匹配的HTTP方法,及其用到的URL上。例如,在如下代碼圖中,我們通過(guò)被稱為INVOKES_REMOTE的關(guān)系,在圖中展示該過(guò)程。

由于服務(wù)是松散耦合的,因此,我們可以確定跨服務(wù)的依賴關(guān)系,讓這些松耦合能夠在圖中變得顯而易見(jiàn)。從下圖可視化的內(nèi)容中,我們能夠清晰地查看到四項(xiàng)服務(wù),以及它們之間的相互調(diào)用。

據(jù)此,我們可以找到其中可能存在的反模式,例如那些導(dǎo)致“雞生蛋、雞生蛋”的服務(wù)間循環(huán)問(wèn)題。當(dāng)然,我們也可以通過(guò)采取影響分析,以確定諸如修改端點(diǎn)的難度等方面的問(wèn)題。

微服務(wù)還是分布式整體?

通過(guò)圖表分析,我們也可以查看微服務(wù)是否遵循了最佳實(shí)踐,進(jìn)而提高服務(wù)實(shí)現(xiàn)的成熟度。如下圖例子所示:

數(shù)據(jù)治理

在前面的Piggy Metrics應(yīng)用中,我們通過(guò)MongoDB和Spring Data,不但可以輕松地定義持久性實(shí)體的概念,而且能夠檢查跨服務(wù)的MongoDB集合的使用情況。下圖展示了我們查詢到的該帳戶集合被兩個(gè)不同的服務(wù)所調(diào)用的情況。

根據(jù)這兩個(gè)服務(wù)之間的隔離情況,我們判斷應(yīng)當(dāng)合并它們。當(dāng)然,我們還能夠發(fā)現(xiàn)更多同一個(gè)數(shù)據(jù)庫(kù)同時(shí)在多個(gè)位置被管理的情況。據(jù)此,我們也可以定義哪個(gè)數(shù)據(jù)存儲(chǔ)庫(kù)的更改,會(huì)直接或間接地影響到哪些端點(diǎn)。

如上面的數(shù)據(jù)表所示,底部的“UserRepository”被遠(yuǎn)程服務(wù)間接地使用著。如果想更改它,我們需要檢查遠(yuǎn)程服務(wù)可能受到的影響。而這些是僅靠查看存儲(chǔ)庫(kù)的相關(guān)代碼、或單個(gè)服務(wù),所無(wú)法獲悉的。

通過(guò)前文提到的jQAssistant,我們可以針對(duì)JDBC去掃描數(shù)據(jù)庫(kù)中的元數(shù)據(jù),并將該數(shù)據(jù)庫(kù)的結(jié)構(gòu)映射到圖形中。據(jù)此,我們進(jìn)而可以對(duì)MongoDB采取更高級(jí)的影響分析,或針對(duì)驗(yàn)證進(jìn)行數(shù)據(jù)列級(jí)別的分析。也就是說(shuō),如果我們想更改某個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)格式、或者是列的長(zhǎng)度,那么就需要識(shí)別與該列相關(guān)的所有對(duì)象。

文檔是否最新?

微服務(wù)領(lǐng)域的另一個(gè)最佳實(shí)踐是:事先采用契約優(yōu)先(contract-first)的方法,即:先定義API規(guī)范,然后予以實(shí)施。例如,我們可以先選用目前行業(yè)標(biāo)準(zhǔn)化的OpenAPI規(guī)范,然后使用YAML文件來(lái)編寫(xiě)API契約。不過(guò),您可能遇到的問(wèn)題是:如何知曉自己實(shí)施的規(guī)范或文檔是否為最新呢?

如上圖所示,我們可以通過(guò)掃描YAML文件,在文件內(nèi)容中找到OpenAPI的相關(guān)描述。也就是說(shuō),通過(guò)遍歷所有的YAML文件,我們查找名為OpenAPI的密鑰,以檢查每個(gè)服務(wù)是否包含了至少一個(gè)規(guī)范文件。而且,這是一種快速檢索文檔缺失的方法。

此外,就文檔本身而言,我們甚至可以進(jìn)一步深入地了解文檔的具體內(nèi)容。例如,我們既可以從中提取參數(shù)名稱與類型,又可以使用Spring controller執(zhí)行相同的操作,并將兩者的實(shí)際檢測(cè)差距進(jìn)行比較。

如下圖所示,通過(guò)查詢,我們很快發(fā)現(xiàn)到某項(xiàng)服務(wù)缺少對(duì)應(yīng)的文檔。即:在三個(gè)端點(diǎn)中,只有兩個(gè)端點(diǎn)擁有實(shí)際文檔。此外,我們還能深入地“挖掘”API參數(shù),及其參數(shù)類型。

魯棒性

魯棒性是非常重要的方面,它能夠應(yīng)對(duì)生產(chǎn)環(huán)境中的故障,以免整個(gè)系統(tǒng)的崩潰。通常,我們可以采用諸如斷路器(circuit breakers)和響應(yīng)回退(response fallbacks)之類的主流機(jī)制,以避免讓故障影響到上層服務(wù)。

為了檢查所有端點(diǎn)、或HTTP客戶端是否已實(shí)施了正確的回退,我們可以使用上述簡(jiǎn)單的查詢,通過(guò)遍歷FeignClient注釋,來(lái)查看它們是否具有聲明為fallback的屬性。如上圖所示,在Piggy Metric示例中,我們發(fā)現(xiàn)服務(wù)中缺少了兩個(gè)fallbacks。

信息共享

為了共享,我們往往需要?jiǎng)?chuàng)建一個(gè)可視化的文件。而擁有開(kāi)放式圖形數(shù)據(jù)庫(kù)的優(yōu)勢(shì)就在于:您可以有選擇地將圖形導(dǎo)出為GraphML文件,進(jìn)而采用yEd之類的工具將GraphML文件導(dǎo)出為可視化的數(shù)據(jù)。而且,在yEd中,您可以自定義樣式與布局,以滿足大量元素的實(shí)際需求。

如下圖所示,您可以導(dǎo)出許多不同形狀的架構(gòu)數(shù)據(jù)。作為服務(wù)之間依賴關(guān)系的簡(jiǎn)單示例,我們既可以通過(guò)對(duì)其進(jìn)行更改,以提供所需的內(nèi)容,又可以導(dǎo)出為實(shí)用的dock可視化。

可見(jiàn),此類可視化轉(zhuǎn)換對(duì)于開(kāi)發(fā)者團(tuán)隊(duì)和架構(gòu)師之間的交流,產(chǎn)品所有者與項(xiàng)目經(jīng)理之間的對(duì)話,以及讓他們更好地了解需要完成的工作,都是非常實(shí)用的。為了讓您對(duì)系統(tǒng)的圖形化有個(gè)整體的印象,下圖展示了一個(gè)真實(shí)的應(yīng)用示例。

值得一提的是,如果不借助工具,我們很難用手動(dòng)完成此類圖形的構(gòu)建。何況我們的系統(tǒng)往往也是動(dòng)態(tài)發(fā)展的。

更多實(shí)用場(chǎng)景

上述示例可能過(guò)于簡(jiǎn)單。在實(shí)際應(yīng)用中,圖形分析還可以被運(yùn)用到更多的實(shí)際場(chǎng)景中。例如,我們可以通過(guò)依賴項(xiàng)分析,更深入地研究安全性問(wèn)題,進(jìn)而通過(guò)尋找端點(diǎn)上的注釋予以安全加固。此外,我們可以通過(guò)導(dǎo)入運(yùn)行時(shí)(runtime)的數(shù)據(jù),以獲悉某個(gè)API每天被調(diào)用的次數(shù),進(jìn)而為該API重要性分配權(quán)值。當(dāng)然,我們也可以從版本控制系統(tǒng)中導(dǎo)入數(shù)據(jù),以便根據(jù)源代碼的依賴性,對(duì)修改進(jìn)行優(yōu)先級(jí)排序。顯然,那些被鮮少修改的服務(wù),就意味著它基本能夠正常工作,我們也就不必過(guò)于關(guān)注了。

總的說(shuō)來(lái),您可以根據(jù)自己當(dāng)前的需求與架構(gòu),使用基礎(chǔ)的源代碼,來(lái)構(gòu)建能夠反映更高級(jí)別概念的圖形。據(jù)此,您可以獲悉有關(guān)目標(biāo)系統(tǒng)的實(shí)時(shí)最新?tīng)顩r,檢查它與初始計(jì)劃方案的匹配度,進(jìn)而對(duì)實(shí)際架構(gòu)規(guī)則進(jìn)行及時(shí)改進(jìn)。

原文標(biāo)題:Fixing Your Microservices Architecture Using Graph Analysis,作者: Nicolas Mervaillie

【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】

 

責(zé)任編輯:華軒 來(lái)源: 51CTO
相關(guān)推薦

2021-09-23 17:10:48

Python可視化漏斗圖

2017-07-10 14:18:34

微服務(wù)架構(gòu)可視化

2021-01-12 09:38:02

微服務(wù)服務(wù)組合編排

2020-03-11 14:39:26

數(shù)據(jù)可視化地圖可視化地理信息

2014-06-30 09:24:48

數(shù)據(jù)可視化

2017-06-19 08:30:35

大數(shù)據(jù)數(shù)據(jù)可視化報(bào)表

2022-08-18 11:36:16

可視化JavaScript事件循環(huán)

2021-02-01 22:01:57

Coco工具macOS

2017-02-07 15:54:14

數(shù)據(jù)可視化數(shù)據(jù)分析

2022-07-10 21:17:01

GitTigLinux

2017-10-14 13:54:26

數(shù)據(jù)可視化數(shù)據(jù)信息可視化

2022-08-26 09:15:58

Python可視化plotly

2009-04-21 14:26:41

可視化監(jiān)控IT管理摩卡

2021-10-11 08:04:22

Python數(shù)據(jù)行程

2016-11-25 11:16:22

阿里支付寶數(shù)據(jù)分析

2024-12-13 15:36:27

命令行CLI數(shù)據(jù)可視化

2015-08-19 09:35:09

可視化

2020-06-29 15:40:53

PlotlyPython數(shù)據(jù)可視化

2011-06-13 18:54:12

2016-12-29 20:05:56

數(shù)據(jù)可視化大數(shù)據(jù)產(chǎn)品分析
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)