PlantUml建模工具的一次实践

一直没有一个好的画图工具,一般的画图工具如Visio和亿图,还需要拖拽各种操作不方便,今天实践一下plantUML建模工具,网上有很多资料,只是实践后汇总下。


1. Uml及PlantUml使用场景

UML(Unified Modeling Language)统一建模语言是一个通用的可视化建模语言,用于对软件进行描述、可视化处理、构造和建立软件系统制品的文档。UML 提供了一套描述软件系统模型的概念和图形表示方法,软件开发人员可以使用 UML 对复杂的面向对象软件系统建立可视化的模型。

UML有事物,关系和图三个基本构造块。事物是实体抽象化的最终结果,是模型中的基本成员;关系是将事物联系在一起的方式;图是事物集合的分类。

支持的UML图包括:时序图、状态图、架构图、组件图等等,第3部分会详细举例说明。

2. plantUML安装

主要实践Windows下进行plantUML工具安装。如果不想安装,可以用在线的plantUML工具。另外会找机会介绍docker下plantUML容器版本的安装(离线方式建议docker容器,不用安装依赖包)。

Windows下安装planUML,参考使用sublime+plantUML高效地画图进行安装(sublime text,graphviz,sublime的plantUml插件),此外还有安装JRE并配置环境变量。

FAQ: 安装完sublime的plantUML插件后,sublime工具在Preferences -> Package Settings ->Diagram下的Display Diagrams按钮是灰化的

解决方法:sublime的plantUML插件中diagram/plantuml. jar下载时文件部分丢失。只要下载后,插件可解压成功到package目录,Display  Diagrams按钮可点击非灰化。

3. plantUML绘制常用图

参考plantUML语法学习,本文介绍几种常用场景:时序图、状态图、架构图、组件图和用例图,各个常用图源代码见第4部分。

3.1 时序图

时序图模板

3.2. 流程图(活动图)

流程图(活动图)

3.3. 组件图

参考openstack及组件简要,绘制组件图如


解决几个问题:node节点如何放置,组件节点如何放置,可以通过 -left->,-right->,-up->,-down-> 进行适当调整node和组件的位置使得组件图更清楚明了。

组件图

3.4. 状态图

参考操作系统进程的状态转换,绘制状态图

状态图

3.5 架构图

参考openstack及组件简要,绘制架构图如

架构图

3.6 原例图

参考天猫购物付账过程,绘制用例图如下(端到端)

用例图

4. plantUML常用图的源代码

4.1 时序图的源代码

@startuml

title 时序图通用模板

actor Aparticipant B

box "db_adaptor" #LightBlue

collections db_adaptor1 

collections db_adaptor2

end box

database db1

database db2   

== 子流程1 ==   

A -> B: post req1   

note left: 左侧备注   

activate B   

