開源架構治理平臺 ArchGuard,專治分散式場景下各種不服

phodal發表於2022-04-06

過去的 10 年間,軟體的架構發生了巨大的變化,從早先流行的單體 MVC 架構,變成了所謂的 5:5 開,即分散式 vs 單體。只是呢,有大量的軟體開發人員,無法看到系統的全貌,又或者是從單體的思維轉變過來。於是,哪怕是在使用了微服務的情況下,但是實現的卻又是一個一個的單體,只是它們變成了“分散式的單體”。

架構治理變成一個急待解決的問題。

我們所面臨的挑戰

作為一個架構師或者是軟體開發人員,在架構治理上,我們面對的諸多挑戰有:

  • 設計與實現不匹配。設計的軟體架構與真正實施後的架構,存在著巨大的差異。而這個差異,往往需要編碼上線、乃至一段時間之後才能發現。
  • 沒有規範/不遵守規範。作為一個資深的開發人員,我們制定了一系列的規範,但是沒有多少團隊人員願意遵守。
  • 程式碼量巨大,難以識別問題。一個由十幾個或者幾十個微服務建立的系統,往往難以快速發現它們之間錯綜複雜的關係。
  • 架構模型的每個層級都可能出錯。如服務間 API 耦合、程式碼間耦合、資料庫耦合等等。
  • 架構師、開發人員自身缺乏豐富的經驗。知道有問題,但是說不出來哪有問題,也不知道如何改進。

應對這些挑戰,我們需要一個平臺/工具,來幫助我們解決這些問題。所以,結合我們過去的一系列軟體開發和重構經驗,我們(Thoughtworks 的諮詢師們)從 2020 年(疫情開始的時候)開始了架構治理平臺 ArchGuard 的開發。

如今呢,它開源了,GitHub:https://github.com/archguard/archguard

它能做點什麼?

ArchGuard 按照流行的 C4 架構模型進行分層化的分析。即在 System Context(上下文), Container(容器), Component(部件), Code(程式碼)四個不同的架構檢視上,它們是不同的抽象級別,對應於不同的受眾,如團隊內開發人員關心程式碼內的依賴,架構師關心元件、視窗間的依賴。

Home

而在最後的實現形式上,它們是以程式碼庫和文件的形式存在的。ArchGuard 是基於程式碼的靜態分析工具,未來也將基於設計提供這方面的功能。

在 ArchGuard 中,我們需要先建立一系列的系統元件,即要配置好對應的語言和 GitHub 地址,就可以對程式碼進行掃描。

元件/模組

在元件檢視內,我們可以看到單個專案的總體情況,根據對應的程式碼提交歷史,不穩定程式碼模組:

Summary

API 宣告和使用情況等:

API Usage

並通過體量維度、耦合維度、內聚維度、冗餘維度、測試維度五大維度對架構進行評估,以及一系列的指標來分析系統的情況:

Evolution

系統依賴分析:服務地圖

注意:這種依賴分析方式,依賴於團隊開發人員擁有統一的編碼規範。

而針對於微服務來說,ArchGuard 可以自動化地分析不同服務之間的依賴關係,並將這種依賴關係視覺化出來:

API Analysis

PS:由於 ArchGuard 過去是微服務架構,合併成單體之後,存在自己呼叫自己的情況。

同時,系統能幫你自動分析哪些 API 是使用的,哪些 API 是未被使用的(有些 API 暫時分析不到):

未匹配 API

當前,ArchGuard 可以支援 Spring、RestTemplate、Axios、UMI-Request 等幾種有限的 API 呼叫識別。

資料庫依賴分析:資料庫地圖

注意:這種依賴分析方式,依賴於團隊開發人員擁有統一的編碼規範。

針對於資料庫間的依賴問題,ArchGuard 可以解析程式碼中的 SQL 呼叫,並嘗試性將這種依賴關係與不同的微服務相匹配,進而分析哪些服務在資料庫層是耦合的。由於存在不統一的編碼規範,所以有些情況下,我們並沒有識別出程式碼中的資料庫表:

Database

通過這種依賴關係,我們可以檢視程式碼中最經常使用的表。再結合我們在程式碼分析中的功能,就可以檢視資料庫的呼叫地圖(前端實現中)。

程式碼分析

對於開發團隊來說,它們可以在 ArchGuard 上檢視專案的模組、包、類、方法之間的依賴關係:

Code Analysis

通過上面的 LoginModuleRepository 就能匹配到資料庫對應的結果。

變更影響分析(開發中)

我們正在實現的一個功能是,通過分析和配置系統潛在的程式碼修改點,進而通過依賴關係,分析出變更的影響範圍。它即能幫助架構師分析需求的影響,又能幫助測試人員更精準地測試系統中的內容。

ArchGuard 是如何達成上述功能的?

ArchGuard 內建兩個程式碼分析引擎:Bytecode 分析 + 原始碼分析。

  • Bytecode 分析。顧名思義,就是通過分析 JVM 中的位元組碼,從而分析出程式碼中的依賴關係。
  • 原始碼分析。即通過分析生成編譯語言的語法樹,產出特定的資料結構。

原始碼分析主要是靜態分析,結合先前在重構自動化開源組織 Modernizing 下開源的 Chapi 程式碼分析引擎(https://github.com/modernizing/chapi)。Chapi 基於 Antlr 實現的語法分析,支援主流的程式語言:TypeScript/JavaScript、Kotlin、Java、C# 等等。如下表所示:

Features/LanguagesJavaPythonGoKotlinTypeScriptCC#ScalaC++
http api decl??????
syntax parse???
function call?
arch/package
real world validate

由於是靜態程式碼分析,所以有些內容並不是非常準確。

再結合 ArchGuard Scanner (https://github.com/archguard/scanner)中的幾個掃描工具將資料流入資料庫中:

  • scan_git,分析 Git 提交歷史、行數、語言等基礎資訊
  • scan_jacoco,分析程式碼測試覆蓋率
  • scan_bytecode,位元組碼分析
  • scan_sourcecode,原始碼分析(包含 HTTP API 分析、資料庫分析)
  • scan_test_badsmell,測試程式碼壞味道
  • collector_ci,收集 CI/CD 中的歷史記錄

其它

歡迎加入 ArchGuard 的開發中來,GitHub:https://github.com/archguard/archguard

相關文章