当前位置: 首页 > news >正文

[python] 基于diagrams库绘制系统架构图

Python的Diagrams库允许通过简单的Python代码绘制云系统架构,实现对新的系统架构进行原型设计。Diagrams的官方仓库地址见:diagrams。Diagrams的官方文档和使用示例见:diagrams-doc。

0 安装

Diagrams库依赖于开源的图可视化工具Graphviz。Python下的Graphviz使用见python模块graphviz使用入门。Graphviz在windows下的安装见Graphviz安装配置教程。在linux下的安装,命令行输入以下指令即可:

sudo apt-get install graphviz

sudo apt-get install graphviz graphviz-doc

Diagrams库需要在Python3.6及以上环境运行,安装graphviz后,输入以下指令安装diagrams库:

pip install -U diagrams

安装完成后,以下代码成功输出结果表示Diagrams库安装成功。

# 代码示例
from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB

with Diagram("Web Service", show=False):
    ELB("lb") >> EC2("web") >> RDS("userdb")
# 展示图片
# from IPython.display import Image
# Image(url= "web_service.png")

# 使用Pillow库
from PIL import Image  

image = Image.open("web_service.png")
image.show()

在这里插入图片描述

1 模块说明

1.1 Diagrams

Diagrams是绘制图像的主要模块,Diagrams用于设置全局图上下文。

Diagram构造函数的第一个参数将设置图片名称,如果没有设置输出图片文件名,将用图片名称做为输出图片的文件名。

from diagrams import Diagram
from diagrams.aws.compute import EC2

# 输出文件图片名会自动将大写字母转为小写,空格转为下划线,并默认输出png格式图片
with Diagram("SIMPLE IMAGE",show=False):
    EC2("web")
# 展示图片
image = Image.open("simple_image.png")
image.show()

在这里插入图片描述

可以通过设置outformat和filename来设置输出图片的格式和文件名。

from diagrams import Diagram
from diagrams.aws.compute import EC2

with Diagram("Simple Diagram", outformat="jpg", filename="MY Diagram",show=False):
    EC2("web")
# 展示图片
image = Image.open("MY Diagram.jpg")
image.show()

在这里插入图片描述

此外还可以设置Graphviz中的graph_attr, node_attr和edge_attr属性来控制图形参数,这些属性具体介绍含义见Graphviz_Attributes。

from diagrams import Diagram
from diagrams.aws.compute import EC2

graph_attr = {
    "fontsize": "24",
    "bgcolor": "transparent",
    "fontcolor": "red"
}

with Diagram("Simple Diagram", show=False, graph_attr=graph_attr):
    EC2("web")
# 展示图片
image = Image.open("simple_diagram.png")
image.show()

在这里插入图片描述

1.2 Nodes

节点是图表的基本组成部分。一个节点对象由三部分组成:提供者、资源类型和节点名称。

例如下面的示例,aws表示提供者,compute表示资源类型,EC2表示节点名称。可以查看官方文档,看看不同节点的使用。比如Azure、Alibaba、IBM提供的节点。

from diagrams import Diagram
from diagrams.aws.compute import EC2

with Diagram("Simple Diagram"):
    EC2("web")

通过使用以下运算符连接节点来表示数据流:

>> : 从左到右连接节点。
<< : 从右到左连接节点。
- :无方向连接节点。无向的。
from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB
from diagrams.aws.storage import S3

# 先声明的数据流后渲染
with Diagram("Web Services", show=False):
    ELB("lb") >> EC2("web") >> RDS("userdb") >> S3("store")
    ELB("lb") >> EC2("web") >> RDS("userdb") << EC2("stat")
    (ELB("lb") >> EC2("web")) - EC2("web") >> RDS("userdb")
# 展示图片
image = Image.open("web_services.png")
image.show()

在这里插入图片描述

通过设置Diagram的direction参数,可以设置图表数据流的方向,默认从左到右(LR),参数如下:

  • TB,从上往下
  • BT,从下往上
  • LR,从左往右
  • RL,从右往左
from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB

with Diagram("Workers", show=False, direction="BT"):
    lb = ELB("lb")
    db = RDS("events")
    lb >> EC2("worker1") >> db
    lb >> EC2("worker2") >> db
    lb >> EC2("worker3") >> db
    lb >> EC2("worker4") >> db
    lb >> EC2("worker5") >> db

# 展示图片
image = Image.open("workers.png")
image.show()

在这里插入图片描述

当然也可以将多个节点表示为一组,即将多个节点放入一个python列表中,但是不支持列表与列表之间进行直接连接。

from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB

with Diagram("Grouped Workers", show=False, direction="TB"):
    ELB("lb") >> [EC2("worker1"),
                  EC2("worker2"),
                  EC2("worker3"),
                  EC2("worker4"),
                  EC2("worker5")] >> RDS("events")

