Go每日一庫之強大的rk-boot
rk-boot通過配置文件一鍵啟動很多服務,開始納悶就一個Go文件居然可以啟動gRPC、gin、echo、GoFrame等服務,一看boot.go是引用了rookie-ninja組織下面的gRPC、gin、echo、GoFrame和prometheus客戶端定制boot包。下面土撥鼠就簡單介紹下一個這個庫的使用,這里拿gin的demo來演示。rk-boot的介紹
通過 rk-boot,用戶可以通過yaml格式的配置文件啟動gRPC、gin、echo、GoFrame、prometheus客戶端或自定義入口服務。很容易易編譯、運行和調(diào)試你的 grpc 服務、grpc 網(wǎng)關、swagger UI 和 rk-tv Web UI。
為什么我們需要它?
在我們公司項目中,各個部門的項目結構都不統(tǒng)一,甚至一個小組內(nèi)都不會很統(tǒng)一,這種情況數(shù)不勝數(shù)(盡管用了框架規(guī)范)。
公司中我們一般使用統(tǒng)一的項目布局來構建服務。 也使用統(tǒng)一的logging, metrics, tracing, authorization來構建API。 還可以讓應用程序更快地替換掉核心依賴。 可以節(jié)省我們編寫一些流行框架和庫的初始化程序的學習時間。 我們還可以定義入口用于定制的服務。
下圖是使用rk-boot的圖示

Gin的示例
這里土撥鼠只舉了關于gin的例子,跟其他組件例子(gRPC、echo、GoFrame、prometheus)相比,只是boot.yaml配置不同。這里gin會引用rk-gin的boot[1]包。
目錄結構
├──?boot.yaml
└──?main.go
boot.yaml
---
gin:
??-?name:?greeter???????#?Required,?Name?of?gin?entry?服務名稱
????port:?8080??????????#?Required,?Port?of?gin?entry?端口號
????enabled:?true???????#?Required,?Enable?gin?entry?是否啟用gin
????sw:
??????enabled:?true?????#?Optional,?Enable?swagger?UI?是否啟用swagger
????commonService:
??????enabled:?true?????#?Optional,?Enable?common?service?是否啟用commonService
????tv:
??????enabled:??true????#?Optional,?Enable?RK?TV?是否啟用RK?TV
main.go
package?main
import?(
???"context"
???"github.com/rookie-ninja/rk-boot"
)
func?main()?{
???//?創(chuàng)建rkboot實例?--?Create?a?new?boot?instance.
???boot?:=?rkboot.NewBoot()
???//?啟動rkboot?--?Bootstrap
???boot.Bootstrap(context.Background())
???//?等待接受關閉信號?--?Wait?for?shutdown?sig
???boot.WaitForShutdownSig(context.Background())
}
運行&&請求
$?go?run?main.go
$?curl?-X?GET?localhost:8080/rk/v1/healthy
{"healthy":true}
Swagger
可以通過 http://localhost:8080/sw 訪問swagger頁面

TV
可以通過 http://localhost:8080/rk/v1/tv 訪問TV頁面

開啟中間件
其中rk-boot依賴的 rk-grpc[2]、rk-gin[3] 集成了很多中間件,可以在boot.yaml中配置使用,下面是在gin的示例中開啟了日志zap的使用,可以通過訪問curl -X GET localhost:8080/rk/v1/healthy查看日志。
gin:
??-?name:?greeter?????????????????????????????#?Required
????port:?8080????????????????????????????????#?Required
????enabled:?true?????????????????????????????#?Required
????commonService:????????????????????????????#?Optional
??????enabled:?true???????????????????????????#?Optional,?default:?false
????interceptors:?????????????????????????????#?Optional
??????loggingZap:
????????enabled:?true??
另外還支持以下中間件,中間件源碼包interceptor[4]可以按需開啟使用。對應的示例可以查看 example[5]。
logging middleware prometheus metrics middleware auth middleware tracing middleware panic middleware metadata middleware rate limit middleware timeout middleware gzip middleware cors interceptor jwt interceptor secure interceptor csrf interceptor
小結
rk-boot還支持gRPC代理目前還在試驗階段,相信后續(xù)會有更多功能支持。土撥鼠今天介紹這個庫主要是覺得這種可配置化、定制的思想很值得在企業(yè)項目中借鑒和落地。還可以統(tǒng)一一些公共組件的使用,節(jié)省大量成本。如果你有相關看法,歡迎大家在留言區(qū)討論交流。
參考資料
boot: https://github.com/rookie-ninja/rk-gin/tree/master/boot
[2]rk-grpc: https://github.com/rookie-ninja/rk-grpc
[3]rk-gin: https://github.com/rookie-ninja/rk-gin
[4]interceptor: https://github.com/rookie-ninja/rk-gin/tree/master/interceptor
[5]example: https://github.com/rookie-ninja/rk-gin/tree/master/example
推薦閱讀
