Go 語言整潔架構實踐
01 介紹
Bob 大叔在他的一篇標題為「整潔架構」的博客中提及,現在一些流行的系統架構,都采用軟件分層設計,都主張以下 5 個規則:
- 獨立于框架
- 可測試的
- 獨立于用戶界面
- 獨立于數據庫
- 獨立于任何外部依賴
Bob 大叔的架構設計遵循依賴規則,他畫了一張同心圓的圖,共分為 4 層,同心圓由內向外依次為 Entities、Use Cases、Interface Adapters 和 Frameworks and Drivers,該規則規定依賴只能是由外向內,內圈不關心外圈,外圈不要影響內圈。
但是,不要認為必須是分為這四層,這里描述的四層只是一個示例,也許你會發現你的業務不僅僅需要這四層,重點是要遵循由外向內的依賴規則。
本文我們介紹整潔架構在 Go 語言中的實踐。
02 整潔架構分層設計
參照 Bob 大叔的整潔架構軟件分層設計,我們將架構分層分為以下 4 層:
- Models
- Repository
- Usecase
- Delivery
其中,Models 與 Entities 相同,將在所有層中使用,我們可以將所有對象的結構體和方法,以及其他需要在所有層中使用的變量、常量和函數放在 Models 層。這也可以避免遇到循環導入的問題。
Repository 層,我們可以將處理數據庫的程序和調用微服務的程序放在該層,僅處理數據輸入和輸出,不要有其它關于業務邏輯的代碼。該層依賴操作的數據庫或調用的微服務。
Usecase 層,我們可以將業務邏輯代碼放在該層,它負責接收表示層的輸入數據,將數據處理之后,調用 Repository 層,將處理后的數據存儲在數據庫或傳遞給調用的微服務。反之,將數據庫中的數據或調用微服務的返回數據,處理之后,返回給 Delivery 層。該層依賴 Repository 層。
Delivery 層,負責將處理后的數據展示出來,可以采用 RESTful、HTML 或 gRPC 等各種形式。同時,它也負責接收用戶輸入的數據,將數據傳遞給 Usecase 層。該層依賴 Usecase 層。
實踐應用的目錄:
.
├── app
│ └── main.go
├── go.mod
├── go.sum
└── todoList
├── delivery
│ └── http
│ └── todoList.go
├── models
│ └── todoList.go
├── repository
│ └── mysql
│ └── todoList.go
└── usecase
└── todoList.go
03 分層之間通信
分層之間是怎么通信的,除了 Models 層之外,其它層之間通過接口通信,例如 Usecase 層與 Repository 層之間通信,Repository 層定義接口,并實現接口中的所有方法。Usecase 層通過接口與 Repository 層通信。
示例代碼:
type TodoListRepository interface {
Create(ctx context.Context, t *Todolist) (err error)
}
同理,Delivery 層與 Usecase 層之間通信,Usecase 層定義接口,并實現接口中的所有方法。Delivery 層通過接口與 Usecase 層通信。
示例代碼:
type TodoListUsecase interface {
Create(context.Context, *Todolist) (err error)
}
04 總結
本文我們介紹整潔架構的軟件分層設計,并且通過一個簡單的 TodoList 項目,在 Go 語言中實踐「整潔架構」的架構設計。但是,在 Go 語言中實際上并沒有標準的架構設計,我們可以嘗試構建自己的標準。
完整代碼,請查閱 github。

































