緊接著上一篇,本文我們對go-admin下載后的原始碼進行分析,
首先對專案所使用的第三方庫進行分析,了解作者使用的庫是否是通用的官方庫可以有助于我們更快地閱讀程式,接著對專案的main()方法進行分析,因為程式使用cli的方式啟動,對cli不同的命令進行分析,基于此倆點開始作業,
go-admin中使用的第三方庫
cobra
強大的cli封裝,支持命令嵌套
cast
簡單安全的型別轉換
casbin
輕量級開源訪問控制框架,采用了元模型的設計思想,支持多種經典的訪問控制方案,如基于角色的訪問控制 RBAC、基于屬性的訪問控制 ABAC 等
gorm
一個神奇的,對開發人員友好的 Golang ORM 庫
sentinel-golang
隨著微服務的流行,服務和服務之間的穩定性變得越來越重要,Sentinel 是面向分布式服務架構的流量控制組件,主要以流量為切入點,從流量控制、熔斷降級、系統自適應保護等多個維度來幫助您保障微服務的穩定性,
opentracing-go
分布式追蹤庫
cron
定時任務庫,支持cron運算式
啟動分析
main.go作為程式第一個入口檔案,main()方法作為程式入口
使用corboa命令列的方式進行啟動,有多個不同的命令,如下所示
- 查看系統版本
go-admin version
- 查看系統配置
go-admin config
- 服務啟動
go-admin server
- 資料庫遷移
go-admin migrate
不同的命令有不同的引數進行配置
命令的代碼在根目錄cmd下分檔案保存,通過cobra.go作為統一入口

corbora的使用遵循一個通用的規則,首先創建一個cmd檔案夾,在其中定義一個分支命令即是定義一個新的go檔案,本專案所使用的方式也類似,每一個命令都 定義一個檔案夾,分別管理自己命令的內容,最后通過cobra.go這個上層入口暴露出來,
go-admin version 命令
定義指令 version,runE執行呼叫run方法,控制臺列印版本號
go-admin config 命令
與上一個version指令類似,只是多一個輸入引數,用來指定路徑,
init初始化方法定義輸入的flag引數,當執行go-admin config -c 路徑,進入run()方法,
run方法中
1、config.Setup(configYml),將yml組態檔轉為不同的物體類
2、列印不同的分類內容
go-admin migrate 命令
資料庫遷移指令
基于gorm的migrate方法,定義自己的initdata內容,執行指令完成資料庫遷移工具,
有點類似.net core中的code first模式
go-admin server命令
重點!!!
我們直接進行 server 命令的分析
api檔案夾下的server.go檔案,對應服務啟動指令
Init方法
init() 方法中是對 命令列引數的決議和初始化路由方法的系結

以上代碼分為倆部門看
1、對server 指令的引數系結
2、route.InitRouter方法添加到AppRouters中,等待后續執行
router.InitRouter方法來源于 /admin/router/initrouter.go檔案
initrouter.go中包含多項內容
1、通過配置獲取程式所用引擎,當前只支持gin,后續作者可能會進行添加,
2、通過配置判斷是否使用ssl加密,如果使用""注冊tls處理中間件"
3、讀取配置獲取資料庫型別,連接字串獲取gorm具體資料庫的介面實作,自定義中間件設定資料庫背景關系,集成到gin使用
4、配置Sentinel限流規則
阿里開源的一套東西,需要研究研究
5、通用的系統中間件載入
中間件的業務邏輯包含在 /admin/middleware中
日志處理 logger.go
作者自己生態的日志封裝,基于logrus和zap的實作,具體沒看
邏輯是獲取request的請求資訊寫入檔案日志,如果包含特定請求寫入資料庫(后期可能會廢棄)
全域例外處理
當出現全域例外的時候捕獲例外,避免程式直接掛掉
快取
NoCache是一個附加頭的中間件函式,防止客戶端快取HTTP回應,
意思是客戶端不進行快取,每次都要的請求向服務器發起
跨域
增加跨域請求頭資訊,允許所有請求的跨域
這塊之后應該集成第三方,實作滿足特定需要的跨域
安全
Secure是附加了security的中間件功能
鏈路追蹤
鏈路追蹤是實作每請求的時間線展示嗎還是什么,這塊還需要研究
6、 jwt認證方式實作
7、注冊業務路由
區分倆種
需要認證的路由,基于上述jwt
不需要認證的路由
命令定義

我感覺這有點像是web core中的依賴注入的概念,首先進行各服務的注冊注入然后啟動服務的某些功能,當然實際上還是有很多不同的,只是突然這么想到了而已
PreRun
啟動前的初始化配置
讀取組態檔,配置三種全域日志,分別為
- Logger 日志
- JobLogger 定時任務日志
- RequestLogger 請求日志
初始化資料庫鏈接,通過組態檔得到不同的資料庫,并執行不同的資料庫驅動
驅動位于/go-admin/common/database/_driver后綴
已集成mysql,pgsql,sqlites的驅動
配置介面控制全域,基于casbin
RunE
啟動配置
判斷是否為開發環境,增加環境監控
將初始化配置的路由中間件載入
定義服務埠,ssl等資訊
啟動定時服務
列印啟動日志
啟動服務
srv := &http.Server{
Addr: config.ApplicationConfig.Host + ":" + config.ApplicationConfig.Port,
Handler: global.Cfg.GetEngine(),
}
定義啟動服務的host+port
定義啟動服務的句柄,當前支持的方式是gin
srv.ListenAndServe 啟動服務,列印啟動時的日志
命令的決議大體如下,接下來針對框架中的細節的進行描述,請等待作者的更新,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/260851.html
標籤:Go
上一篇:JPG學習筆記5(附完整代碼)
