文章目錄
- 前言
- 設計思想和原則
- ? 技術棧
- 視頻實況教程
- sponge 內置了豐富的組件(按需使用)
- 幾個標配
- 常用組件
- 主要技術點
- 另一個
- 參考鏈接
前言
軟件和汽車一樣,由多個重要零部件組裝而成。
本文堆積了一些常用部件,還沒來得及好好整理。先放著。
神兵利器雖多,總歸還是要組裝一個自己的才放心。
設計思想和原則
框架中用到的設計思想和原則,盡量滿足 “高內聚、低耦合”,主要遵從下面幾個原則
-
- 單一職責原則
-
- 基于接口而非實現編程
-
- 依賴注入
-
- 多用組合
-
- 迪米特法則
迪米特法則: 不該有直接依賴關系的類之間,不要有依賴;有依賴關系的類之間,盡量只依賴必要的接口
? 技術棧
- 框架路由使用 Gin 路由
- 中間件使用 Gin 框架的中間件
- 數據庫組件 GORM
- 文檔使用 Swagger 生成
- 配置文件解析庫 Viper
- 使用 JWT 進行身份鑒權認證
- 校驗器使用 validator 也是 Gin 框架默認的校驗器
- 任務調度 cron
- 包管理工具 Go Modules
- 測試框架 GoConvey
- CI/CD GitHub Actions
- 使用 GolangCI-lint 進行代碼檢測
- 使用 make 來管理 Go 工程
- 使用 shell(admin.sh) 腳本來管理進程
- 使用 YAML 文件進行多環境配置
另一份整理的清單:
- Gin: 輕量級Web框架,自稱路由速度是golang最快的
- GORM: ORM工具。本項目需要配合Mysql使用
- Gin-Session: Gin框架提供的Session操作工具
- Go-Redis: Golang Redis客戶端
- godotenv: 開發環境下的環境變量工具,方便使用環境變量
- Gin-Cors: Gin框架提供的跨域中間件
- httpexpect: 接口測試工具
- 自行實現了國際化i18n的一些基本功能
- 本項目是使用基于cookie實現的session來保存登錄狀態的,如果需要可以自行修改為token驗證
視頻實況教程
讓我們寫個G站吧!Golang全棧編程實況
sponge 內置了豐富的組件(按需使用)
組件 | 使用示例 |
---|---|
Web 框架 gin | gin 示例 gin 中間件示例 |
RPC 框架 gRPC | gRPC 示例 gRPC 攔截器示例 |
配置解析 viper | 示例 |
日志 zap | 示例 |
ORM 框架 gorm, mongo-go-driver | gorm 示例 mongodb 示例 |
緩存 go-redis, ristretto | go-redis 示例 ristretto 示例 |
自動化api文檔 swagger, protoc-gen-openapiv2 | - |
鑒權 jwt | jwt 示例 gin 示例 gRPC 示例 |
校驗 validator, protoc-gen-validate | validator 示例 protoc-gen-validate 示例 |
Websocket gorilla/websocket | 示例 |
定時任務 cron | 示例 |
消息隊列 rabbitmq, kafka | rabbitmq 示例 kafka 示例 |
分布式事務管理器 dtm | dtm 服務發現示例 使用 dtm 秒殺搶購示例 |
分布式鎖 dlock | 示例 |
自適應限流 ratelimit | gin 示例 gRPC 示例 |
自適應熔斷 circuitbreaker | gin 示例 gRPC 示例 |
鏈路追蹤 opentelemetry | gin 示例 gRPC 示例 跨服務鏈路追蹤示例 |
監控 prometheus, grafana | gin 示例 gRPC 示例 web 和 gRPC 監控示例 |
服務注冊與發現 etcd, consul, nacos | 服務注冊示例 服務發現示例 |
自適應采集 profile | 示例 |
資源統計 gopsutil | 示例 |
配置中心 nacos | 示例 |
代碼質量檢查 golangci-lint | - |
持續集成部署 CI/CD kubernetes, docker, jenkins | 示例 |
生成項目業務架構圖 spograph | 示例 |
生成自定義代碼 go template | json 示例 sql 示例 protobuf 示例 |
AI助手 DeepSeek, ChatGPT, Gemini | 示例 |
## 使用Singo開發的項目實例
仿B站的G站:https://github.com/Gourouting/giligili
Singo框架為移動端提供Token登錄的案例: https://github.com/bydmm/singo-token-exmaple
幾個標配
- Gin: https://github.com/gin-gonic/gin
- Gorm: https://github.com/go-gorm/gorm
- Wire: https://github.com/google/wire
- Viper: https://github.com/spf13/viper
- Zap: https://github.com/uber-go/zap
- Golang-jwt: https://github.com/golang-jwt/jwt
- Go-redis: https://github.com/go-redis/redis
- Testify: https://github.com/stretchr/testify
- Sonyflake: https://github.com/sony/sonyflake
- Gocron: https://github.com/go-co-op/gocron
- Go-sqlmock: https://github.com/DATA-DOG/go-sqlmock
- Gomock: https://github.com/golang/mock
- Swaggo: https://github.com/swaggo/swag
- Pitaya: https://github.com/topfreegames/pitaya
- Casbin: https://github.com/casbin/casbin
常用組件
主要技術點
- 認證使用jwt,雙token模式(accessToken、refreshToken)
- 數據庫操作使用gorm
- 限流使用令牌桶
- 用戶id生成使用的是雪花算法
- 日志管理使用zap
- 配置文件管理使用viper
- 代碼熱監聽使用air
- 接口文檔生成使用swagger
- 提供 gin 框架項目模版
- 支持 HTTP 和 gRPC 雙協議服務
- 可通過配置啟用/禁用 gRPC 服務
- 統一的 API 定義和實現
- 支持 gRPC 健康檢查和反射服務
- 使用 Uber fx 框架進行依賴注入,實現更清晰的代碼結構
- 采用標準 MVC 架構,遵循關注點分離原則
- 集成 GORM 進行 ORM 映射和數據庫操作
- 支持 PostgreSQL (使用 pgx 驅動)
- 支持 MySQL
- 支持 SQLite
- 提供豐富的查詢選項工具函數
- 集成 Viper 進行配置管理
- 提供常用 gin 中間件和工具
- 跨域中間件:處理 API 跨域請求,實現 CORS 支持
- jwt 解析中間件:從請求中解析并驗證 JWT Token,用于 API 身份認證
- 國際化 (i18n) 支持
- 基于請求 Accept-Language 頭自動選擇語言
- 錯誤消息多語言支持
- 內置英語 (en-US) 和中文 (zh-CN) 翻譯
- 可輕松擴展支持更多語言
- 使用 Cobra 命令行框架,提供清晰的子命令結構
- 支持數據庫遷移與服務器啟動分離,提高啟動速度
- 完善的數據庫遷移系統,支持版本控制和回滾
- 內置用戶、角色、權限和菜單管理系統
- 支持多種用戶模式,滿足不同規模項目需求
- 優化的錯誤處理系統,支持錯誤碼和多語言錯誤消息
另一個
RESTful API
設計規范Gin
一款高效的golang web框架MySQL
數據庫存儲Jwt
用戶認證, 登入登出一鍵搞定Casbin
基于角色的訪問控制模型(RBAC)Gorm
數據庫ORM管理框架, 可自行擴展多種數據庫類型(主分支已支持gorm 2.0)Validator
請求參數校驗, 版本V9Log
v1.2.2升級后日志支持兩種常見的高性能日志 logrus / zap (移除日志寫入本地文件, 強烈建議使用docker日志或其他日志收集工具)Viper
配置管理工具, 支持多種配置文件類型Embed
go 1.16文件嵌入屬性, 輕松將靜態文件打包到編譯后的二進制應用中DCron
分布式定時任務,同一task只在某臺機器上執行一次(需要配置redis)GoFunk
常用工具包, 某些方法無需重復造輪子FiniteStateMachine
有限狀態機, 常用于審批流程管理(沒有使用工作流, 一是go的輪子太少, 二是有限狀態機基本可以涵蓋常用的審批流程)Uploader
大文件分塊上傳/多文件、文件夾上傳Vue組件vue-uploaderMessageCenter
消息中心(websocket長連接保證實時性, 活躍用戶上線時新增消息表, 不活躍用戶不管, 有效降低數據量)testing
測試標準包, 快速進行單元測試Grafana Loki
輕量日志收集工具loki, 支持分布式日志收集(需要通過docker運行gin-web-docker)Minio
輕量對象存儲服務(需要通過docker運行gin-web-docker)Swagger
Swagger V2接口文檔Captcha
密碼輸錯次數過多需輸入驗證碼Sign
API接口簽名(防重放攻擊、防數據篡改)Opentelemetry
鏈路追蹤, 快速分析接口耗時
參考鏈接
- https://github.com/go-eagle/eagle
- https://github.com/gourouting/singo: Gin+Gorm開發Golang API快速開發腳手架
- https://github.com/gostartkit/web
- https://github.com/go-nunu/nunu
- https://github.com/limitcool/starter: starter 是一個 Go + gin 框架的項目腳手架,提供開箱即用的工具、庫和 gin 項目配置,幫助您快速啟動 gin 驅動的 API 項目開發。
- https://gitee.com/liuxingxiang/gin-web-scaffolding
- https://github.com/go-dev-frame/sponge/tree/main
- https://github.com/zzjcool/ginHelper