PlantUML时序图
背景
时序图(Sequence Diagram),又名序列图、循序图,是一种UML交互图,用于描述对象之间发送消息的时间顺序,显示多个对象之间的动态协作。时序图的使用场景非常广泛,几乎各行各业都可以使用。下面,简单介绍如何使用plantUML插件,来绘制时序图。
PlantUML插件下载
首先,打开IDEA,找到setting,然后选择plugins,搜索PlantUML,找到如下插件,点击下载,然后重启idea,即可使用plantUML插件。
如果使用的是VSCode,选择扩展,然后搜索PlantUML,下载即可使用
PlantUML绘制时序图
首先创建一个PlantUML 文件,然后选择Sequence模板
创建完毕后,会自动生成一个时序图的模板
时序图绘制基础
下面我们以用户注册为例,绘制一个基础的时序图,并依次讲解每一个元素的具体含义。在注册链路中,首先用户在浏览器上填写注册表单,点击发送按钮,会调用后端的注册服务去创建注册信息,在注册服务中,会调用账号服务创建对应的账号信息,以及绑定一些关联关系,创建成功后,调用登录服务去生成对应的登录token,下发登录态,最后发送相关的注册消息给下游。整体的时序图代码如下所示:
@startuml
'https://plantuml.com/sequence-diagramautonumberactor "用户" as User
participant "浏览器" as browser
participant "register-service" as registerService
participant "user-service" as userService
participant "login-service" as loginService
participant "下游" as merchantUser -> browser:填写注册表单,点击注册
browser -> registerService: registerFacade#register
registerService -> userService: accountFacade#createAccount
userService --> registerServiceregisterService -> loginService: loginService#login
loginService --> registerService: 登录态tokenregisterService ->> merchant: 发送注册成功消息
registerService --> browser
browser --> User
@enduml
其中,上述代码相关的元素,表示的含义如下:
元素 | 含义 |
---|---|
actor | 系统角色,可以是人或其他系统,子系统,以一个小人图标表示 |
participant | 参与者,一般是调用的服务或组件 |
-> | 同步消息,消息的发送者将控制传递给消息的接收者 |
- - > | 返回消息,表示从过程调用返回 |
->> | 异步消息,消息发送者通过消息把信号传递给消息的接收者,然后继续自己的活动,不等待接收者返回消息或控制 |
生命线
在时序图中,一般我们还会对每一个参与的角色,画上相关的生命线,用于表示对象的调用过程。在plantUML中,我们用activate表示激活生命线,用deactivate表示终止生命线。
我们改造刚才的代码,改造结果如下:
@startuml
'https://plantuml.com/sequence-diagramautonumberactor "用户" as User
participant "浏览器" as browser
participant "register-service" as registerService
participant "user-service" as userService
participant "login-service" as loginService
participant "下游" as merchantactivate User
User -> browser:填写注册表单,点击注册
activate browser browser -> registerService: registerFacade#register
activate registerServiceregisterService -> userService: accountFacade#createAccount
activate userService
userService --> registerService
deactivate userServiceregisterService -> loginService: loginService#login
activate loginService
loginService --> registerService: 登录态token
deactivate loginServiceregisterService ->> merchant: 发送注册成功消息
registerService --> browser
deactivate registerServicebrowser --> User
deactivate browserdeactivate User
@enduml
颜色
在plantUML中,我们可以通过设置消息、文本、生命线的问题,来提升时序图的视觉效果,以更好地区分每个系统以及系统与系统之间地调用关系,突出时序图的重点信息。
对于actor和参与者,我们在定义的时候设置颜色信息,如下代码所示:
actor "用户" as User #orange
participant "浏览器" as browser #6ACCEF
participant "register-service" as registerService #6ACCEF
participant "user-service" as userService #6ACCEF
participant "login-service" as loginService #6ACCEF
participant "下游" as merchant #6ACCEF
对于消息,我们在第一个"-"后面,通过加上[#颜色]这种方式,来设置对应的消息颜色,如下代码所示:
registerService -[#red]>> merchant: 发送注册成功消息
对于文本信息,我们通过在文本前面,加上color:#颜色的方式,设置文本内容颜色,如下代码所示:
registerService -[#red]>> merchant: <color:#red>发送注册成功消息
对于生命线,我们在激活生命线的时候,在后面加上颜色信息,如下代码所示:
activate User #orange
activate browser #6ACCEF
整体改动参考代码如下:
@startuml
'https://plantuml.com/sequence-diagramautonumberactor "用户" as User #orange
participant "浏览器" as browser #6ACCEF
participant "register-service" as registerService #6ACCEF
participant "user-service" as userService #6ACCEF
participant "login-service" as loginService #6ACCEF
participant "下游" as merchant #6ACCEFactivate User #orange
User -> browser:填写注册表单,点击注册
activate browser #6ACCEFbrowser -> registerService: registerFacade#register
activate registerService #6ACCEFregisterService -> userService: accountFacade#createAccount
activate userService #6ACCEF
userService --> registerService
deactivate userServiceregisterService -> loginService: loginService#login
activate loginService #6ACCEF
loginService --> registerService: 登录态token
deactivate loginServiceregisterService -[#red]>> merchant: <color:#red>发送注册成功消息
registerService --> browser
deactivate registerServicebrowser --> User
deactivate browserdeactivate User
@enduml
条件判断
在时序图中,有时候我们会涉及到一些条件判断内容,对于条件判断,我们可以使用alt-else-end来区分不同条件下的调用信息。以登录为例,在登录的时候,如果账密校验通过后,会判断当前账号的状态,如果状态校验通过,生成相关的登录态token,如果校验不通过,那么生成核身token,用户拿到核身token后,去完成发送验证码和校验验证码等核身操作,核身通过后,才能正常登录,整体流程如下:
@startuml
'https://plantuml.com/sequence-diagramautonumberactor "User" as user
participant "login-service" as loginService
participant "account-service" as accountService
participant "token-service" as tokenServiceuser -> loginService:账密登录
loginService -> accountService:密码校验
accountService --> loginService
loginService -> accountService:状态校验
alt 状态校验通过accountService --> loginServiceloginService -> tokenService:生成登录态tokentokenService --> loginService
else 账号被盗accountService --> loginServiceloginService -> tokenService:生成核身tokentokenService --> loginService
endloginService --> user
@enduml
对于不同的条件片段,也可以设置对应的背景颜色,用于区分,如下所示:
@startuml
'https://plantuml.com/sequence-diagramautonumberactor "User" as user
participant "login-service" as loginService
participant "account-service" as accountService
participant "token-service" as tokenServiceuser -> loginService:账密登录
loginService -> accountService:密码校验
accountService --> loginService
loginService -> accountService:状态校验
alt #6ACCEF 状态校验通过accountService --> loginServiceloginService -> tokenService:生成登录态tokentokenService --> loginService
else #orange 账号被盗accountService --> loginServiceloginService -> tokenService:生成核身tokentokenService --> loginService
endloginService --> user
@enduml