基于Golang實現(xiàn)統(tǒng)一加載資源的入口
項目地址:https://github.com/astak16/go-starter
統(tǒng)一初始化入口
什么時候需要統(tǒng)一初始化入口函數(shù)呢?
當(dāng)我們需要在 main 函數(shù)中做一些初始化的工作,比如初始化日志,初始化配置文件,初始化數(shù)據(jù)庫等等
這些都是需要在 main 函數(shù)中做的初始化工作,這個時候就可以使用統(tǒng)一初始化入口的方式來實現(xiàn)
抽象出生命周期接口
使用統(tǒng)一初始化入口的方式,需要我們抽象出生命周期接口
比如下面我們定義了 Init、Setup、Start、StartBlocking、Stop 五個接口,用來完成五件事情:
- Init: 系統(tǒng)啟動,初始化一些基礎(chǔ)資源,比如數(shù)據(jù)庫,消息隊列等
- Setup: 安裝一些基礎(chǔ)資源,比如初始化數(shù)據(jù)庫表,或者其他基礎(chǔ)資源的初始化
- Start: 啟動基礎(chǔ)資源,比如啟動數(shù)據(jù)庫連接池,消息隊列消費者
- StartBlocking: 啟動器是否可阻塞,比如啟動 RPC 服務(wù),啟動器需要一直阻塞才能提供 RPC 服務(wù)
- Stop: 系統(tǒng)停止,一般是一些基礎(chǔ)資源的回收和停止,比如數(shù)據(jù)庫連接池,消息隊列連接池等
type Starter interface {
Init(ctx StarterContext)
Setup(ctx StarterContext)
Start(ctx StarterContext)
StartBlocking() bool
Stop(ctx StarterContext)
}實現(xiàn)生命周期接口
下一步是實現(xiàn)這個接口,在 go 中 interface 是隱式實現(xiàn)的,只要實現(xiàn)了接口中的方法,就是實現(xiàn)了這個接口
type BaseStarter struct{}
func (b *BaseStarter) Init(ctx StarterContext) {}
func (b *BaseStarter) Setup(ctx StarterContext) {}
func (b *BaseStarter) Start(ctx StarterContext) {}
func (b *BaseStarter) StartBlocking() bool { return false }
func (b *BaseStarter) Stop(ctx StarterContext) {}實現(xiàn)自動裝配
所有的啟動器都實現(xiàn)了 Starter 接口
這時就可以將所有的啟動器都放在一個切片中,然后遍歷切片,依次調(diào)用 Init、Setup、Start、StartBlocking、Stop 方法
type StarterRegister struct {
starters []Starter
}
func (sr *StarterRegister) Register(s Starter) {
sr.starters = append(sr.starters, s)
}
func (sr *StarterRegister) AllStarters() []Starter {
return sr.starters
}提供一個注冊和運行的方法,這樣就可以實現(xiàn)自動裝配了
func Register(s Starter) {
starterRegister.Register(s)
}
func SystemRun() {
ctx := StarterContext{}
for _, s := range starterRegister.AllStarters() {
s.Init(ctx)
s.Setup(ctx)
s.Start(ctx)
s.StartBlocking()
s.Stop(ctx)
}
}使用
1.為每個資源創(chuàng)建一個 config.go 文件,然后在 init 函數(shù)中注冊
func init() {
fmt.Println("config")
Register(&Config{})
}
type Config struct{}
func (c *Config) Init(ctx StarterContext) {
fmt.Println("Init")
}
func (c *Config) Setup(ctx StarterContext) {
fmt.Println("Setup")
}
func (c *Config) Start(ctx StarterContext) {
fmt.Println("Start")
}
func (c *Config) StartBlocking() bool {
fmt.Println("StartBlocking")
return true
}
func (c *Config) Stop(ctx StarterContext) {
fmt.Println("Stop")
}
2.在 main 函數(shù)中調(diào)用 SystemRun 方法
通過這種方式,就可以實現(xiàn)自動裝配了,有多少資源,就創(chuàng)建多少 config.go 文件,并實現(xiàn) Starter 接口
到此這篇關(guān)于基于Golang實現(xiàn)統(tǒng)一加載資源的入口的文章就介紹到這了,更多相關(guān)Golang統(tǒng)一入口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實現(xiàn)請求限流的幾種辦法(小結(jié))
這篇文章主要介紹了Golang實現(xiàn)請求限流的幾種辦法(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Go語言學(xué)習(xí)網(wǎng)絡(luò)編程與Http教程示例
這篇文章主要為大家介紹了Go語言學(xué)習(xí)網(wǎng)絡(luò)編程與Http教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
Go語言設(shè)計實現(xiàn)在任務(wù)欄里提醒你喝水的兔子
這篇文章主要為大家介紹了Go語言設(shè)計實現(xiàn)在任務(wù)欄里提醒你喝水的兔子示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
Golang中類型轉(zhuǎn)換利器cast庫的用法詳解
cast庫是一個簡潔而強大的第三方庫,它的主要功能是實現(xiàn)類型之間的安全轉(zhuǎn)換,而在Golang開發(fā)中,類型轉(zhuǎn)換是一個常見且不可避免的過程,下面我們就來看看cast庫在Golang中的具體應(yīng)用吧2024-11-11

