画图利器-PlantUML

·  阅读 464

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情

开篇

作为一个业务研发,出设计方案是常事。图形化能够让读者更简单地理解你的设计。

但的确,这不是一件容易的事。

技术设计中画图和一幅素描画一样,需要你具备扎实的基本功,不犯基础错误。但这仅仅是个开始,你需要具备图形化的思考方式,看过很多优秀的案例,才能在需要的时候将你的技术设计图形化。

另外一个阻力是作图的困难,我常常听到人们抱怨,我是个后端研发,却在这儿研究怎么让两条线对齐,怎么把各个形状的间距控制好,这看起来很蠢。为什么我早就想清楚要画什么了,要画出来却花费这么多力气。

PlantUML 就是帮你减轻作图困难的利器。你只需要符合语法规范地,告诉它你想表达的逻辑语义,它就能自动生成 UML 图片。

PlantUML 官网还提供了全中文翻译,对开发者很友好:plantuml.com/zh/

这篇文章,希望能够帮助你了解 PlantUML 的用法,快速入门,给出常见的示例。

如何上手

我们先来看看,如果我按照 PlantUML 的要求写出了我希望表达的逻辑,我怎么画出来。

在线渲染

使用官网的在线渲染,填好逻辑,直接 submit 即可:www.plantuml.com/plantuml/um…

image.png

image.png

通过 jar 包本地生成

如果你的本地有 java 环境的话,可以使用官方 jar 包进行本地生成:

  1. 下载 plantuml.jar
  2. 用PlantUML命令创建一个文本文件,就像这个例子一样,叫做sequenceDiagram.txt 。
@startuml
Alice -> Bob: test
@enduml
复制代码
  1. 运行(或让你的软件调用)PlantUML,使用sequenceDiagram.txt 作为输入,输出是一个图像。
java -jar plantuml.jar sequenceDiagram.txt
复制代码

这将你的序列图输出到一个叫做sequenceDiagram.png 的文件中。详细的命令行参数看这里

依赖 IDE 或 文本编辑器

事实上 PlantUML 是一个服务端广泛使用的工具,vscode,sublime,eclipse 都提供了支持,这里不过多介绍,大家可以参考 plantuml.com/zh/running

时序图

ok,上一节我们了解了如何生成一张 UML 图片,现在我们来学习一下 PlantUML 语法,看看如何与我们的诉求匹配上。同样,如果您有余力,建议还是完整地看一看官网完整的中文指南: 使用 PlantUML 绘制的 UML

今天我们以时序图为例看一下PlantUML的强大之处:

  • -> 绘制参与者之间传递的消息;
  • --> 虚线箭头
@startuml
用户 -> 认证中心: 登录操作
认证中心 -> 缓存: 存放(key=token+ip,value=token)token
用户 <- 认证中心 : 认证成功返回token
用户 -> 认证中心: 下次访问头部携带token认证
认证中心 <- 缓存: key=token+ip获取token
其他服务 <- 认证中心: 存在且校验成功则跳转到用户请求的其他服务 
其他服务 -> 用户: 信息
@enduml
复制代码

image.png

  • 你可以声明多种相关方,他们对应的外观是不同的:
    • participant 参与者
    • actor 角色
    • boundary 边界
    • control 控制
    • entity 实体
    • database 数据库
    • collections 集合
    • queue 队列
  • as 能够重命名参与者。即使用 participant A as B 能够做到声明一个参与者 A,但是在后面的语句中,用B来代指。生成的图片中只会展示 A 的名称。
@startuml
participant     participant     as Foo
actor 		actor 		as Foo1 
boundary	boundary	as Foo2
control		control		as Foo3
entity		entity		as Foo4
database	db		as Foo5
collections     collections	as Foo6
queue		queue		as Foo7

Foo -> Foo1: To actor
Foo -> Foo2: To boundary
Foo -> Foo3: To control
Foo -> Foo4: To entity
Foo -> Foo5: To database
Foo -> Foo6: To collections
Foo -> Foo7: To queue
@enduml
复制代码

image.png

  • 使用 order 来自定义参与者的顺序,值越大的越靠后:
@startuml
participant 最后 order 30
participant 中间 order 20 
participant 首个 order 10 
@enduml
复制代码

image.png

  • autonumber 自动对消息编号
@startuml
autonumber
Bob -> Alice : Authentication Request
Bob <- Alice : Authentication Response
@enduml
复制代码

image.png

  • 使用 title 增加标题;
  • 使用 header 增加页眉;
  • 使用 footer 增加页脚;
@startuml

header Page Header
footer Page %page% of %lastpage%

title Example Title

Alice -> Bob: message 1
Alice -> Bob: message 2

@enduml
复制代码

image.png

  • 可以使用 note leftnote right 给消息添加注释,可以用 end note 添加多行注释。
@startuml

Alice -> Bob: hello
note left: this is a first note

Bob -> Alice: ok
note right: this is another note

Bob -> Bob: I am thinking
note left
a note
can also be defined
on several lines
end note

@enduml
复制代码

image.png

  • 可以使用 == 将图标分隔成多个逻辑步骤
@startuml

== 初始化 ==
Alice -> Bob: 认证请求
Bob --> Alice: 认证响应

== 重复 == 
Alice -> Bob: 认证请求
Alice <-- Bob: 认证响应
@enduml
复制代码

image.png

  • 使用... 表示延迟,并且可以给延迟添加注释
@startuml

Alice -> Bob: 认证请求
...
Bob --> Alice: 认证响应
...5分钟后...
Bob --> Alice: 再见!
@enduml
复制代码

image.png

  • activatedeactivate 表示参与者的生命活动,一旦参与者被激活,生命线就会显示出来。
  • destroy 表示一个参与者的生命线的终结
@startuml
participant User

User -> A: DoWork
activate A

A -> B: Create Request
activate B

B -> C: DoWork
activate C

C --> B: WorkDone
destroy C

B --> A: Request Created
deactivate B

A -> User: Done
deactivate A

@enduml
复制代码

image.png

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改