时序图经验分享

梦康 2021-09-02 22:07:10 751

前段时间重启两年前的某个项目特别复杂,系统依赖深度八九层,当时沟通了 N 多团队,但是文档留下来的比较有限,只有某几个最核心的交易链路的时序图,其他的架构设计和逻辑都在各个开发人员的脑子里了。前段时间重新上线了,每次遇到个工单,想要排查问题,就得翻代码去寻找一些思路,极其的痛苦。

经过实践检验,对于这种系统间交互比较复杂,链路比较长的项目,时序图的言语表现力可能更适合我,能帮我回忆起 95% 的逻辑,还有 5% 的细节需要去顺着思路看下代码即可。

自动生成时序图

如果是单体应用内部逻辑复杂,推荐使用一款 idea 里的时序图插件 http://vanco.github.io/SequencePlugin 支持动态的编辑,可以删除一些不要的非核心逻辑,然后生成一张图保存下来。
01.png
02.jpg
屏幕快照 2021-09-01 下午8.39.07.png

手动绘制时序图

对于分布式微服务架构的项目,这就无能为力,只能我们手动绘图了,尝试了很多绘图软件,付费的也用过,都用得不是很舒服,文本性的绘图相对来说反而更高效更便捷,尝试对比了 https://plantuml.com/https://mermaid-js.github.io/ 颜值上,后者更现代;但是功能完整性和项目兼容性,前者更佳。不吹不黑。两个网站支持在线编写和渲染,还是前者更佳。

20210901211928_gaus.jpg

图片没有任何具体的业务,仅仅做演示,又使用下面的代码做了下高斯模糊处理(同事傲杨的代码)

<?php
/**
 * 用法
 * php gaus.php xxx.jpg
 * php gaus.php xxx.jpg 20
 */

$fn  = dirname($argv[1]) . DIRECTORY_SEPARATOR . basename($argv[1]);
$rep = !isset($argv[2]) ? 15 : intval($argv[2]);

if (!file_exists($fn)) {
    exit("no such file");
}

$img = imagecreatefromjpeg($fn);
for ($i = 0; $i < $rep; ++$i) {
    imagefilter($img, IMG_FILTER_GAUSSIAN_BLUR);
}

imagejpeg($img, str_replace(".", "_gaus.", $fn), 100);

让时序图更有表达力

一张好的时序图能让自己瞬间回忆起项目的来龙去脉,给人介绍项目也能以图代码,无需多费口舌,我总结了一下这些经验和细节

  1. 区分消息类型

    1. 一条实线和实心箭头表示同步消息,在 PlantUML 里是 ->
    2. 一条实线和大于号表示异步消息,在 PlantUML 里是 ->>
    3. 小于号和虚线表示返回消息,在 PlantUML 里是 -->,这个我看很多人也都没有完全准守,即使是 PlanUML 的官方演示文档里也没准守这个标准。
  2. 对消息序列编号,autonumber 能更清晰的找到调用的前后逻辑
  3. 强调重点的方式

    1. 使用颜色突出,可以给实体加颜色,给消息加颜色
    2. 增加对消息增加注释
  4. 使用组合消息,可以表现出 if else 以及循环,并且可以嵌套使用。

如上图所示,具体的操作大家可以参考 https://plantuml.com/zh/sequence-diagram 官方文档,非常的详细。磨刀不误砍柴工,相信大家不用再 996 啦。