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

Gin的示例
這里土撥鼠只舉了關(guān)于gin的例子,跟其他組件例子(gRPC、echo、GoFrame、prometheus)相比,只是boot.yaml配置不同。這里gin會引用rk-gin的boot[1]包。
目錄結(jié)構(gòu)
├──?boot.yaml
└──?main.go
boot.yaml
---
gin:
??-?name:?greeter???????#?Required,?Name?of?gin?entry?服務(wù)名稱
????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實(shí)例?--?Create?a?new?boot?instance.
???boot?:=?rkboot.NewBoot()
???//?啟動rkboot?--?Bootstrap
???boot.Bootstrap(context.Background())
???//?等待接受關(guān)閉信號?--?Wait?for?shutdown?sig
???boot.WaitForShutdownSig(context.Background())
}
運(yùn)行&&請求
$?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]可以按需開啟使用。對應(yīng)的示例可以查看 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
小結(jié)
rk-boot還支持gRPC代理目前還在試驗(yàn)階段,相信后續(xù)會有更多功能支持。土撥鼠今天介紹這個(gè)庫主要是覺得這種可配置化、定制的思想很值得在企業(yè)項(xiàng)目中借鑒和落地。還可以統(tǒng)一一些公共組件的使用,節(jié)省大量成本。如果你有相關(guān)看法,歡迎大家在留言區(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
推薦閱讀
