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

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

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

我們所面臨的挑戰

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

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

應對這些挑戰,我們需要一個平臺/工具,來幫助我們解決這些問題。所以,結合我們過去的一系列軟件開發和重構經驗,我們(Thoughtworks 的諮詢師們)從 2020 年(疫情開始的時候)開始了架構治理平臺 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 代碼分析引擎。Chapi 基於 Antlr 實現的語法分析,支持主流的編程語言:TypeScript/JavaScript、Kotlin、Java、C# 等等。如下表所示:

Features/Languages Java Python Go Kotlin TypeScript C C# Scala C++
http api decl 🆕 🆕 🆕 🆕 🆕 🆕
syntax parse 🆕 🆕 🆕
function call 🆕
arch/package
real world validate

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

再結合 ArchGuard Scanner 中的幾個掃描工具將數據流入數據庫中:

  • scan_git,分析 Git 提交歷史、行數、語言等基礎信息
  • scan_jacoco,分析代碼測試覆蓋率
  • scan_bytecode,字節碼分析
  • scan_sourcecode,源碼分析(包含 HTTP API 分析、數據庫分析)
  • scan_test_badsmell,測試代碼壞味道
  • collector_ci,收集 CI/CD 中的歷史記錄

其它

歡迎加入 ArchGuard 的開發中來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章