概述
PlantUML 最擅长制作的就是时序图啦!
在本文中,我们将讲解如何使用 PlantUML 来演示时序图的制作。
简单示例
在时序图中,可以使用 -> 来绘制参与者之间传递的消息,而不必显示的声明具体的参与者。
一个简单的示例如下:
用户 -> 认证中心: 登录操作认证中心 -> 缓存: 存放(key=token+ip,value=token)token用户 <- 认证中心 : 认证成功返回token用户 -> 认证中心: 下次访问头部携带token认证认证中心 <- 缓存: key=token+ip获取token其他服务 <- 认证中心: 存在且校验成功则跳转到用户请求的其他服务其他服务 -> 用户: 信息
此外,我们可以使用 —> 来表示一个虚线剪头,此外,还可以是使用 <- 和 <— 来表示消息传递。
声明参与者
虽然在时序图中,我们可以直接使用 -> 来进行参与者之间的消息传递,无需一定要对参与者进行声明。
但是,实际上,PlantUML 中其实也可以对参与者进行显示声明并进行更多的控制。
在 PlantUML 中可以使用以下这些关键词来对参与者进行声明,不同的参与者显示的形状不同:
- actor: 角色
- boundary: 边界
- control: 控制
- entity: 实体
- database: 数据库
- collections: 集合
- queue: 队列
- participant: 普通参与者
我们来看一段示例代码:
participant A as Fooactor B as Foo1boundary C as Foo2control D as Foo3 order 1entity E as Foo4 order 2database F as Foo5 order 4collections G as Foo6 order 3 #redqueue H as Foo7 #99FF99Foo -> Foo1: To ActorFoo -> Foo2: To boundaryFoo -> Foo3: To controlFoo -> Foo4: To entityFoo -> Foo5: To databaseFoo -> Foo6: To collectionsFoo -> Foo7: To queue
可以看到:
- 我们使用了 as 为 UML 显示中的实体设置别名,并在后续的消息传递中通过别名进行设置。
- 同时,我们可以通过 order 来自定义参与者打印的顺序,即 order 顺序由小至大从左向右依次显示。
此外,我们还可以对参与者通过 RGB 值或者颜色名称来声明实体的颜色。
参与者中使用非字母符号
在参与者中,如果包含一些特殊符号时,可以用 “” 进行包围,示例如下:
Alice -> "Bob()" : Hello"Bob()" -> "This is very\nlong" as LongLong --> "Bob()" : ok
给自己发消息
在时序图中,参与者也可以给自己发送消息,示例如下:
Alice->Alice: This is a signal to self.\nIt also demonstrates\nmultiline \ntext
文本对齐
默认情况下,消息都会在连接线的上方显示,当然,我们也可以通过一些方式来控制其行为,例如我们可以让响应信息显示在剪头的下方:
skinparam responseMessageBelowArrow trueBob -> Alice : helloAlice -> Bob : ok
消息样式
在 PlantUML 中,我们对剪头的样式进行配置,具体来说,有如下几种不同的消息样式:
-> :普通的消息样式
- —> :虚线消息样式
- ->x:丢失的消息
- ->o:箭头末尾加圈
- -\,-/:剪头只有上半部分或者下半部分
- ->>:细箭头
- <->:双向箭头
示例代码如下:
Bob ->x AliceBob --> AliceBob -> AliceBob ->> AliceBob -\ AliceBob \\- AliceBob //-- AliceBob ->o AliceBob o\\-- AliceBob <-> AliceBob <->o Alice
箭头颜色调整
在 PlantUML 中可以对箭头的颜色进行调整:
Bob -[#red]> Alice : helloAlice -[#0000FF]->Bob : ok
消息序号编号
关键词 autonumber 可以自动在消息上增加编号:
autonumberBob -> Alice : Authentication RequestBob <- Alice : Authentication Response
标题、页眉和页脚
在 PlantUML 中,可以对 UML 图配置标题、页眉和页脚,示例如下:
header Page Header1footer Page %page% of %lastpage%title Example Title1Alice -> Bob : message 1Alice -> Bob : message 2
时序图分页
在 PlantUML 中可以使用关键词 newpage 用于把一张图分成多张,即将多张图在同一个文件中进行管理。
在 newpage 之后添加文字可以作为新的示例图的标题,这样就可以方便的进行长图打印。
Alice -> Bob : message 1Alice -> Bob : message 2newpageAlice -> Bob : message 3Alice -> Bob : message 4newpage A title for the\nlast pageAlice -> Bob : message 5Alice -> Bob : message 6
组合消息
在 PlantUML 中,可以通过如下关键词来组合消息:
- alt/else:条件控制
- opt
- loop:循环
- par
- break
- critical
- group:自定义分组,可以在其中通过 [] 的方式来增加次级标签
- end:结束分组
Ps:分组可以嵌套使用。
我们先来看一个示例:
Alice -> Bob: 认证请求alt 成功情况Bob -> Alice: 认证接受else 某种失败情况Bob -> Alice: 认证失败group 我自己的标签Alice -> Log : 开始记录攻击日志loop 1000次Alice -> Bob: DNS 攻击endAlice -> Log : 结束记录攻击日志endelse 另一种失败Bob -> Alice: 请重复end
消息、节点注释
我们可以通过在消息后面添加 note left 或者 note right 关键词来给消息添加注释,也可以通过使用 end note 来添加多行注释。
Alice->Bob : hellonote left: this is a first noteBob->Alice : oknote right#aqua: this is another noteBob->Bob : I am thinkingnote lefta notecan also be definedon several linesend note
此外,我们还可以使用 note left of,note right of 或 note over 在节点 (participant) 的相对位置放置注释,还可以通过修改背景色来高亮显示注释。
participant Aliceparticipant Bobnote left of Alice #aquaThis is displayedleft of Alice.end notenote right of Alice: This is displayed right of Alice.note over Alice: This is displayed over Alice.note over Alice, Bob #FFAAAA: This is displayed\n over Bob and Alice.note over Bob, AliceThis is yet anotherexample ofa long note.end note
此外,还可以使用 hnote 和 rnote 这两个关键字来修改备注框的形状:
- hnote 代表六边形(hexagonal)的备注框;
- rnote 代表正方形(rectangle)的备注框。
示例代码:
caller -> server : conReqhnote over caller : 空闲caller <- server : conConfrnote over server"r"是正方形"h"是六边形endrnotenote over server多行文本end notehnote over caller多行文本endhnote
此外,我们再增加备注消息注释时,还可以直接作用在全部的参与者上,示例如下:
Alice->Bob:m1Bob->Charlie:m2note over Alice, Charlie: 创建跨越所有参与者的备注的旧方法:\n ""note over //FirstPart, LastPart//"".note across: 新方法:\n""note across""Bob->Alicehnote across: 跨越所有参与者的备注。
需要注意的是,在 UML 时序图中添加多个注释时,注释之间默认不是对齐的。
当然,我们可以通过 / 来在同一级对齐多个备注:
note over Alice : Alice的初始状态/ note over Bob : Bob的初始状态Bob -> Alice : hello
Creole 和 HTML 格式
在 UML 图中,我们可以使用 Creole 格式:
participant Aliceparticipant "The **Famous** Bob" as BobAlice -> Bob : hello --there--... Some ~~long delay~~ ...Bob -> Alice : oknote leftThis is **bold**This is //italics//This is ""monospaced""This is --stroked--This is __underlined__This is ~~waved~~end noteAlice -> Bob : A //well formatted// messagenote right of AliceThis is <back:cadetblue><size:18>displayed</size></back>__left of__ Alice.end notenote left of Bob<u:red>This</u> is <color #118888>displayed</color>**<color purple>left of</color> <s:red>Alice</strike> Bob**.end notenote over Alice, Bob<w:#FF33FF>This is hosted</w> by sourceforge.jpgend note
分隔符
在 UML 图中,可以通过 == 关键词来将时序图分割成为多个逻辑步骤:
== 初始化 ==Alice -> Bob: 认证请求Bob --> Alice: 认证响应== 重复 ==Alice -> Bob: 认证请求Alice <-- Bob: 认证响应
引用
可以在图中通过使用 ref over 关键词来实现引用:
participant Aliceactor Bobref over Alice, Bob : initAlice -> Bob : helloref over BobThis can be onseveral linesend ref
延迟
在 UML 时序图中可以使用… 来表示延迟,并且还可以给延迟添加注释。
Alice -> Bob: 认证请求...Bob --> Alice: 认证响应...5分钟后...Bob --> Alice: 再见!
空间控制
在 UML 时序图中,我们可以通过 ||| 来增加调用链之间的空间,还可以使用数字指定增加空白空间的大小。
Alice -> Bob: message 1Bob --> Alice: ok|||Alice -> Bob: message 2Bob --> Alice: ok||100||Alice -> Bob: message 3Bob --> Alice: ok
生命周期控制
关键字 activate 和 deactivate 用来表示参与者的生命周期。一旦参与者被激活,它的生命线就会显示出来。同时,destroy 表示一个参与者的生命线的终结。
participant UserUser -> A: DoWorkactivate AA -> B: << createRequest >>activate BB -> C: DoWorkactivate CC --> B: WorkDonedestroy CB --> A: RequestCreateddeactivate BA -> User: Donedeactivate A
此外,还可以使用嵌套的生命线,并且运行给生命线添加颜色。
participant UserUser -> A: DoWorkactivate A #FFBBBBA -> A: Internal callactivate A #DarkSalmonA -> B: << createRequest >>activate BB --> A: RequestCreateddeactivate Bdeactivate AA -> User: Donedeactivate A
此外,也可以使用自动激活关键字(autoactivate),这需要与 return 关键字配合:
autoactivate onalice -> bob : hellobob -> bob : self callbill -> bob #005500 : hello from thread 2bob -> george ** : createreturn done in thread 2return rcbob -> george !! : deletereturn success
其中,新命令 return 可以用于生成一个带有本文标签的返回信息,返回的点是当前最近的生命周期线。
创建参与者
我们可以把关键词 create 放在第一次接收消息之前,来强调本次消息实际上是在创建新的对象。
Bob -> Alice : hellocreate OtherAlice -> Other : newcreate control StringAlice -> Stringnote right : You can also put notes!Alice --> Bob : ok
激活、撤销和创建的快捷语法
在指定目标参与者之后,可以使用如下语法:
- ++ 激活目标(可选择在后面增加 #color)
- — 撤销激活源
- ** 创建目标实例
- !! 摧毁目标实例
alice -> bob ++ : hellobob -> bob ++ : self callbob -> bib ++ #005500 : hellobob -> george ** : createreturn donereturn rcbob -> george !! : deletereturn success
此外,我们还可以在同一行同时进行激活和撤销:
alice -> bob ++ : hello1bob -> charlie --++ : hello2charlie --> alice -- : ok
进入和发出消息
如果只想关注部分图示,你可以使用进入和发出箭头。
使用方括号 [和] 表示图示的左、右两侧。[-> A: DoWorkactivate AA -> A: Internal callactivate AA ->] : << createRequest >>A<--] : RequestCreateddeactivate A[<- A: Donedeactivate A
锚定和持续时间
使用 teoz 可以在 UML 图表中添加锚定,从而指定持续时间。!pragma teoz true{start} Alice -> Bob : start doing things during durationBob -> Max : somethingMax -> Bob : something else{end} Bob -> Alice : finish{start} <-> {end} : some time
包裹参与者
在 UML 流程图中,可以使用 box 和 end box 画一个框将相关的参与者包裹起来,此外,还可以针对 box 添加标题以及背景颜色。box "Internal Service" #LightBlueparticipant Bobparticipant Aliceend boxparticipant OtherBob -> Alice : helloAlice -> Other : hello
移除参与者下方显示
在 UML 图中,我们可以使用 hide footbox 关键词移除参与者在底部显示对应的信息:hide footboxbox "Internal Service" #LightBlueparticipant Bobparticipant Aliceend boxparticipant OtherBob -> Alice : helloAlice -> Other : hello
外观参数
在 UML 图中,可以使用 skinparam 改变字体和颜色,示例如下:skinparam sequenceArrowThickness 2skinparam backgroundColor #EEEBDCskinparam handwritten trueskinparam roundcorner 20skinparam maxmessagesize 60skinparam sequence {ArrowColor DeepSkyBlueActorBorderColor DeepSkyBlueLifeLineBorderColor blueLifeLineBackgroundColor #A9DCDFParticipantBorderColor DeepSkyBlueParticipantBackgroundColor DodgerBlueParticipantFontName ImpactParticipantFontSize 17ParticipantFontColor #A9DCDFParticipant underlineActorBackgroundColor aquaActorFontColor DeepSkyBlueActorFontSize 17ActorFontName Aapex}actor Userparticipant "First Class" as Aparticipant "Second Class" as Bparticipant "Last Class" as CUser -> A: DoWorkactivate AA -> B: Create Requestactivate BB -> C: DoWorkactivate CC --> B: WorkDonedestroy CB --> A: Request Createddeactivate BA --> User: Donedeactivate Askinparam sequenceArrowThickness 2skinparam roundcorner 20skinparam maxmessagesize 60skinparam sequenceParticipant underlineactor Userparticipant "First Class" as Aparticipant "Second Class" as Bparticipant "Last Class" as CUser -> A: DoWorkactivate AA -> B: Create Requestactivate BB -> C: DoWorkactivate CC --> B: WorkDonedestroy CB --> A: Request Createddeactivate BA --> User: Donedeactivate A
完整示例
``` skinparam sequenceArrowThickness 2 skinparam backgroundColor #EEEBDE skinparam handwritten false skinparam roundcorner 20 skinparam maxmessagesize 60 skinparam sequence { ArrowColor DeepSkyBlue ActorBorderColor DeepSkyBlue LifeLineBorderColor blue LifeLineBackgroundColor #A9DCDF ParticipantBorderColor DeepSkyBlue ParticipantBackgroundColor DodgerBlue ParticipantFontName Impact ParticipantFontSize 17 ParticipantFontColor #A9DCDF Participant underline ActorBackgroundColor aqua ActorFontColor DeepSkyBlue ActorFontSize 17 ActorFontName Aapex }
actor 研发 as RD participant “使用入口” as Entry participant “接入层” as Web participant “底层测试能力服务\n用例执行平台” as Engine
== 测试能力选择 == RD -> Entry: 查询QA测试能力列表 activate Entry Entry -> Web: 查询QA测试能力列表 activate Web return 测试能力列表 return 测试能力列表
RD -> RD: 选择对应测试能力
RD -> Entry: 查询测试能力参数可选项 activate Entry Entry -> Web: 查询测试能力参数可选项 activate Web Web -> Engine: 查询测试能力参数可选项 activate Engine return 参数可选项 return 参数可选项 return 参数可选项
RD -> RD: 填写对应的测试任务执行参数
== 测试能力执行 == RD -> Entry: 发起测试任务 activate Entry Entry -> Web —: 发起测试任务 activate Web
group 执行测试任务 loop Web -> Engine: 发起任务并训轮查询测试任务结果 activate Engine return 任务结果
Web -> Engine: 发起任务并训轮查询测试任务结果activate Enginereturn 任务结果end
end deactivate Web
RD -> Entry: 查询测试任务结果 activate Entry Entry -> Web: 查询测试任务结果 activate Web return 测试任务结果及详情链接 return 测试任务结果及详情链接
RD -> Engine: 查询测试过程详情日志与部分报告等
return
```
