通过服务序列图理解依赖关系并设计契约
作者:程序员罗尼 | 发布:2022-01-29 | 原文:https://mp.weixin.qq.com/s/XSXkLESAhC8i1ov55Zc9vg
零、大纲
-
为什么需要服务序列图
-
什么是服务序列图
-
画图工具推荐
-
服务序列图举例
-
总结
-
参考文献
一、为什么需要服务序列图
如今微服务架构下,一个需求很少可以不依赖其他服务单独实现,所以,了解一个需求所涉及的服务并确定他们之间的依赖关系是实现需求的前提
为了更明了的表示服务间的协作关系,我们可以使用服务序列图
二、什么是服务序列图
服务序列图的本质就是 UML 的时序图,只不过参与者从具体类变成了微服务
关于序列图的详细介绍,大家可以参考《UML 精粹:标准对象建模语言简明指南(第3版)》一书的第四章,或者维基百科的介绍
https://en.wikipedia.org/wiki/Sequence\_diagram
三、画图工具推荐
有很多工具可以用来画序列图,比如大型工具 Visio,或者线上的一些画图服务 processOn 或者 LucidChart,甚至用 Windows 自带的画图工具也行,关键是要掌握序列图的元素和意义
我最喜欢的是 PlantUML,一个基于文本的 UML 绘图工具,PlantUML 提供了一些特定的语法,用来表示 UML 图中的元素,然后用自带的绘图引擎解析语法,将其转换成图片
我这里用 IDEA 简单的举一个例子,要想让 IDEA 支持 PlantUML,只需要安装一个插件即可,插件如下图
插件安装成功之后,就可以新建一个以 puml 为后缀的文本文件,写入下面的代码
@startuml
autonumber
actor Customer as C
participant Native as N
participant Server as S
C -> N : login(email, password)
N -> S : requestLogin(email, password)
alt success
S -> N : succeed to login
N -> C : succeed to login
else error
S -> N : fail to login
N -> C : error popup
end
@enduml
然后 IDEA 就会自动生成图片了,如下图
这个图片的生成是实时的,只要语法正确,图片会立刻反映出你做的改动
关于 PlantUML 的详细介绍,大家可以参考官方网站 https://plantuml.com/,根据网站里的例子和文档多画画,就能掌握了
四、服务序列图举例
我们还是回到服务序列图,看看怎么应用到工作中,这里用一个简单的业务服务举例
服务编号:L0006
服务名:发布作品
服务描述:
作为作者
我想要发布我的作品
以便更多的人能阅读我的作品
触发事件:
作者点击“发布文章”按钮
基本流程:
1. 检查作品是否符合发不标准
2. 对作品内容进行违规检查
3. 发布作品
4. 发送消息通知作品的订阅者
替代流程:
1a 如果作品不符合发布标准,提示“作品
不符合发不标准”
2a 如果作品未通过违规检查,提示“作品
包含敏感内容,禁止发布”
3a 如果作品发布失败,提示失败原因
验收标准
1. 作品标题不得超过 50 个字符
2. 作品标题只能使用汉字、英文字符和
数字
3. 作品必须包含标题、作品类型和内
容,且内容字数在规定范围内
4. 作品发布成功后,状态应为“已发布”
5. 作品的订阅者收到作品发布的通知
6. 作品的订阅者可以阅读已发布的作品
根据上面的业务服务规约我们可以画出如下的服务序列图
上图中
Literature 表示作品服务
Censorship 表示合规服务
EventBus 表示企业事件总线
Subscription 表示订阅服务
根据服务序列图我们可以驱动出服务之间的契约
比如
第 1 步中展示了客户端和 Literature 的命令操作的契约
第 2 步中展示了 Literature 和 Censorship 的查询操作的契约
第 3 步展示了 Literature 和 EventBus 的事件消息契约
第 4 步展示了 Subscription 和 EventBus 的事件消息契约
由此可见,通过服务序列图,我们可以清楚的表示出一个业务服务所涉及的不同上下文和他们之间的协作关系,并可以由此驱动出上下文之间的服务契约
五、总结
本文主要介绍了一下服务序列图和它的用途,并给出了一些画图的工具和相关资料,希望大家可以在工作中运用这个工具,在分析需求和沟通设计的时候让头脑更清楚,效率更高
六、参考文献
1.《UML 精粹:标准对象建模语言简明指南(第3版)》
2.《解构领域驱动设计》