1. 程式人生 > 程式設計 >plantuml-繪製狀態圖和活動圖和部署圖

plantuml-繪製狀態圖和活動圖和部署圖

背景

狀態圖:物件的所有狀態,以及基於事件發生的狀態改變的過程;

活動圖:用例的工作流程;

部署圖:系統的軟硬體物理體系結構;

狀態圖

基本語法

元素 語法 說明
開始和結束狀態 [*] 標識開始和結束狀態
箭頭 --> 新增箭頭
隱藏描述區域 hide empty description 隱藏描述區域
合成狀態 state 合成狀態名字{ 增城的狀態定義語法} 可以巢狀狀態圖
狀態宣告 state 狀態名字 : 備註 宣告狀態
fork,join state state名字 分開,合併狀態
併發狀態 -- or 或者雙豎線 狀態是併發改變的
箭頭方向 top down left right 可以控制箭頭的方向
單行註釋 note 方位 of 狀態名 : 單行註釋 單行註釋
多行註釋 note 方位 of 狀態名 換行 單行註釋 換行 end note
多行註釋

登入狀態圖

@startuml
hide empty description
left to right direction

[*]-->NotLogin:首次開啟app

state  NotLogin: 沒有登入
state  LoginSuccess: 登入成功
state  LoginFail: 登入失敗

NotLogin -->LoginSuccess: 登入
NotLogin -->LoginFail:登入

state LoginFail {
    state 使用者不存在: ta校驗
    state saas註冊失敗:註冊saas
    state 登記使用者資訊失敗: 登記到tiananUser
    state 引數校驗失敗 :校驗引數
}

state join_state  <<join>>
LoginSuccess-->join_state:組裝響應引數
LoginFail-->join_state:組裝響應引數

join_state -->[*]:返回JSON資料到客戶端

@enduml複製程式碼

file

積分狀態圖

@startuml
scale 350 width
left to right direction
hide empty description

state noPointRecord : 沒有積分記錄
state pointZero : 積分為0
state pointOk : 有積分


[*] -->  noPointRecord: 增加積分
noPointRecord --> pointZero: 初始化
pointZero --> pointOk: 增加/消耗積分

pointOk --> [*]

@enduml複製程式碼

file

活動圖

基本語法

元素 語法 說明
開始 結束 start stop 開始結束活動
活動 :活動名稱; 定義活動
條件語句 if (條件 ?) then (yes) 換行 下一個活動 else(no) endif 條件分支
迴圈語句 repeat 換行 活動 換行 repeatwhile(條件 ?) 先執行再判斷
迴圈語句 while ( 成立的條件?) 換行 活動 換行 endwhile(不成立的條件描敘) 先判斷條件在迴圈
改變活動的形狀 :活動> 分別得到不同的形狀
並行處理 fork fork again end fork 並行處理
組合 partition group名稱 { 活動圖語法} 對活動進行分組
泳道 兩根豎線包圍 泳道
分離 detach 移除箭頭

登入活動圖

@startuml
header 登入介面活動圖
footer 登入介面活動圖
|tomcat|
start
:引數校驗]

if (引數校驗通過 ?) then (yes)
elseif (字串為空) then (no)
stop
else (其它校驗錯誤)
    stop
endif

|TA服務端|
:使用者code遠端校驗;
|LX Saas|
:saas註冊登入;
|mysql|
:登記到saasUser;
|redis|
:儲存令牌到Redis;
|tomcat|
:組裝響應引數;
stop

@enduml複製程式碼

file

增加積分活動圖

@startuml

header 改變使用者積分介面活動圖
footer 改變使用者積分介面活動圖

|tomcat|
start 


:登入態檢查;

if(令牌非法 ?) then (yes)
:返回未登入;
stop
else (合法)
endif

:接受引數,point,event ;

if(引數檢查 ?) then(合法)
else(非法)
:返回引數錯誤;
stop
endif

|mysql|
:插入積分增加詳細紀錄;
|tomcat|
:得到記錄Id;
|redis|
:按照userId查詢得到使用者積分的表記錄Id;
|tomcat|

if(記錄id不存在 ?)then(yes)
|mysql|
:插入使用者的積分記錄得到id;
:更新使用者的總積分;

else(id存在)
:更新使用者的總積分;

endif

|redis|
:刪除使用者總積分的快取;
:刪除使用者積分總條數的快取;
:刪除使用者積分明細分頁記錄的快取;

|tomcat|
:得到明細記錄的id,返回;

:返回客戶端;

stop

@enduml複製程式碼

file

查詢積分活動圖

@startuml

|tomcat|
start

#gold:接受引數,pageNum,pageSize|

