ArchGuard架構分析器釋出:多語言、跨專案架構資料生成,助力AI時代知識挖掘

TL;DR:https://github.com/archguard/archguard
過去的幾個月裡,我們一直在探索用 AI 輔助跨專案、跨大量微服務的系統的開發。其中一個重要的話題就是,從現有的軟體架構去生成知識,文件是落後、多版本的, 只有程式碼才保留著真相。
ArchGuard 是一個由 Thoughtworks 發起的面向微服務(分散式場景)下的開源架構治理平臺。它可以在設計、開發過程中,幫助架構師、 開發人員分析系統間的遠端服務依賴情況、資料庫依賴、API 依賴等。並根據一些架構治理模型,對現有系統提出改進建議。
在經歷了大量的分析與實踐之後,我們從 ArchGuard 提取了新的 analyser:Architecture Analyser。與現有的程式碼、Git、OpenAI、Estimate 等 analyser 相比, Architecture Analyser 是一個集大成者,它集成了其它 analyser 的功能,同時還提供了更多的功能。

生成式 AI 時代的知識汲取

與其說是,AI 時代的架構知識,不如說是 AI 時代的架構知識生成。過去,我們透過分析 API 呼叫鏈等,並不能很好的得到業務、架構等資訊。而,當我們提供了 相對充裕的資訊,如:API 呼叫鏈、資料庫依賴、訊息佇列依賴等,就能讓 AI 生成出對應的資訊資產。

場景 1:領域模型中的領域知識

對於後端程式碼而言,知識的核心在於其 “領域知識”,即在富血模型、領域驅動設計等一系列技術實踐方式中,我們透過領域模型來表達業務邏輯。在不同的語言、 工具和平臺中,它們有著各種不同的實現,如:
  • 在胖服務層的 MVC 架構中,我們可以結合資料庫表來獲取關鍵的領域知識;
  • 在 DDD 四層架構下,我們可以透過領域模型來獲取領域知識;
  • 在採用 Protobuf 的微服務架構中,我們可以透過解析 IDL 檔案來獲取領域知識。
  • ……
這樣一來,我們就可以讓結合類名、方法名、欄位名等資訊,來生成出對應的領域知識。如下結合是 ArchGuard 分析器的輸出:
  1. 上報播放資料,包括應用、客戶端、版本、渠道、位置、查詢ID、裝置ID、會話ID、總時長、播放時長、資料型別、頁面和模組。
在下一步中,就可以結合使用者的問題來找到對應的匹配程式碼。

場景 2:從呼叫鏈中汲取業務知識

過去,在 ArchGuard 中,我們執行通常 feat-datamap 模組來生成資料庫地圖。它只能幫我們做一些視覺化,由人來判斷,潛在的、可能的業務邏輯。而當我們由 ArchGuard 分析完後,就可以讓 AI 生成出對應的業務邏輯。
如下是 ArchGuard 分析器的輸出:
  1. packageName: go-common/app/interface/openplatform/monitor-end/dao
  2. methods:Dao.Groups
  3. sqls:`SELECT id, name, receivers, `interval`, ctime, mtime FROM `alert_group` WHERE id in (0) AND is_deleted = 0`
就可以生成如下的資訊:
  1. 查詢未刪除的告警組詳情,涉及欄位包括:ID、名稱、接收者、告警間隔、建立時間及更新時間。
在結合由 AI 生成領域詞典之後,我們可以得到更準確的描述。但是我的場景之下,只需要這樣一個簡單的描述,具體可以根據實際情況來調整 prompt。

ArchGuard 架構分析器如何助力分析領域知識?

ArchGuard 架構分析器的本質是對原有的知識進行再提煉,以將專家經驗轉換為分析工具和資料。再結合 AI 的生成能力,替換傳統的人力分析方式,以解決 知識的提取問題。

ArchGuard 的架構模型

既然討論到架構分析,那肯定就涉及到 ArchGuard 的架構模型。由於當前階段的 ArchGuard 更多的是開發態的資料分析,所以早期我們採用的是《實用體系軟體結構》 中的四層架構:
  • 概念架構。領域特定元件
  • 模組架構。系統、子系統、模組、層
  • 執行架構。程序、任務、執行緒、客戶端、伺服器、緩衝區、訊息佇列
  • 物理架構。檔案、目錄、連結器庫、包、程式庫
詳細見,我們在 GitHub 的文件:https://archguard.org/concepts 。如下是 IDEA 可視化出來的架構模型:
當然,這個模型還有待進一步最佳化,比如我們新增的 outboundService、 architectureStyle,在當前尚還屬於一個不太適合的位置。

場景示例:支援策略化的 Code Review

在熱門的 Code Review 領域,除了結合 Sonarlint 之外,我們可以基於物理架構來設計多種 review 策略。諸如於:
  • 基於變更頻率與行數,來決定 review 的上下文;
  • 基於程式碼複雜度,來決定 review 的優先順序;
不過,考慮到生成式 AI 的侷限性,還是有待進一步研究。

ArchGuard 架構分析器的資料來源

ArchGuard 架構分析器的資料來源於我們持續豐富的架構知識庫,包括:
  • 在 1.0 版本中,支援的架構度量
  • 在 1.4 版本中,支援了程式碼中的:程式碼到資料庫呼叫關係的展示
  • 在 1.6 版本中,支援了對於軟體依賴的分析
  • 在 2.0.0 版本中,支援的程式碼複雜度分析
  • 在 2.0.3 版本中,支援的 OpenAPI 分析
  • 在 2.2.2 版本中,我們提供了對 Protobuf 檔案的解析和分析功能,支援自動提取服務、訊息、介面等元素,構建服務地圖和依賴關係圖。
  • ……
隨著,越來越多的公司使用 ArchGuard,其資料來源也越來越豐富。

如何使用 ArchGuard 架構分析器?

步驟 1:使用 CLI 執行

你可以直接從 GitHub 下載最新的 scanner_cli-2.2.8-all.jar,又或者是透過 shell 來一鍵安裝 ArchGuard 架構分析器:
  1. curl -fsSL archguard.org/install-cli.sh | bash
隨後,你可以透過如下命令來執行 ArchGuard 架構分析器:
  1. archguard --language=go --type=architecture --output=json --path=.
(PS:如果你使用的是 jar 包,請使用 java -jar scanner_cli.jar --language=go --type=architecture --output=json --path=.
其中, --language 用於指定語言, --type 用於指定型別, --output 用於指定輸出格式, --path 用於指定掃描路徑。隨後,會輸出 0_architecture.json 便是 ArchGuard 分析的架構資料。還可以透過如下命令來上傳到遠端伺服器:
  1. archguard --language=go --type=architecture --output=http --server-url=http://localhost:3000--path=.--system-id=1
其中的 --output=http 用於指定輸出到遠端伺服器, --server-url 用於指定遠端伺服器地址, --system-id 是用於指定後端標識。

步驟 2:實現服務端

預設的,ArchGuard 架構分析器預設的路徑是 /api/scanner/1/reporting,如你可以使用 curl 來上傳資料:
  1. curl -X POST -H "Content-Type: application/json"-d @0_architecture.json http://localhost:3000/api/scanner/1/reporting
對應的,只需要在服務端實現對應的介面即可。

總結

複雜的問題得迴歸複雜的本源:軟體架構。ArchGuard 架構分析器的釋出,是我們對於軟體架構的一次嘗試。我們希望透過 ArchGuard 架構分析器,讓 AI 能夠更好的理解軟體架構,從而更好的生成軟體知識。


相關文章