[译]使用DOT语言和GraphvizOnline来可视化你的ASP.NETCore3.0终结点01
這是系列文章中的第一篇:使用GraphvizOnline可視化ASP.NETCore3.0終結(jié)點(diǎn)。.
第1部分-使用DOT語(yǔ)言來(lái)可視化你的ASP.NETCore3.0終結(jié)點(diǎn)(本文)
第2部分-向ASP.NET Core應(yīng)用程序添加終節(jié)點(diǎn)圖
第3部分-使用ImpromptuInterface創(chuàng)建一個(gè)自定義的DfaGraphWriter,以便于反射
作者:依樂(lè)祝
原文:https://andrewlock.net/visualizing-asp-net-core-endpoints-using-graphvizonline-and-the-dot-language/
譯文:https://www.cnblogs.com/yilezhu/p/13301981.html
在這篇文章中,我將展示如何在ASP.NETCore3.0應(yīng)用程序中使用GraphvizOnline服務(wù)。這使您可以創(chuàng)建如下所示的圖表,這些圖表描述了應(yīng)用程序中的所有端點(diǎn):
用GraphvizOnline和DOT語(yǔ)言繪制圖形
GraphvizOnline是一個(gè)GitHub上的開源項(xiàng)目,它為DOT圖形描述語(yǔ)言?提供了一個(gè)在線可視化工具。這是一種簡(jiǎn)單的語(yǔ)言,它允許您定義各種類型的圖形,它將節(jié)點(diǎn)與邊連接起來(lái)。
例如,一個(gè)基本的無(wú)向圖可以定義為
graph MyGraph {a -- b -- c;b -- d; }它描述了以下圖表:
每個(gè)節(jié)點(diǎn)都有一個(gè)名稱(a,?b,?c,?d),并且--定義節(jié)點(diǎn)之間的邊緣。邊定義節(jié)點(diǎn)之間的連接,但它們沒(méi)有方向(因此名稱,無(wú)向【undirected】).
當(dāng)然,你也可以定義一個(gè)有向圖,其中邊是有方向的。對(duì)于有向邊,使用->而不是--。例如:
digraph MyGraph {a -> b -> c;d -> b; }它描述了以下圖表:
您可以自定義節(jié)點(diǎn)和邊緣以多種方式顯示的方式。例如,可以標(biāo)記節(jié)點(diǎn)和邊緣:
digraph MySimpleGraph {// The label attribute can be used to change the label of a node...a [label="Foo"];b [label="Bar"];// ... or an edgea -> b [label="Baz"]; }你可以使用DOT圖形描述語(yǔ)言做更多的事情,這正是我們現(xiàn)在所需要的。那么,這如何應(yīng)用于ASP.NET Core應(yīng)用程序呢?
使用有向圖來(lái)可視化ASP.NET Core終結(jié)點(diǎn)
ASP.NETCore中的終結(jié)點(diǎn)路由系統(tǒng)通過(guò)創(chuàng)建端點(diǎn)URL段的有向圖來(lái)有效地工作。然后將傳入的請(qǐng)求與圖進(jìn)行匹配(一次一個(gè)段),以確定要執(zhí)行的終結(jié)點(diǎn)。
例如,以下簡(jiǎn)單有向圖表示ASP.NET Core3.0 RazorPages 默認(rèn)應(yīng)用程序模板中的終結(jié)點(diǎn)(dotnet new webapp),其中包含三個(gè)Razor頁(yè)面:Index.cshtml,?Error.cshtml和Privacy.cshtml:
digraph DFA {1 [label="/Error/"]2 [label="/Index/"]3 [label="/Privacy/"]4 -> 1 [label="/Error"]4 -> 2 [label="/Index"]4 -> 3 [label="/Privacy"]4 [label="/"] }其中描述為如下圖表:
.
在上面的DOT文件中,節(jié)點(diǎn)被賦予順序的整數(shù)名,1,?2,?3等,并使用端點(diǎn)名稱進(jìn)行標(biāo)記。這是ASP.NET Core用于表示終結(jié)點(diǎn)圖的格式。
對(duì)于Razor頁(yè)面,路由非常簡(jiǎn)單,所以圖非常明顯。ASP.NET Core WebAPI應(yīng)用程序生成了一個(gè)更有趣的圖表。例如,下面顯示的ASP.NET Core 2.0默認(rèn)模板中包含的ValuesController。它使用多個(gè)HTTP謂詞,以及稍微復(fù)雜的URL結(jié)構(gòu):
[Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase {// GET api/values[HttpGet]public ActionResult<IEnumerable<string>> Get() => new string[] { "value1", "value2" };// GET api/values/5[HttpGet("{id}")]public ActionResult<string> Get(int id) => "value";// POST api/values[HttpPost]public void Post([FromBody] string value) { }// PUT api/values/5[HttpPut("{id}")]public void Put(int id, [FromBody] string value) { }// DELETE api/values/5[HttpDelete("{id}")]public void Delete(int id) { } }為了更好地度量,我還添加了一個(gè)基本的健康檢查端點(diǎn)。UseEndpoints():
app.UseEndpoints(endpoints => {endpoints.MapHealthChecks("/healthz");endpoints.MapControllers(); });此應(yīng)用程序生成以下圖表:
digraph DFA {1 [label="/healthz/"]2 [label="/api/Values/{...}/ HTTP: GET"]3 [label="/api/Values/{...}/ HTTP: PUT"]4 [label="/api/Values/{...}/ HTTP: DELETE"]5 [label="/api/Values/{...}/ HTTP: *"]6 -> 2 [label="HTTP: GET"]6 -> 3 [label="HTTP: PUT"]6 -> 4 [label="HTTP: DELETE"]6 -> 5 [label="HTTP: *"]6 [label="/api/Values/{...}/"]7 [label="/api/Values/ HTTP: GET"]8 [label="/api/Values/ HTTP: POST"]9 [label="/api/Values/ HTTP: *"]10 -> 6 [label="/*"]10 -> 7 [label="HTTP: GET"]10 -> 8 [label="HTTP: POST"]10 -> 9 [label="HTTP: *"]10 [label="/api/Values/"]11 -> 10 [label="/Values"]11 [label="/api/"]12 -> 1 [label="/healthz"]12 -> 11 [label="/api"]12 [label="/"] }表現(xiàn)為如下圖表:
在這個(gè)圖中還有很多事情要做,因?yàn)槲覀儸F(xiàn)在有了可變的路由參數(shù)值(路由模板中的{id},在圖中顯示為{...})和HTTP動(dòng)詞約束(GET/PUT/POST等等)
當(dāng)我第一次看到這個(gè)圖表時(shí),我很難理解它。每個(gè)節(jié)點(diǎn)都是終結(jié)點(diǎn)嗎?當(dāng)然不是,如/api/不應(yīng)該產(chǎn)生響應(yīng)。那這個(gè)呢?至于HTTP: *端點(diǎn)呢,它們會(huì)產(chǎn)生響應(yīng)嗎?
為了進(jìn)一步了解,我查閱了可以生成這些圖的ASP.NET Core中的代碼,但它有點(diǎn)復(fù)雜,不幸的是,由于大量使用internal類。我將在稍后的文章中探討這些代碼。
為了更好地理解端點(diǎn)圖,我們需要了解并非所有的節(jié)點(diǎn)都是相同的。在下一節(jié)中,我們將深入研究這個(gè)簡(jiǎn)單圖中的不同類型的節(jié)點(diǎn),然后研究一個(gè)更好的圖形表示(至少在我看來(lái)!)
了解不同類型的節(jié)點(diǎn)。
圖中的每個(gè)節(jié)點(diǎn)都與給定的“深度”相關(guān)聯(lián)。這是應(yīng)該已經(jīng)匹配的URL段數(shù)。例如,/api/Values/節(jié)點(diǎn)的深度為2-它要求空段/和/api段已經(jīng)匹配。
當(dāng)請(qǐng)求到達(dá)EndpointRoutingMiddleware(由UseRouting()添加)時(shí),將傳入的請(qǐng)求URL與此圖進(jìn)行比較。試圖從樹梢的根節(jié)點(diǎn)開始,通過(guò)圖表找到一條路徑。URL段與圖中的邊進(jìn)行增量匹配,并在圖中遍歷一條路徑,直到整個(gè)請(qǐng)求URL匹配為止。
每個(gè)節(jié)點(diǎn)(由在ASP.NET Core中的DfaNode中)有幾個(gè)屬性。我們目前感興趣的屬性是:
Matches*這是與該節(jié)點(diǎn)相關(guān)聯(lián)的Endpoint(S)。如果通過(guò)路由匹配此節(jié)點(diǎn),則這是將被選擇用于執(zhí)行的Endpoint。
Literals這些是連接節(jié)點(diǎn)的邊緣。如果DfaNode有Literals,它具有可以進(jìn)一步遍歷以到達(dá)其他節(jié)點(diǎn)的文字段。例如,/api/節(jié)點(diǎn)包含一個(gè)有/Values值的Literal,則指向/api/Values節(jié)點(diǎn)。
PolicyEdges這些邊緣是基于URL以外的約束進(jìn)行匹配的。例如,圖中基于動(dòng)詞的邊,如HTTP: GET,是策略的邊緣,指的是不同的DfaNode.
Parameters如果節(jié)點(diǎn)具有支持路由參數(shù)的邊緣(例如,{id}),?Parameters指向處理匹配參數(shù)的節(jié)點(diǎn)。這在圖中是用/*邊表示的。.
還有一個(gè)附加的屬性,CatchAll,這在某些圖形中是相關(guān)的,但我現(xiàn)在將忽略它,因?yàn)槲覀兊腁PI圖并不需要它。
基于這些特性,我們可以通過(guò)使用DOT語(yǔ)言的其他特性,如形狀、顏色、線型和箭頭:
上圖中添加了以下內(nèi)容:
沒(méi)有任何關(guān)聯(lián)的節(jié)點(diǎn)Endpoint都以默認(rèn)樣式顯示,即黑色氣泡。
有Matches的顯示為填充的棕色盒子。這些節(jié)點(diǎn)具有Endpoint,這可以產(chǎn)生響應(yīng)。對(duì)于上面的API示例,這適用于已選擇謂詞的節(jié)點(diǎn)以及健康檢查端點(diǎn)。
文字段邊緣顯示為默認(rèn)的黑色邊緣,帶有一個(gè)填充箭頭。
Parameters邊緣(/*)以藍(lán)色顯示,使用菱形箭頭。
PolicyEdges以紅色顯示,帶有虛線和空三角形箭頭。
現(xiàn)在,我承認(rèn)我的設(shè)計(jì)技巧很爛,但是我認(rèn)為您可以同意這個(gè)圖表顯示的信息比默認(rèn)的要多!????--這是生成上面的圖形的定義,請(qǐng)記住,您可以使用在線編輯來(lái)可視化和播放顯示。
digraph DFA {1 [label="/healthz/" shape=box style=filled color="brown" fontcolor="white"]2 [label="/api/Values/{...}/ HTTP: GET" shape=box style=filled color="brown" fontcolor="white"]3 [label="/api/Values/{...}/ HTTP: PUT" shape=box style=filled color="brown" fontcolor="white"]4 [label="/api/Values/{...}/ HTTP: DELETE" shape=box style=filled color="brown" fontcolor="white"]5 [label="/api/Values/{...}/ HTTP: *" shape=box style=filled color="brown" fontcolor="white"]6 -> 2 [label="HTTP: GET" color="red" style=dashed arrowhead=open]6 -> 3 [label="HTTP: PUT" color="red" style=dashed arrowhead=open]6 -> 4 [label="HTTP: DELETE" color="red" style=dashed arrowhead=open]6 -> 5 [label="HTTP: *" color="red" style=dashed arrowhead=open]6 [label="/api/Values/{...}/"]7 [label="/api/Values/ HTTP: GET" shape=box style=filled color="brown" fontcolor="white"]8 [label="/api/Values/ HTTP: POST" shape=box style=filled color="brown" fontcolor="white"]9 [label="/api/Values/ HTTP: *" shape=box style=filled color="brown" fontcolor="white"]10 -> 6 [label="/*" arrowhead=diamond color="blue"]10 -> 7 [label="HTTP: GET" color="red" style=dashed arrowhead=open]10 -> 8 [label="HTTP: POST" color="red" style=dashed arrowhead=open]10 -> 9 [label="HTTP: *" color="red" style=dashed arrowhead=open]10 [label="/api/Values/"]11 -> 10 [label="/Values"]11 [label="/api/"]12 -> 1 [label="/healthz"]12 -> 11 [label="/api"]12 [label="/"] }注意"HTTP: *"節(jié)點(diǎn)與端點(diǎn)關(guān)聯(lián),即使您可能不期望它,因?yàn)樗鼈兎祷?05 Method Not Allowed.
在下一篇文章中,我將展示如何自動(dòng)為自己的ASP.NET Core應(yīng)用程序生成端點(diǎn)圖。
總結(jié)
在這篇文章中,我介紹了用于描述圖形的DOT語(yǔ)言,并展示了如何使用在線編輯從圖表中創(chuàng)建圖像。然后,我展示了如何將ASP.NETCore 3.x應(yīng)用程序中的端點(diǎn)路由表示為有向圖。我描述了端點(diǎn)圖中不同節(jié)點(diǎn)和邊緣之間的差異,并調(diào)整了圖形的顯示以更好地表示這些差異。在后面的文章中,我將展示如何為應(yīng)用程序生成自己的端點(diǎn)圖,如何自定義顯示,以及如何做的不僅僅是查看圖形。
往期精彩回顧
【推薦】.NET Core開發(fā)實(shí)戰(zhàn)視頻課程?★★★
.NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門篇-開篇及總體規(guī)劃
【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開篇及目錄索引
Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)
.NET Core中的一個(gè)接口多種實(shí)現(xiàn)的依賴注入與動(dòng)態(tài)選擇看這篇就夠了
10個(gè)小技巧助您寫出高性能的ASP.NET Core代碼
用abp vNext快速開發(fā)Quartz.NET定時(shí)任務(wù)管理界面
在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度
現(xiàn)身說(shuō)法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化
關(guān)于C#異步編程你應(yīng)該了解的幾點(diǎn)建議
C#異步編程看這篇就夠了
給我好看 您看此文用??·?秒,轉(zhuǎn)發(fā)只需1秒呦~ 好看你就點(diǎn)點(diǎn)我 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的[译]使用DOT语言和GraphvizOnline来可视化你的ASP.NETCore3.0终结点01的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Ids4实战】最全的 v4 版本升级指
- 下一篇: .NET Core CLI 的性能诊断工