:引數校驗;
if (引數校驗通過 ?) then(通過)
else (不通過)
#red:報錯 401 X 引數校驗不通過;
stop
endif

|redis|
:從Redis快取中查詢得到記錄的總數]
|tomcat|
if(總數不存在)then (不存在)
|mysql|
    :從資料庫中查詢得到積分詳細紀錄的總數;
    |redis|
    :設定到redis快取中;
else

endif

|tomcat|
:得到紀錄的總條數;


if(總數是否大於0 ?)then
    -[#red]->總數大於0;
    fork
        |redis|
        :從Redis快取分頁查詢得到列表;
        |tomcat|
        if (redis中獲取不到資料 ?) then( 獲取不到)
            |mysql|
            :從資料庫中獲取得到列表;
            |redis|
            :設定到redis快取中;
        else (獲取到了)
        endif
        |tomcat|
        :得到分頁查詢的列表;
    fork again
        |redis|
        :從Redis快取中查詢得到使用者總積分;
        |tomcat|
        if (redis中獲取不到資料 ?) then( 獲取不到)
            |mysql|
           :從資料庫中獲取得到使用者總積分;
           |redis|
           :設定到redis快取中;
        else (獲取到了)
        endif
        |tomcat|
        :得到使用者總積分;
    end fork
else
    |tomcat|
    -[#green]->總數等於0;
    #green:分頁列表為空;
    #green:總積分為0;
endif

|tomcat|
:組裝響應引數\n分頁列表資料\n使用者總積分;
stop;



@enduml複製程式碼

file

部署圖

部署圖顯示了系統的硬體和安裝在硬體上的軟體,以及用於連線異構計算機之間的中介軟體。部署圖通常被認為是一個網路圖或者物理架構圖。

語法

系統部署圖

@startuml

header TA專案物理架構圖
footer TA專案物理架構圖

left to right direction




actor TaUser as taUser
node TaApp as taApp {
    agent LxSDK as lxsdk
    agent TaClient as taClient
}

folder tiananuser_folder{
cloud tiananuserCluster
node tomcat1_tiananuser
node tomcat2_tiananuser
node tomcat3_tiananuser

tiananuserCluster -down-> tomcat1_tiananuser
tiananuserCluster -down-> tomcat2_tiananuser
tiananuserCluster -down-> tomcat3_tiananuser



}

folder tianansp_folder{
cloud tiananspCluster
node tomcat1_tianansp
node tomcat2_tianansp
node tomcat3_tianansp

tiananspCluster -down-> tomcat1_tianansp
tiananspCluster -down-> tomcat2_tianansp
tiananspCluster -down-> tomcat3_tianansp

}


node Nginx as nginx

nginx --> tiananuserCluster:負載均衡/路由
nginx --> tiananspCluster:負載均衡/路由


taUser -->  taApp : 訪問
taApp --> nginx:http/https


database tiananuser_database[
    使用者登入資料庫

]
database tianansp_database[
    運營活動資料庫
]

database redis[
    redis快取
]


tiananuser_folder -down-> tiananuser_database
tianansp_folder -right-> tianansp_database

tiananuser_folder -down-> redis
tianansp_folder -up-> redis


node zk [
    zookeeper註冊中心
    dubbo的消費者跟生產者通訊中介軟體
    定時任務elasticjob的配置中介軟體
]


tiananuser_folder -down-> zk
tianansp_folder -up-> zk


node apollo [
    apollo配置中心
]

queue kafka[
    kafka叢集
]


tiananuser_folder -down-> apollo
tianansp_folder -up-> apollo


tiananuser_folder -down-> kafka
tianansp_folder -up-> kafka


file fileCDN [
    七牛雲或者阿里雲端儲存
]


tiananuser_folder -down-> fileCDN
tianansp_folder -up-> fileCDN


cloud ELK {
    node elsticSearch
    node filebeat
    node kibana
}

node kubernetes{
    node healmcharts[
       交付服務
    ]
    node harbor[
        harbor監控管理kubernetes物件
    ]
}


tiananuser_folder -down-> ELK:日誌寫入
tianansp_folder -up-> ELK:日誌寫入


tiananuser_folder -down-> kubernetes:釋出和管控docker節點
tianansp_folder -up-> kubernetes:釋出和管控docker節點

@enduml複製程式碼

file

小結

1. 活動圖(泳道圖)實際上是程式碼流程的一個梳理,建議編碼前,先畫活動圖;

2. 狀態圖 可以列舉出所有狀態發生改變的事件,防止遺漏掉某些發生改變的情況;

3. 部署圖實際上是物理架構圖,畫的不太好看,但是卻可以在上線的時候有效的指導運維;

原創不易,轉載請註明出處。