graphviz 繪制架構圖


 

 

架構圖:

  1.依賴調用關系.(類似文獻引用關系, graphviz 自動將每一次調用升一次層級)

  2.依賴調用可能是上下層級調用,也可能是同層級引用. 需人工去梳理出這些關系

  3. 引用多的用顏色標識出來

  4. 讀來寫,讀來透傳(phoenix), 讀來組合(加上 uid 的帳戶層) ,讀來通知(支付模塊)

      產品考慮的是以人為對象的算法.

      架構師要考慮各個細節流程內部的算法. 比如分潤規則的 n 個規則匹配,用策略模式.

  5. 架構的另外一個本質是封裝變和不變. 變的東西有幾個層面: 1.抽象為業務字段,用 for,if 能解決業務的可變性. 變量能否解決,type 能否解決,type 接口類能否解決 2.配置能否解決 3. 終極,業務可變性實在太大,變量是代碼.

        舉例: dd 平台化: 中台是引擎層. 內部有各個流程,層級(訂單,支付). 各個業務線也有自己的層級(訂單,支付). 業務線的支付依賴於業務線訂單,同引擎層.

         直接畫圖,結果是這樣的:

         這張圖將業務線訂單和引擎支付放在同一個層級了. 錯誤,凌亂.

        正確的層次+依賴圖:

 

改進,子圖排版(2007-06-22 https://stackoverflow.com/questions/12463541/subgraph-layout-in-graphviz  The following was achieved by using invisible edges and constraint=false on some edges:

https://stackoverflow.com/questions/8002352/how-to-control-subgraphs-layout-in-dot)

           被表結構誤導: 本來以為業務層只有 trade 相關邏輯. (因為表上只有 trade 表 是分為 代保 和 普通代) . 業務層的流程和引擎層是相同的.

         這是更復雜的垂直業務切分案例.

        第一份工作: 最簡單的垂直業務切分.

        第二份工作: 水平切分.(訂單域,支付域,營銷域) 大流程;

        第二份工作中期: 1. 模塊內流程切分.(trade,賬單,支付,分潤,流水,發票) 2. 表結構的拆分.(帳戶系統誕生) 邊界(網關系統誕生) 將字段抽象為存儲,更通用.

        第二份工作后期: 含引擎的垂直切分.(訂單域,支付域) 借鑒 1.企業支付(含整個流程的獨立支付域) 2.平台上的中台策略

      舉例2: phoenix 支付. 統一了所有支付到一個接口. 大部分都是相同的.不同的東西都通過 map 來傳遞. 更通用是通過 josn+泛化調用. 其他業務字段定義合理也很關鍵. 有時候1對多關系變更了,一切都變了.

           中間插入最好插入到業務上游(生命周期上游)

 

 

高級應用 寫代碼,編程繪制架構圖(分層拓撲圖)

      1. 子圖,子圖連接,子圖里包含子圖. 邊界線 虛線? graph[style=dotted];https://stackoverflow.com/questions/8366314/drawing-a-border-around-a-set-of-vertices-in-graphviz

      2. 布局控制  相同子圖下的節點保持水平(http://graphs.grevian.org/example). 子圖aligning 對齊 :constraint=false 強制排序節點. http://www.graphviz.org/content/aligning-subgraphs

      3. 排版控制  默認排版原則,按箭頭有序. 定制有序: rank = same; 子圖不是整體. 不能以子圖排版. (需要更牛逼的自適應排版,有交互有層級的拓撲圖)

      4. 代碼變量驅動. 4.1 可以只改變某個參數. 4.2 可改變節點名. [詳細見附件]

    

多看看http://www.graphviz.org/forums/general-discussion 和 stackoverflow 上的關於 graphviz 的問題.

base on graphviz

 

附件:

代碼變量驅動:

  digraph G {

    a -> c[label="123",color=red];
    a -> b;
    b -> c [label="1235",constraint=false];

    b[label=c]; //只改節點名
    c[label=b];
    a -> c[lable="234"]; //只改 lable.
  }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM