在本文中,我將逐步指導您使用圖表即程式碼工具建立動態和互動式視覺化文件。我們將以程式設計方式產生圖表,而不是靜態圖像,確保它們始終是最新的且易於維護。

圖片說明


🎨 圖表作為程式碼

圖表即程式碼是一種允許您透過程式碼而不是傳統圖形工具建立圖表的方法。您可以在文字檔案中編寫程式碼來定義圖表的結構、元件和連接,而不是手動建立圖表。

然後,該程式碼被轉換為圖形圖像,從而更容易在軟體專案中整合和記錄,這對於以程式設計方式建立和更新架構和流程圖特別有用。


什麼是圖表?

是一個🐍Python 函式庫,它實作了圖即程式碼方法,使您能夠透過程式碼建立架構基礎架構圖和其他類型的圖。借助圖表,您只需幾行程式碼即可輕鬆定義雲端基礎設施元件(例如AWSAzureGCP )、網路元素、軟體服務等。

🎉 圖即程式碼的好處

  • 📝將圖表表示為程式碼:直接從程式碼建立和更新圖表,確保敏捷專案的可維護性。

  • 📑自動化文件:從程式碼產生視覺效果,使圖表與目前架構保持一致。

  • 🔄更改控制:追蹤圖表隨時間的修改。

  • 🔍增強清晰度:透過清晰、共享的視覺效果來提高對複雜系統的理解。

  • ✏️可客製化:以靈活且客製化的視覺效果表示雲端基礎架構、工作流程或資料管道。


教學

🐍 庫安裝

我目前在本教程中使用版本'0.23.4'

!pip install diagrams=='0.23.4'

🎨 圖表:節點

該程式庫可讓您以程式設計方式建立架構圖,使用節點來表示不同的基礎架構元件和服務。


節點類型

圖中的節點代表來自不同雲端服務提供者的元件以及其他架構元素。以下是可用節點的主要類別:

  • ☁️雲端供應商:AWS(亞馬遜網路服務)、Azure、GCP、IBM Cloud、阿里雲、Oracle Cloud、DigitalOcean 等。

  • 🏢本地:代表物理上位於公司場所的基礎設施。

  • 🚢 Kubernetes (K8S) :容器編排系統,用於自動化容器化應用程式的部署、擴展和管理(以船輪表示,象徵控制和導航)。

  • 🖥️ OpenStack :用於建立和管理公有雲和私有雲的開源軟體平台。

  • 🔧 Generic :通用節點,可以表示特定於提供者的節點未專門覆蓋的任何元件(交叉工具,表示一類中的不同工具)。

  • ☁️ SaaS(軟體即服務) :表示透過網路作為服務交付的應用程式,例如 Snowflake、聊天服務(Slack、Teams、Telegram 等)、安全性(例如 Okta)或社交網路(劃掉電話)以及SaaS 概念的雲)。

  • 🔧自訂:允許使用者使用儲存在特定資料夾中的 PNG 圖示自訂圖表。這對於表示預設節點(劃掉的自訂工具)未涵蓋的基礎架構元件非常有用。


💻 程式語言

圖庫允許您使用不同的節點來表示各種程式語言。這些節點有助於在圖表中指示架構的任何部分是否使用以特定程式語言開發的腳本或元件。

下面,我們將展示庫中所有可用的語言。如果缺少任何語言,您可以透過將相應的徽標上傳到特定資料夾來新增自訂節點。

# Create the diagram object
with diagrams.Diagram("Programming Languages", show=False, filename="languages"):
    # Get all the languages available in this library
    languages = [item for item in dir(diagrams.programming.language) if item[0] != '_']

    # Divide the representation in two lines
    mid_index = len(languages) // 2
    first_line = languages[:mid_index]
    second_line = languages[mid_index:]

    # Add nodes in the first row
    prev_node = None

    for language in first_line:
        current_node = eval(f"diagrams.programming.language.{language}(language)")
        if prev_node is not None:
            prev_node >> current_node
        prev_node = current_node

    # Add nodes in the second row
    prev_node = None

    for language in second_line:
        current_node = eval(f"diagrams.programming.language.{language}(language)")
        if prev_node is not None:
            prev_node >> current_node
        prev_node = current_node

Image("languages.png")

圖片說明


☁️ AWS(亞馬遜網路服務)

