使用VSCode+PlantUML+C4-Model快速畫架構(gòu)圖
關(guān)于C4-Model
最近在看C4-Model掸绞,它的理念很實(shí)用髓废,架構(gòu)圖要明確面向人群震缭,根據(jù)面向人群的不同嘶窄,產(chǎn)出四幅圖來描述一個(gè)系統(tǒng)或者一個(gè)架構(gòu)。System Context --> Container --> Component --> Code 四個(gè)層次脊僚。
具體每個(gè)層級的圖形用來描述什么相叁,可以參見這里:https://www.infoq.cn/article/C4-architecture-model
本文的關(guān)注點(diǎn)更小,不討論這些道的層面,而是描述怎么做钝荡,也就是術(shù)的層面街立。
安裝vscode
其實(shí)直接使用plantUML也可以,不過plantUML的界面比較簡陋埠通,功能也比較弱赎离,而vscode中有plantUML的插件,使用起來更順手端辱。
vscode的安裝很簡單梁剔,MAC下直接https://code.visualstudio.com/Download下載dmg文件安裝到Application即可。
安裝vscode的plantUML&Graphviz插件
plantUML是一款可以通過文字舞蔽、代碼畫UML圖的工具荣病,不需要考慮態(tài)度配色、位置等因素渗柿,方便快速个盆。而vscode上對應(yīng)的插件功能類似。
Graphviz是一款圖形化預(yù)覽插件朵栖,plantUML默認(rèn)只能渲染出時(shí)序圖颊亮,對于比較復(fù)雜的圖形,則需要Graphviz插件協(xié)助渲染陨溅。
直接在vscode的marketplace中搜索安裝终惑,如下所示:
PS: 運(yùn)行plantUML需要Java環(huán)境,請自行安裝jdk并配置環(huán)境變量门扇。
如果未安裝Graphviz雹有,在渲染的時(shí)候會報(bào)錯(cuò):
/opt/local/bin/dot File not exist.
配置C4-model對應(yīng)的snippets
vscode有工作區(qū)的概念,也就是一個(gè)工作目錄臼寄。通過File-->open... 打開一個(gè)目錄霸奕,就會默認(rèn)把這個(gè)目錄作為一個(gè)工作區(qū)。
在工作區(qū)中會默認(rèn)讀取當(dāng)前目錄下的一個(gè)隱藏子目錄 .vscode 來獲取當(dāng)前工作區(qū)的設(shè)置脯厨,在這里我們只自定義C4-Model的snippets(代碼片段)铅祸,用于輔助畫圖時(shí)語句編寫。
首先從github上拉取C4-PlantUML項(xiàng)目源碼合武,如下
git clone https://github.com/RicardoNiepel/C4-PlantUML
可以看到其代碼結(jié)構(gòu):
我們需要的snippets文件就在這里,直接復(fù)制這個(gè)目錄到工作區(qū)即可涡扼,比如我的工作區(qū):
實(shí)操畫圖
當(dāng)畫圖可以用代碼實(shí)現(xiàn)時(shí)稼跳,是不是覺得有點(diǎn)興奮,普通的UML圖形語法可以參考這里http://plantuml.com/zh/sitemap-language-specification
我這里只針對C4-Model來簡單介紹下吃沪。
常見元素
在C4-Model中有幾個(gè)元素汤善,都比較直觀:
Person:人員
System:系統(tǒng),包含DB、Application红淡、WebPage等
System_ext:外部系統(tǒng)
System_Boundary:系統(tǒng)邊界不狮,在這個(gè)邊界中的都是系統(tǒng)的組成部分,里面一般是Container級別的組件
Container:容器在旱,不是Docker之類的容器摇零,簡單點(diǎn)可以直接理解為System的組成部分,比如DB桶蝎、Application等
ContainerDb:DB
Container_Boundary:容器邊界驻仅,在這個(gè)邊界范圍內(nèi)的都是容器的組成部分,里面一般都是Component級別的數(shù)據(jù)
Component:組件登渣,比如一個(gè)Controller噪服,一個(gè)Service邏輯處理類,一個(gè)Domain等
Rel:連接線
還需要額外強(qiáng)調(diào)下胜茧,普通的畫圖工具粘优,文件后綴需要保存為.uml,而c4的呻顽,需要保存為.puml雹顺。先保存為對應(yīng)的后綴,snippets才會在后續(xù)的編寫過程中生效芬位。
還有一些特殊的代碼用來指定圖的模式--注意后面要加上():
LAYOUT_WITH_LEGEND()
在include之后加上這行代碼无拗,會在生成圖形的右下角生成如下內(nèi)容:
LAYOUT_AS_SKETCH()
加上這個(gè)表示草稿,整個(gè)渲染生成的圖形都是草稿樣式昧碉,如下:
LAYOUT_TOP_DOWN
排列方向英染,顧名思義為從上到下排列,注意不需要加括號
LAYOUT_LEFT_RIGHT
排列方向被饿,顧名思義為從左到右排列四康,注意不需要加括號
開始寫對應(yīng)的code
@startuml
!include /Users/alankim/gitspace/C4-PlantUML/C4_Container.puml
'LAYOUT_WITH_LEGEND()
LAYOUT_AS_SKETCH()
Person(user, "用戶")
System_Boundary(item, "商品相關(guān)"){
System(itemCenter, "商品中心", "")
System(priceCenter, "價(jià)格中心", "")
System(InventoryCenter,"銷售庫存","")
}
System_Ext(orderPlatform, "訂單平臺")
System_Ext(wmsStock,"wms庫存")
System_Ext(buy,"導(dǎo)購平臺")
Rel(wmsStock, InventoryCenter, "庫存上拋")
Rel(buy,itemCenter,"商品信息查詢")
Rel(user,orderPlatform,"提交訂單")
Rel(buy,priceCenter,"價(jià)格查詢")
Rel(orderPlatform,InventoryCenter,"扣減庫存")
Rel(InventoryCenter, itemCenter, "查詢商品sku")
Rel(priceCenter,itemCenter,"查詢商品sku")
Rel(user,buy,"用戶瀏覽")
@enduml
這個(gè)圖畫的比較復(fù)雜,基本上把大部分組件都用上了狭握,對應(yīng)生成的圖形如下:
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布闪金!