Simple store是基於Crescendo Lab go-clean-arch 模板實現基本的網頁商店後端功能
這個 Side project 我是用來學習跟實現的小專案,後端架構參考 Crescendo Lab 的 DDD(Domain-Driven Design)實現,裡面使用到 Postgres 資料庫來存儲商品目錄以及顧客訂單,和使用 Redis 實現簡易的購物車,以及 OAuth 跟 JWT 確認身份以及驗證,來管理商品以及更新訂單
資料庫
- postgres:
- redis:
- sqlc:
- migrations:
測試
- testify: ^1.8.0
- mockgen: ~1.6.0
- testfixtures: ^3.8.0
- migrate: ^4.15.0
- dockertest: ^3.9.0
- 啟動資料庫 : 啟動 postgres 跟 redis
docker-compose up
- 建立資料庫表格
make migrateup
- 運行後端
go run main.go
- API SWAGGER 文件
http://localhost:8080/swagger/index.html
這個後端架構分為四層 參考來源: go-clean-arch
Router
處理輸入請求的事情,例如 HTTP 請求路由、身份驗證、訪問控制和參數驗證。Adapter
處理輸出請求,例如訪問數據庫、與外部服務通信、將事件發送到隊列。Application
處理跟調用Domain層跟Adapter層。Domain
處理業務和產品相關的核心邏輯。
實現:
Router
層 : 放入Oauth middleware,是因為訂單跟購物車根據客戶ID操作,會經過google認證服務取得客戶資訊Adapter
層 : 放入Postgres和 Redis調用資料庫,Postgres用於存放需永久保存資料例如訂單跟商品,而Redis存放購物車商品Application
層 : 根據業務而有不同的Service,例如根據業務分成了Clerk跟Customer Service,會調用不同的Domain
跟Adapter
處理流層Domain
層 : 主要用來處理業務邏輯,裡面只會接收Application
層輸入資料,處理完後返回給Application
層
- 資料庫方面
- 會使用migrations來創建跟版控資料庫的表格
- 不使用gorm操作資料庫,使用sqlc自動產生Sql語法,統一對於DB代碼風格,且對於DB操作效能上有一定提升。
- API文件
- 在 router 內寫 swagger 的註解讓自動產生 api 的相關資訊,以及在使用 zerolog 日誌庫,搜集 API 相關訊息
- 使用 gin 框架來開發後端,以及使用 viper 跟 cobra 自動產生 CMD 與抓取 config,在 middleware 裡添加 google 的 ouath 認證
- 使用github action來自動化測試每次的Pull Request
- 單元測試
- 測試包含Adapter、Application、Domain
- 使用mockgen產生假的Adapter跟Domain,去測試Application,減少測試時的依賴
- Adapter測試需要實際的postgres跟redis,會用dockertest,去實例化一個資料庫,測試完在自動刪除