我們可以使用 Amazon 節點,這些節點分為幾個類別,例如:

  • 分析與業務:aws.analytics、aws.business

  • 計算與儲存:aws.compute、aws.storage、aws.cost

  • 資料庫與開發工具:aws.database、aws.devtools

  • 整合與管理:aws.integration、aws.management

  • 機器學習與移動:aws.ml、aws.mobile

  • 網路與安全:aws.network、aws.security

  • 其他:aws.blockchain、aws.enduser、aws.engagement、aws.game、aws.general、aws.iot、aws.media、aws.migration、aws.quantum、aws.robotics、aws.satellite

接下來,我們將表示這些類別之一以視覺化aws.database中的可用節點。

from diagrams import Diagram
from IPython.display import Image
import diagrams.aws.database as aws_database

database_components = []
for item in dir(aws_database):
    if item[0] != '_':
        if not any(comp.startswith(item) or item.startswith(comp) for comp in database_components):
            database_components.append(item)

with Diagram("AWS Database", show=False, filename="aws_database"):
    mid_index = len(database_components) // 2
    first_line = database_components[:mid_index]
    second_line = database_components[mid_index:]

    prev_node = None
    for item_database in first_line:
        current_node = eval(f"aws_database.{item_database}(item_database)")
        if prev_node is not None:
            prev_node >> current_node
        prev_node = current_node

    prev_node = None
    for item_database in second_line:
        current_node = eval(f"aws_database.{item_database}(item_database)")
        if prev_node is not None:
            prev_node >> current_node
        prev_node = current_node

Image("aws_database.png")

圖片說明


☁️ 使用案例

現在,讓我們建立一個簡單的藍圖,對應於在AWS上匯入資料集並訓練機器學習模型。

from diagrams import Diagram, Cluster
from diagrams.aws.storage import S3
from diagrams.aws.analytics import Glue, Athena
import diagrams.aws.ml as ml
from diagrams.aws.integration import StepFunctions
from diagrams.aws.compute import Lambda
from diagrams.aws.network import APIGateway
from IPython.display import Image

with Diagram("AWS Data Processing Pipeline", show=False):

    lambda_raw = Lambda('Get Raw Data')
    # Buckets de S3
    with Cluster("Data Lake"):
        s3_rawData = S3("raw_data")
        s3_stage = S3("staging_data")
        s3_data_capture = S3("data_capture")

    athena = Athena("Athena")
    s3_rawData >> athena
    s3_stage >> athena
    s3_data_capture >> athena

    #  Step Functions Pipeline
    with Cluster("Data Processing Pipeline"):
        step_functions = StepFunctions("Pipeline")

        # Glue Jobs in Step Functions
        with Cluster("Glue Jobs"):
            data_quality = Glue("job_data_quality")
            transform = Glue("job_data_transform")
            dataset_preparation = Glue("job_dataset_model")

        # Define Step Functions Flows
        step_functions >> data_quality >> transform >> dataset_preparation
        s3_rawData >> data_quality

    # SageMaker for model training and deployment
    with Cluster("SageMaker Model Deployment"):
        train_model = ml.SagemakerTrainingJob("job_train_model")
        eval_model = ml.SagemakerGroundTruth("job_evaluate_model")
        endpoint = ml.SagemakerModel("model_enpoint")

    # API Gateway and Lambda for the endpoint
    api_gateway = APIGateway("API_gateway")
    lambda_fn = Lambda("invoke_endpoint")

    # Connection
    lambda_raw >> s3_rawData
    s3_stage >> train_model >> eval_model >> endpoint
    endpoint >> lambda_fn >> api_gateway
    endpoint >> s3_data_capture
    dataset_preparation >> train_model

Image("aws_data_processing_pipeline.png")

圖片說明


儲存庫

下面是全部程式碼的連結,如果覺得有用,可以給個star⭐️並關注我,接收新文章通知。這將幫助我在技術社群中成長並創造更多內容。

https://github.com/r0mymendez/diagram-as-code

如果您想了解如何使用此管道實現文件站點,您可以閱讀我在以下連結中發布的文章


📚 參考資料

  1. 圖表: https://diagrams.mingrammer.com/

原文出處:https://dev.to/r0mymendez/diagram-as-code-creating-dynamic-and-interactive-documentation-for-visual-content-2p93

按讚的人:

共有 0 則留言