# 展示图片
image = Image.open("grouped_workers.png")
image.show()

在这里插入图片描述

1.3 Clusters

通过创建Cluster部件,可以将部分节点进行聚合,并与其他节点隔离开来。

from diagrams import Cluster, Diagram
from diagrams.aws.compute import ECS
from diagrams.aws.database import RDS
from diagrams.aws.network import Route53

with Diagram("Simple Cluster", show=False):
    dns = Route53("dns")
    web = ECS("service")
    
    # 设置集群,第一值为集群名
    with Cluster("DB Cluster"):
        db_primary = RDS("primary")
        db_primary - [RDS("replica1"),
                     RDS("replica2")]
    # 设置数据流方向
    dns >> web >> db_primary

# 展示图片
image = Image.open("simple_cluster.png")
image.show()

在这里插入图片描述

同时也支持创建嵌套节点,嵌套节点中也可以创建多个cluster。

from diagrams import Cluster, Diagram
from diagrams.aws.compute import ECS, EKS, Lambda
from diagrams.aws.database import Redshift
from diagrams.aws.integration import SQS
from diagrams.aws.storage import S3

with Diagram("Event Processing", show=False):
    source = EKS("k8s source")

    with Cluster("Event Flows"):
        with Cluster("Event Workers"):
            workers = [ECS("worker1"),
                       ECS("worker2"),
                       ECS("worker3")]

        queue = SQS("event queue")

        with Cluster("Processing"):
            handlers = [Lambda("proc1"),
                        Lambda("proc2"),
                        Lambda("proc3")]

    store = S3("events store")
    dw = Redshift("analytics")
    
    # 设置数据流方向
    source >> workers >> queue >> handlers
    handlers >> store
    handlers >> dw

# 展示图片
image = Image.open("event_processing.png")
image.show()

在这里插入图片描述

1.4 Edges

edge用于设置节点间连接线的属性。包含三个属性:标签label、颜色color和样式style,它们对应于Graphviz的edge属性设置。

from diagrams import Cluster, Diagram, Edge
from diagrams.alibabacloud.compute import ElasticSearch
from diagrams.alibabacloud.compute import FunctionCompute
from diagrams.alibabacloud.compute import ContainerService

with Diagram(name="Web Service", show=False):
    # 设置三个节点
    service = ContainerService("service")
    compute = FunctionCompute("compute")
    search = ElasticSearch("search")
    # 设置连接方式
    service >> Edge(color="firebrick", style="dashed") >> compute
    # 设置连接方式
    compute - Edge(color="orange", label="link") >> search
    service  >> search


# 展示图片
image = Image.open("web_service.png")
image.show()

在这里插入图片描述

2 参考

  • diagrams
  • diagrams-doc
  • Graphviz
  • python模块graphviz使用入门
  • Graphviz安装配置教程
  • Graphviz_Attributes

相关文章:

  • 2022 年全国职业院校技能大赛(中职组) 网络安全竞赛试题D模块评分标准
  • C++ 语法基础课1 —— 变量、输入输出、顺序语句
  • M的编程备忘录之C++——map和set
  • 《Orange‘s 一个操作系统的实现》第六章
  • Spring Cloud 拉取 Nacos 中配置文件
  • python-中断time.sleep一种更优雅的办法:event.wait
  • 【毕业设计】大数据公交数据分析与可视化 - 大数据 python falsk
  • Hadoop与Spark中的Shuffle过程梳理
  • CH9101芯片应用—硬件设计指南
  • [NCTF2019]True XML cookbook
  • 湖仓一体电商项目(十二):编写写入DM层业务代码
  • 遥感生态指数(RSEI)——四个指数的计算
  • 9--RNN
  • JDBC的使用
  • 《Mycat分布式数据库架构》之数据切分实战
  • [PHP内核探索]PHP中的哈希表
  • 分享的文章《人生如棋》
  • [NodeJS] 关于Buffer
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Android优雅地处理按钮重复点击
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • gops —— Go 程序诊断分析工具
  • npx命令介绍
  • React组件设计模式(一)
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • SQL 难点解决:记录的引用
  • 分享一份非常强势的Android面试题
  • 给Prometheus造假数据的方法
  • 给新手的新浪微博 SDK 集成教程【一】
  • 后端_MYSQL
  • 计算机在识别图像时“看到”了什么?
  • 排序算法之--选择排序
  • 收藏好这篇,别再只说“数据劫持”了
  • 译有关态射的一切
  • puppet连载22:define用法
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $().each和$.each的区别
  • (3)选择元素——(17)练习(Exercises)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (黑马C++)L06 重载与继承
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (一)基于IDEA的JAVA基础12
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .netcore如何运行环境安装到Linux服务器
  • .net反编译的九款神器
  • .NET开源快速、强大、免费的电子表格组件
  • .net实现头像缩放截取功能 -----转载自accp教程网