<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          1.2 萬 Star!一款 Python 開發(fā)的架構(gòu)圖繪制工具

          共 7195字,需瀏覽 15分鐘

           ·

          2021-01-12 01:04

          ?△點擊上方Python貓”關(guān)注 ,回復(fù)“1”領(lǐng)取電子書

          作者:Lenskit
          來源:開源前哨

          【導(dǎo)語】:你還在用visio繪制架構(gòu)圖嗎?這有一款繪制系統(tǒng)架構(gòu)的開源工具,確定不來看看?

          簡介

          Diagrams 可以讓你用 Python 代碼繪制云系統(tǒng)架構(gòu)。無需使用任何其他工具(比如 visio),你就可以用它來為一個全新的系統(tǒng)架構(gòu)進行原型設(shè)計。當(dāng)然它也可以用來繪制你現(xiàn)有的系統(tǒng)架構(gòu)。

          Diagrams 目前支持的主要提供商包括:AWS、Azure、GCP、Kubernetes、阿里云、Oracle云等。同時它也支持本地節(jié)點、SaaS和主流的編程框架和語言。

          Diagram as Code 還能讓你跟蹤各種版本控制系統(tǒng)中的體系結(jié)構(gòu)圖變化。

          它不能控制任何實際的云資源也不能生成云信息或地形代碼。它只能幫你繪制云系統(tǒng)架構(gòu)圖。

          開源地址:https://github.com/mingrammer/diagrams

          安裝使用

          需要?Python 3.6?版本及以上,使用前請先檢測你的 python 版本。

          繪制時需要使用 Graphviz,所以你需要先安裝 Graphviz。

          macOS 用戶可以使用?brew install graphviz?命令來下載 Graphviz。

          安裝 diagrams

          #?using?pip?(pip3)
          $?pip?install?diagrams

          #
          ?using?pipenv
          $?pipenv?install?diagrams

          #
          ?using?poetry
          $?poetry?add?diagrams

          快速上手

          #?diagram.py
          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")

          運行此代碼,將會生成一個如下的圖:

          web_service

          在你的工作目錄會生成一個web_service.png。

          詳細介紹

          接下來我們主要分四塊介紹一下 diagrams 的構(gòu)成,分別是:圖、節(jié)點、集群和邊。

          一、圖

          Diagram是展現(xiàn)關(guān)系圖最關(guān)鍵的部分。

          基礎(chǔ)使用

          你可以使用 Diagram 類來創(chuàng)建一個關(guān)系圖的上下文。Diagram 構(gòu)造函數(shù)的第一個參數(shù)是你輸出的文件名。我們來看一個例子:

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

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

          在 cmd 輸入?python diagram.py?來執(zhí)行下,代碼會在你的代碼目錄生成一個 simple_diagram.png 文件,可以看到里面只有一個 EC2 節(jié)點。

          Jupyter Notebooks

          Diagrams也可以直接在Jupyter的notebook里使用,示例如下:

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

          with?Diagram("Simple?Diagram")?as?diag:
          ????EC2("web")
          diag

          可選項

          你可以指定輸出文件的格式,默認格式是.png,比如將默認的png格式改為jpg格式:

          (png, jpg, svg, and pdf) 都是允許的格式

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

          with?Diagram("Simple?Diagram",?outformat="jpg"):
          ?EC2("web")

          你也可以使用 filename 參數(shù)來指定輸出的文件名,但此時不能再指定擴展名,因為擴展名是由 outformat 指定的,下面我們將文件名指定為 my_diagram:

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

          with?Diagram("Simple?Diagram",?filename="my_diagram"):
          ????EC2("web")

          也使用 show 參數(shù)來禁用文件自動打開,默認是True:

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

          with?Diagram("Simple?Diagram",?show=False):
          ????EC2("web")

          它還允許自定義Graphviz點屬性選項,比如:

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

          graph_attr?=?{
          ????"fontsize":?"45",
          ????"bgcolor":?"transparent"
          }

          with?Diagram("Simple?Diagram",?show=False,?graph_attr=graph_attr):
          ?EC2("web")

          graph_attr, node_attr 和 edge_attr 都是支持的。具體可查看鏈接:https://www.graphviz.org/doc/info/attrs.html.

          二、節(jié)點

          Node是展現(xiàn)節(jié)點或系統(tǒng)組成的第二個對象。

          基礎(chǔ)使用

          節(jié)點是表示單個系統(tǒng)組件對象的抽象概念。節(jié)點對象由三部分組成:提供者、資源類型和名稱。

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

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

          在上面的例子中,EC2 是由 aws 提供者提供的計算資源類型的節(jié)點。

          可以以類似的方式使用其他節(jié)點對象,例如:

          #?aws?資源
          from?diagrams.aws.compute?import?ECS,?Lambda
          from?diagrams.aws.database?import?RDS,?ElastiCache
          from?diagrams.aws.network?import?ELB,?Route53,?VPC
          ...

          #?azure?資源
          from?diagrams.azure.compute?import?FunctionApps
          from?diagrams.azure.storage?import?BlobStorage
          ...

          #?阿里云?資源
          from?diagrams.alibabacloud.compute?import?ECS
          from?diagrams.alibabacloud.storage?import?ObjectTableStore
          ...

          #?gcp?資源
          from?diagrams.gcp.compute?import?AppEngine,?GKE
          from?diagrams.gcp.ml?import?AutoML?
          ...

          #?k8s?資源
          from?diagrams.k8s.compute?import?Pod,?StatefulSet
          from?diagrams.k8s.network?import?Service
          from?diagrams.k8s.storage?import?PV,?PVC,?StorageClass
          ...

          #?oracle?資源
          from?diagrams.oci.compute?import?VirtualMachine,?Container
          from?diagrams.oci.network?import?Firewall
          from?diagrams.oci.storage?import?Filestorage,?Storagegateway

          數(shù)據(jù)流

          你可以通過使用以下運算符:>>、<< 和 -?連接節(jié)點來表示數(shù)據(jù)流。

          • >>:從左到右連接節(jié)點。
          • <<:從右向左連接節(jié)點。
          • -:無方向連接節(jié)點。無方向的。
          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")?<"stat")
          ????(ELB("lb")?>>?EC2("web"))?-?EC2("web")?>>?RDS("userdb")

          使用?-?和任何?shift?運算符時要注意,可能會因為運算優(yōu)先級導(dǎo)致非預(yù)期的結(jié)果。

          web_services_diagram

          圖展現(xiàn)的順序跟代碼聲明的順序相反。

          你可以使用direction參數(shù)來改變數(shù)據(jù)流方向,默認是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="TB"):
          ????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
          workers_diagram

          組數(shù)據(jù)流

          上面的worker示例有很多冗余流。這種情況下,你可以使用組數(shù)據(jù)流將節(jié)點分組到一個列表中,以便所有節(jié)點同時連接到其他節(jié)點。

          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")
          grouped_workers_diagram

          不能直接連接兩個列表,因為在Python中不允許在列表之間進行移位/算術(shù)操作

          三、集群

          集群允許你將節(jié)點分組放在一個獨立的組中。

          基礎(chǔ)使用

          Cluster表示本地群集上下文。

          你可以使用cluster類創(chuàng)建集群上下文。你還可以將集群中的節(jié)點連接到集群外的其他節(jié)點。

          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?Web?Service?with?DB?Cluster",?show=False):
          ????dns?=?Route53("dns")
          ????web?=?ECS("service")

          ????with?Cluster("DB?Cluster"):
          ????????db_master?=?RDS("master")
          ????????db_master?-?[RDS("slave1"),
          ?????????????????????RDS("slave2")]

          ????dns?>>?web?>>?db_master

          嵌套集群

          嵌套集群也是可以使用的。

          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

          嵌套沒有深度限制。你可以隨意創(chuàng)建任意深度的嵌套集群。

          四、邊

          邊表示節(jié)點之間的邊。

          基礎(chǔ)使用

          Edge是一個對象,表示具有某些附加屬性的節(jié)點之間的連接。

          一個edge對象包含三個屬性:label、color和style,它們對應(yīng)相應(yīng)的graphviz的邊屬性。

          from?diagrams?import?Cluster,?Diagram,?Edge
          from?diagrams.onprem.analytics?import?Spark
          from?diagrams.onprem.compute?import?Server
          from?diagrams.onprem.database?import?PostgreSQL
          from?diagrams.onprem.inmemory?import?Redis
          from?diagrams.onprem.logging?import?Fluentd
          from?diagrams.onprem.monitoring?import?Grafana,?Prometheus
          from?diagrams.onprem.network?import?Nginx
          from?diagrams.onprem.queue?import?Kafka

          with?Diagram(name="Advanced?Web?Service?with?On-Premise?(colored)",?show=False):
          ????ingress?=?Nginx("ingress")

          ????metrics?=?Prometheus("metric")
          ????metrics?<"firebrick",?style="dashed")?<"monitoring")

          ????with?Cluster("Service?Cluster"):
          ????????grpcsvc?=?[
          ????????????Server("grpc1"),
          ????????????Server("grpc2"),
          ????????????Server("grpc3")]

          ????with?Cluster("Sessions?HA"):
          ????????master?=?Redis("session")
          ????????master?-?Edge(color="brown",?style="dashed")?-?Redis("replica")?<"collect")?<????????grpcsvc?>>?Edge(color="brown")?>>?master

          ????with?Cluster("Database?HA"):
          ????????master?=?PostgreSQL("users")
          ????????master?-?Edge(color="brown",?style="dotted")?-?PostgreSQL("slave")?<"collect")?<????????grpcsvc?>>?Edge(color="black")?>>?master

          ????aggregator?=?Fluentd("logging")
          ????aggregator?>>?Edge(label="parse")?>>?Kafka("stream")?>>?Edge(color="black",?style="bold")?>>?Spark("analytics")

          ????ingress?>>?Edge(color="darkgreen")?<>?Edge(color="darkorange")?>>?aggregator

          擴展

          如果你想了解更多,可以移步這里觀看更多的官方示例:https://diagrams.mingrammer.com/docs/getting-started/examples

          Python貓技術(shù)交流群開放啦!群里既有國內(nèi)一二線大廠在職員工,也有國內(nèi)外高校在讀學(xué)生,既有十多年碼齡的編程老鳥,也有中小學(xué)剛剛?cè)腴T的新人,學(xué)習(xí)氛圍良好!想入群的同學(xué),請在公號內(nèi)回復(fù)『交流群』,獲取貓哥的微信(謝絕廣告黨,非誠勿擾?。?/span>~

          近期熱門文章推薦:

          Python 中如何實現(xiàn)參數(shù)化測試?
          一篇文章掌握 Python 內(nèi)置 zip() 的全部內(nèi)容
          Python 3.9 性能優(yōu)化:更快的 list()、dict() 和 range() 等內(nèi)置類型
          重寫 500 Lines or Less 項目 - A Simple Object Model

          感謝創(chuàng)作者的好文
          瀏覽 80
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  九色免费网站 | 色噜噜日韩精品欧美一区二区 | 阿宾 麻豆| 中文字幕青娱乐 | 另类日韩欧美激情视频 |