A <[#0000FF]-B:ack,jobid   

... 延迟5秒钟 ...   

A --> B: get 查询job进度   

note over A,B #green:一直查询job直到成功   

B -> db_adaptor1: post req2   

db_adaptor1 -[#green]-> db1:db operate   

db_adaptor2 -[#green]-> db2:db operate   

B <-[#0000FF]- db_adaptor1:ack响应200成功   

note right: 右侧备注   

A <-[#0000FF]- B: ack响应200,进度100   

deactivate B

@enduml

4.2 流程图的源代码

@startuml

title 流程(活动)图通用模板

start

if (是否鉴权) then (yes)

  -[#blue]->

  if (kestone token是否过期) then (yes)

      :鉴权失败;

      if (是否申请keystone token成功) then (yes)

            :keystone 生成新token;

            :nova-api;

      else (no)

            :返回生成token失败; 

            stop

        endif

  else (no)

      -[#green]->

      :nova-api;

  endif

  else (no)

-[#green]->

  :nova-api;

endif

:nova-sechdule;

while (是否超过调度最大次数) is (no)

  fork

        :disk filter;

    fork again

        :mem filter;

    fork again

        :cpu filter;

    fork again

        :numa filter;

    end fork

    if (是否调度成功) then (yes)

        :nova-compute;

      stop

    else (no)

endif

endwhile (yes)

      :Not valid host;

stop

@enduml

4.3 组件图的源代码

@startuml

package "package Horizon" {

    [Component Horizon] <>

}

  cloud {     

[cloud adaptor]

  }   

node "keystone node  main service" {      keystone_rest -> [Component \n keystone api]

      [Component \n keystone api]

    }

    node "nova node  main service" { 

nova_rest -> [Component \n nova api]

    [Component \n nova api] 

    [Component \n nova db]

    [Component \n nova sechdule] 

    [Component \n nova compute]

    [Component \n nova queue] 

  [Component \n nova conductor]

    } 

node "neutron node  main service" { 

  neutron_rest --> [Component \n neutron plugin agent]

    [Component \n neutron plugin agent]   

    node "glance node main service" { 

  glance_rest -> [Component \n glance api]

      [Component \n glance api]

    }

node "cinder node  main service" { 

  cinder_rest -> [Component \n cinder api]

    [Component \n cinder api]

  }

  node "hypervisor" { 

    [Component \n hypervisor] 

      [Component Horizon] --> [cloud adaptor]

  [cloud adaptor] -> [keystone_rest] :1

  [cloud adaptor] -> [nova_rest] :2 

  [Component \n nova api] <-> [keystone_rest] :3 

  [Component \n nova api] <-> [Component \n nova db]:4 

  [Component \n nova api] <-down-> [Component \n nova queue]:5   

[Component \n nova queue] -right-> [Component \n nova sechdule]:6 

    [Component \n nova sechdule] -left-> [Component \n nova db]:7   

  [Component \n nova sechdule] <- [Component \n nova db]:8   

  [Component \n nova queue] <- [Component \n nova sechdule]:9   

[Component \n nova queue] -down-> [Component \n nova compute]:10   

[Component \n nova queue] <- [Component \n nova compute]:11   

[Component \n nova queue] -left-> [Component \n nova conductor]:12   

[Component \n nova conductor] -left-> [Component \n nova db]:13     

[Component \n nova conductor] -up-> [Component \n nova db]:14 

  [Component \n nova queue] <- [Component \n nova conductor]:15 

  [Component \n nova queue] -> [Component \n nova compute]:16 

[Component \n nova compute] -down-> glance_rest:17 

    glance_rest <-> keystone_rest:18   

  [Component \n nova compute] <- glance_rest:19 

[Component \n nova compute] -> neutron_rest:20 

  neutron_rest <-> keystone_rest:21   

  [Component \n nova compute] <- neutron_rest:22 

[Component \n nova compute] -> cinder_rest:23 

  cinder_rest <-> keystone_rest:24   

[Component \n nova compute] <- cinder_rest:25 

  [Component \n nova compute] -down-> [Component \n hypervisor]:26

@enduml

4.4 状态图的源代码

@startuml

title 操作系统进程状态转换

state create: 进程创建态

    create: 如何创建进程,进程资源占用

  create: 进程下线程多少个

state ready:进程就绪态

state running:进程运行态

state blocked:进程阻塞态

state terminal:进程终止态

    terminal:进程资源释放

state init:资源池

init  --> create:资源申请

create --> ready:就绪队列允许接纳新进程,进程移入就绪队列

ready  --> running:调度程序将就绪状态的进程分配处理机进入运行态

running --> ready:正在执行的进程因时间片用完而被暂停执行

running --> ready:可抢占调度方式中,因优先级低进入就绪队列

running --> blocked:正在执行的进程因等待某事件A(I/O)而无法执行

running --> blocked:正在执行的进程因等待某事件A(申请缓冲区)而无法执行

running --> blocked:正在执行的进程因等待某事件A(等待信号)而无法执行

blocked --> ready:进程所等待的事件A发生了,进程进入就绪队列

blocked --> terminal:因任务完成完成,变为终止状态

blocked --> terminal:因某种异常事件,变为终止状态

terminal --> init:释放资源

@enduml

4.5 架构图的源代码

@startuml

title openstack架构图

sprite $bProcess jar:archimate/business-process

sprite $aService jar:archimate/application-service

sprite $aComponent jar:archimate/application-component

rectangle "Horizon"  as H <<$bProcess>> #yellow

rectangle "Keystone" as K <<$aService>> #green

rectangle "Nova" as Nova <<$aService>> #green

rectangle "Neutron" as Neutron <<$aService>> #green

rectangle Cinder  <<$aService>> #green

rectangle Glance  <<$aService>> #green

H *-down- K :1

K *-down- Nova :2

K *-down- Neutron

K *-down- Cinder

K *-down- Glance

Neutron <-right- Nova

Nova -right-> Cinder

Nova -right-> Glance

rectangle "neutron\n server" as ns <<$aComponent>> #A9DCDF

rectangle "neutron\n dhcp" as nh <<$aComponent>> #A9DCDF

rectangle "neutron\n l3" as nl3 <<$aComponent>> #A9DCDF

rectangle "neutron\n plugin" as np <<$aComponent>> #A9DCDF

rectangle "nova\n api" as na <<$aComponent>> #A9DCDF

rectangle "nova\n sechdule" as nsech <<$aComponent>> #A9DCDF

rectangle "nova\n compute" as ncom <<$aComponent>> #A9DCDF

rectangle "glance\n api" as ga <<$aComponent>> #A9DCDF

rectangle "glance\n registry" as gr <<$aComponent>> #A9DCDF

rectangle "glance\n image store" as gis <<$aComponent>> #A9DCDF

rectangle "cinder\n api" as ca <<$aComponent>> #A9DCDF

rectangle "cinder\n sechdule" as cs <<$aComponent>> #A9DCDF

rectangle "cinder\n volume" as cv <<$aComponent>> #A9DCDF

rectangle "cinder\n backup" as cb <<$aComponent>> #A9DCDF

np .right.> ns

np .down.> nh

np .down.> nl3

na .right.> nsech

na .down.> ncom

ga .right.> gr

ga .down.> gis

ca .right.> cs

ca .down.> cv

ca .down.> cb

Neutron -down-> np

Nova -down-> na :3

Glance -down-> ga

Cinder -down-> ca

ncom -right-> ga :4

ncom -right-> ca :5

ncom -left-> ns :6

legend leftExample from the "openstack架构图".

<$bProcess> :business process

<$aService> : application service

<$aComponent> : appplication component

__> : 组件间消息

---> : 组件内消息

endlegend

@enduml

4.6 用例图的源代码

@startuml
title 用例图
left to right direction
actor buyer
actor seller
rectangle plaform {
      buyer <--> (trade)
      (App) -left.> (trade) : use
      (help) .> (trade) : extends
      (trade) <--> (goods):select
      (discount) -left.> (goods) : of
      (goods) <--> (payment):pay
      (支付宝) -left.> (payment):of
      (银行卡) .> (payment):of       
      (payment) --> seller
      (payment) <-- seller
      buyer <-- (trade)
}
buyer2 --> (Usecase2)
buyer2 <-- (Usecase2)
@enduml
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,601评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,367评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,249评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,539评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,967评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,929评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,098评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,825评论 0 207
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,609评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,796评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,282评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,603评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,277评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,159评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,959评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,079评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,874评论 2 277

推荐阅读更多精彩内容