还在为如何高效绘制时序图而苦恼?让PlantUML来拯救你!

知乎 · · 983 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

作为一个软件攻城狮,在日常板砖中,经常会涉及到和其他模块的交互,为了理清这些交互关系,我们需要绘制各个模块间的时序交互图。

以前绘制这些交互时序图,用的都是visio,实际使用下来感觉也不是很方便(可能我比较菜,不是visio大神),痛点如下:

  1. 在绘制时序图时,我们经常会对各个模块的位置和交互的线序进行调整,用visio画图的话,调整模块位置和线序真是又酸又爽。

2. 操作不够行云流水,一会儿拖个框,一会儿打个字,要是画图都能像打字一样方便该多好。

3. OFFICE全家桶的启动速度你懂得。。。

从学生时代我就一直在忍受visio带来的诟病,无奈毕业论文钦定要这玩意画图,不然我早就送他去。。。。。。

直到工作后遇到这款神器!!!!!!

PlantUML简介

  • 顺序图
  • 用例图
  • 类图
  • 对象图
  • 活动图
  • 组件图
  • 部署图
  • 状态图
  • 时序图

也支持以下非UML图。

  • JSON数据
  • YAML数据
  • 网络图(nwdiag)
  • 线框图形界面或UI模拟(盐)。
  • 架构图
  • 规范和描述语言(SDL)
  • Ditaa图
  • 甘特图
  • 思维导图图示
  • 工作分解结构图(WBS)
  • 用AsciiMath或JLaTeXMath符号进行数学计算
  • 实体关系图(IE/ER)

此外。

  • 超链接和工具提示
  • 克里奥尔语:富文本、表情符号、unicode、图标
  • OpenIconic图标
  • Sprite图标
  • AsciiMath的数学表达式

图形是用一种简单直观的语言定义的。(见PlantUML语言参考指南)。

新用户可以阅读快速入门页面。也有一个F.A.Q.页面。PlantUML可以在许多其他工具中使用。

图像可以生成PNG、SVG或LaTeX格式。也可以生成ASCII艺术图(只针对序列图)。


上面的简介均来自官方介绍,从中可以看出:功能很强大。但是三千弱水,我只取一瓢,我还是比较喜欢用它来画时序图。

命令行运行PlantUML

使用PlantUML的命令行语法,将其包含在你自己的脚本或文档工具中。

用PlantUML命令创建一个文本文件,就像这个例子一样,叫做sequenceDiagram.txt 。

@startuml
Alice -> Bob: test
@enduml

运行(或让你的软件调用)PlantUML,使用sequenceDiagram.txt 作为输入。输出是一个图像,它或者出现在其他软件中,或者被写入磁盘上的图像文件。例如。这将你的序列图输出到一个叫做sequenceDiagram.png 的文件中。

java -jar plantuml.jar sequenceDiagram.txt

这将你的序列图输出到一个叫做sequenceDiagram.png 的文件中。PlantUML的语法很简单,大家可以在其官网找到,这里就不贴出来了。

示例

这里给出,在实际项目中使用PlantUML绘制时序图的两个例子:

示例1.

@startuml

skinparam titleFontSize 25
skinparam titleFontColor  #red
title 监控点位上墙时序图

skinparam backgroundColor #LightBlue
skinparam handwritten false
skinparam sequenceParticipant underline

participant smmgr
participant umtio
participant 解码微服务
participant 统一设备
participant 流媒体
participant 设备接入
participant IPC

==解码器解码流程==
smmgr     ->     umtio       : 解码请求
umtio      ->     解码微服务  : 发送解码请求/decoder/tasks/ext
解码微服务 ->     流媒体      : 请求流媒体要ipc码流
流媒体     ->     设备接入    : Http请求设备接入要ipc码流
设备接入   ->     统一设备    : 查询ipc的入网信息,包括码流传输方式
统一设备   ->     设备接入    : 返回给设备接入
设备接入   ->     IPC         : 国标请求ipc发给流媒体码流
IPC        ->     流媒体      : Ipc码流发送给流媒体
流媒体     ->     解码微服务  : 流媒体发送码流供解码器解码
umtio      <-     解码微服务  : 解码响应
smmgr     <-     umtio       : 解码响应
@enduml


示例1实际效果图

示例2.

@startuml

skinparam titleFontSize 25
skinparam titleFontColor  #red
title 会议终端上墙时序图

skinparam backgroundColor #LightBlue
skinparam handwritten false
skinparam sequenceParticipant underline

participant client
participant umtio
participant 解码微服务   as decoder
participant 媒体调度服务 as mediaschedule
participant 流媒体       as media
participant 会议接入1    as conf1
participant 会议接入2    as conf2
participant MCU1
participant MCU2

rnote over mediaschedule
一个媒体调度服务
对接多个会议接入服务
endrnote

rnote over conf2
一个会议接入服务
对接一个MCU设备
endrnote

==会议终端点状态变化订阅(用于接收会议终端状态变更通知)==
umtio      ->     mediaschedule: 调度组成员状态订阅

==会议终端点位获取(上电获取全量数据)==
umtio      ->     mediaschedule: 查询会议列表
umtio      <-     mediaschedule: 返回会议列表
umtio      ->     mediaschedule: 获取终端列表
umtio      <-     mediaschedule: 返回终端列表

==会议终端状态变更通知==
umtio      <-     mediaschedule: 调度组成员状态变化通知

==会议终端C节点获取流程==
client     ->     umtio        : UMTMSG_GET_DISPGROUPID_BY_GBNO\n通过与会终端ID查询监看资源ID

    rnote over mediaschedule
        UMTMSG_GET_DISPGROUPID_BY_GBNO为复合接口
        在该消息中判断会议终端是否在调度组,是否在会议
    endrnote

alt <font color=red> 会议终端不在调度组也不在会议中
    rnote over mediaschedule
        会议终端不在调度组也不在会议中,需要创建调度组
    endrnote
    umtio  ->  mediaschedule:创建调度组
    umtio  <-  mediaschedule:创建调度组响应
    
    rnote over umtio
        收到会议终端状态变更通知后发出
    endrnote
    
    client <-  umtio         : UMTMSG_DISPGROUP_RESOURCE_NOTIFY\n终端拉流,资源id生成通知
    umtio  ->  mediaschedule:开始监看设备
    umtio  <-  mediaschedule:开始监看设备响应\n携带C节点
else <font color=red> 会议终端在调度组或者在会议中
    umtio  ->  mediaschedule:开始监看设备
    umtio  <-  mediaschedule:开始监看设备响应\n携带C节点
    client <-  umtio        : UMTMSG_GET_DISPGROUPID_BY_GBNO_ACK
end


==解码器下任务流程==
client     ->     umtio        : 发送解码请求
umtio      ->     decoder      : 发送解码请求/decoder/tasks/ext\n(DeviceID填写C节点编号)
media      <->    decoder      : 码流协商
umtio      <-     decoder      : 解码器解码响应
client     <-     umtio        : 解码器解码响应
@enduml


示例2实际效果图

遇到的问题

我使用的shell工具是xshell,使用过程中遇到如下报错:

Can't connect to X11 window server using '0.0' as the value of the DISPLAY variable.

要解决这个问题,主要在终端执行unset DISPLAY即可。

本文来自:知乎

感谢作者:知乎

查看原文:还在为如何高效绘制时序图而苦恼?让PlantUML来拯救你!

983 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传