go-admin在線開發平臺學習-2[程序結構分析]

緊接着上一篇,本文咱們對go-admin下載後的源碼進行分析。mysql

首先對項目所使用的第三方庫進行分析,瞭解做者使用的庫是不是通用的官方庫能夠有助於咱們更快地閱讀程序。接着對項目的main()方法進行分析,由於程序使用cli的方式啓動,對cli不一樣的命令進行分析。基於此倆點開始工做。git

go-admin中使用的第三方庫

cobragithub

強大的cli封裝,支持命令嵌套golang

castweb

簡單安全的類型轉換sql

casbin數據庫

輕量級開源訪問控制框架,採用了元模型的設計思想,支持多種經典的訪問控制方案,如基於角色的訪問控制 RBAC、基於屬性的訪問控制 ABAC 等api

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做爲統一入口

image-20210205093239267

corbora的使用遵循一個通用的規則。首先建立一個cmd文件夾,在其中定義一個分支命令便是定義一個新的go文件。本項目所使用的方式也相似,每個命令都 定義一個文件夾,分別管理本身命令的內容,最後經過cobra.go這個上層入口暴露出來。

go-admin version 命令

image-20210218141425364

定義指令 version,runE執行調用run方法,控制檯打印版本號

go-admin config 命令

image-20210218141705707

與上一個version指令相似,只是多一個輸入參數,用來指定路徑。

init初始化方法定義輸入的flag參數,當執行go-admin config -c 路徑,進入run()方法。

run方法中

一、config.Setup(configYml),將yml配置文件轉爲不一樣的實體類

二、打印不一樣的分類內容

go-admin migrate 命令

數據庫遷移指令

基於gorm的migrate方法,定義本身的initdata內容,執行指令完成數據庫遷移工具。

有點相似.net core中的code first模式

go-admin server命令

重點!!!

咱們直接進行 server 命令的分析

api文件夾下的server.go文件,對應服務啓動指令

Init方法

init() 方法中是對 命令行參數的解析和初始化路由方法的綁定

image-20210205094215618

以上代碼分爲倆部門看

一、對server 指令的參數綁定

二、route.InitRouter方法添加到AppRouters中,等待後續執行


router.InitRouter方法來源於 /admin/router/initrouter.go文件

initrouter.go中包含多項內容

一、經過配置獲取程序所用引擎,當前只支持gin,後續做者可能會進行添加。

二、經過配置判斷是否使用ssl加密,若是使用""註冊tls處理中間件"

三、讀取配置獲取數據庫類型,鏈接字符串獲取gorm具體數據庫的接口實現,自定義中間件設置數據庫上下文,集成到gin使用

四、配置Sentinel限流規則

阿里開源的一套東西,須要研究研究

五、通用的系統中間件載入

中間件的業務邏輯包含在 /admin/middleware中

日誌處理 logger.go

做者本身生態的日誌封裝,基於logrus和zap的實現,具體沒看

邏輯是獲取request的請求信息寫入文件日誌,若是包含特定請求寫入數據庫(後期可能會廢棄)

全局異常處理

當出現全局異常的時候捕獲異常,避免程序直接掛掉

緩存

NoCache是一個附加頭的中間件函數。防止客戶端緩存HTTP響應。

意思是客戶端不進行緩存,每次都要的請求向服務器發起

跨域

增長跨域請求頭信息,容許全部請求的跨域

這塊以後應該集成第三方,實現知足特定須要的跨域

安全

Secure是附加了security的中間件功能

鏈路追蹤

鏈路追蹤是實現每請求的時間線展現嗎仍是什麼,這塊還須要研究

六、 jwt認證方式實現

七、註冊業務路由

區分倆種

須要認證的路由,基於上述jwt

不須要認證的路由

命令定義

image-20210205093727158

我感受這有點像是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 啓動服務,打印啓動時的日誌

命令的解析大致以下,接下來針對框架中的細節的進行描述,請等待做者的更新。

相關文章
相關標籤/搜索