使用pyecharts绘制系统依赖关系图
背景介绍
近期梳理了公司内部系统之间的数据关系,得到了多个excel格式的统计文件,每个文件包含了该系统自身数据清单、依赖的其他系统的数据清单、对其他系统供应的数据清单。
各系统之间依赖关系复杂,所以我想使用一些绘图工具,以可视化图形图表的形式展现这些系统之间的数据关系,给观众形成一种非常直观的印象。
一般情况下,应该是有类似于调用链跟踪等工具,比如Java技术栈使用Skywalking或美团CAT等工具,做到调用级别上的跟踪和相互关系的可视化展示。
这种情况下,也许不需要再编写程序来绘制依赖关系了。这两种工具可以很详细的绘制组件或服务之间的调用关系。
不过,本文介绍如何绘制粒度稍微粗一些的关系图,没有细化到具体某个接口调用。主要的工具是pyecharts,百度开源的工具包。在绘制的时候,只使用了依赖表和对外供应两张表。
可视化思路
可视化的方式有很多种,我的需求是以最小成本,最快速度把这个可视化效果达成。不管是使用类似思维导图或draw.io这种工具,或者是编码实现,只要可以实现,任何方式都可以考虑。
我考虑的第一种方式,是使用draw.io。它确实提供了很多模型,但是最终我发现,手动去绘图,会花很多时间,然后效果还一般。
大概花了总共2小时的时间,发现用draw.io来绘制十多个系统之间复杂的连接,还是有点难。
所以,我考虑第二种方式是使用思维导图。确实思维导图很快可以把图建立起来,因为执行一次回车
操作就可以生成一个方框,速度非常快。但是我嫌这个图不好看。
还没等我完成全部的系统和系统之间的连线,我就不想再做下去了。
最后,我决定使用编码的方式实现。这样的好处有两点:第一是生成的图形会很好看,效果好,第二是后续的维护会自动化,一劳永逸。
实现可视化
经过调研了几个框架,包括pyecharts,politly,最终我发现pyecharts的关系图其实可以实现我的想法。
我基于https://gallery.pyecharts.org/#/Graph/graph_les_miserables这个案例实现了想要的效果。
效果图如下,使用菱形图表示系统,圆形便是系统的数据:
编码实现
相关的代码或文件分三部分,第一部分是包含系统关系的原始文件,放在files_excel目录下,第二部分是用于生成表示图形信息的json文件的python脚本build_json_system_relation.py
,第三部分是绘制图形的代码文件generate_relations.py
。
代码地址:https://gitee.com/zackli518/charts_system_relations/tree/master
数据关系文件
files_excel目录下的文件,每个文件包含两个sheet(表单),即对外供应数据表清单
和所依赖外部系统数据表清单
。
对外供应数据表清单
表单的格式如下:
目的系统 | 数据英文名 | 数据中文名 | 数据交换方式 |
---|---|---|---|
B | table1 | 数据1 | 交易线 |
C | table2 | 数据2 | 数据线 |
D | table3 | 数据3 | 数据线 |
所依赖外部系统数据表清单
表单的格式与上面类似,不过第一列是源系统。
上述两个文件就是我们要使用到的系统数据关系文件。如果有工具可以产生上述文件,那所有的步骤都可以自动化完成,包括生成本文讲的这种简单的关系图。如果不能自动生成,那么可能需要人工维护。所以建议还是都能实现自动化。关于如何产生上述关系,不在本文范围内,不过我觉得这种关系在任何一家公司都会维护起来的,比如通过提供一个维护页面维护上述两张表。
生成表示图形中节点和边的JSON文件
现在我们已经有了原始关系文件,这种文件一般是for人类的,就是说给人看和维护的。那么现在我们需要把它们转成给代码使用的json文件。
json文件格式大致如下,可以先了解一下:
{
"categories": [
{
"name": "data node",
"symbol": "circle"
},
{
"name": "system node",
"symbol": "diamond"
}
],
"nodes": [
{
"label": "SYSTEM_A",
"id": "SYSTEM_A",
"category": 0
},
{
"label": "SYSTEM_B",
"id": "SYSTEM_B",
"category": 1
},
{
"label": "SYSTEM_C",
"id": "SYSTEM_C",
"category": 1
},
{
"label":