個(gè)人認(rèn)為beehive是kubeedge的通訊的核心模塊,將beehive看明白基本上就理解一半hubeedge的工作機(jī)制了。首先我將beehive核心代碼目錄拿出來(lái),大家看下:

上面的目錄是我將kubeedge里的重要部分拿出來(lái)的,下面依次說(shuō)下:
1、module.go core.go文件

如上圖所示 module是一個(gè)接口,上一篇文章已經(jīng)說(shuō)過(guò)kubeedge包含了幾個(gè)重要的模塊,都已經(jīng)實(shí)現(xiàn)了這個(gè)接口。然后這些模塊初始化時(shí),根據(jù)配置文件的配置狀態(tài)到modules map[string]Module結(jié)構(gòu)中,然后在遍歷modules,依次啟動(dòng)相應(yīng)的服務(wù)。依次啟動(dòng)服務(wù)的代碼如下:

注意:函數(shù)中的參數(shù)sync.WaitGroup是我為了寫demo自己增加的,原函數(shù)是不存在的。
2、message.go文件很簡(jiǎn)單,就是定義message的格式。這里大家應(yīng)該都可以看明白就不再累贅了。
3、context目錄--這個(gè)目錄我認(rèn)為是beehive的核心,首先看下context.go文件,這里面定義了核心beehiveContext對(duì)象的結(jié)構(gòu):
type beehiveContext struct {
????????moduleContext ModuleContext
? ???? messageContext MessageContext
? ???? ctx context.Context
? ???? cancel context.CancelFunc
}
其中ModuleContext與MessageContext均為接口,具體定義如下:
type ModuleContext interface {
????AddModule(module string)
????AddModuleGroup(module, group string)
????Cleanup(module string)
}
type MessageContext interface {
????Send(module string, message model.Message)
????Receive(module string) (model.Message, error)
????SendSync(module string, message model.Message, timeout time.Duration) (model.Message, error)
????SendResp(message model.Message)
????//group broadcast
? ? ? SendToGroup(moduleType string, message model.Message)
????SendToGroupSync(moduleType string, message model.Message, timeout time.Duration)error
}
然后我們看conetxt_factory.go文件,從名字可以得知,他是采用工廠模式創(chuàng)建了一個(gè)context對(duì)象,具體實(shí)現(xiàn)為InitContext函數(shù)

這個(gè)函數(shù)中首先創(chuàng)建了beehiveContext對(duì)象,然后根據(jù)傳入的contextType創(chuàng)建了MsgCtxTypeChannel類型的ChannelContext對(duì)象,將beehiveContext的moduleContext、messageContext同時(shí)賦值為ChannelContext對(duì)象,可想而之,ChannelContext對(duì)象同時(shí)實(shí)現(xiàn)了上面的兩個(gè)接口的所有方法。
最后我們看下context_channel.go文件,可以確定ChannelContext確實(shí)實(shí)現(xiàn)了上述接口的所有方法,具體結(jié)構(gòu)如下:
type ChannelContext struct {
//ConfigFactory goarchaius.ConfigurationFactory
? channels map[string]chan model.Message
? chsLock sync.RWMutex
? typeChannels map[string]map[string]chan model.Message
? typeChsLock sync.RWMutex
? anonChannels map[string]chan model.Message
? anonChsLock sync.RWMutex
}
至此beehive的工作流程已經(jīng)完成。