个人认为beehive是kubeedge的通讯的核心模块,将beehive看明白基本上就理解一半hubeedge的工作机制了。首先我将beehive核心代码目录拿出来,大家看下:
上面的目录是我将kubeedge里的重要部分拿出来的,下面依次说下:
1、module.go core.go文件
如上图所示 module是一个接口,上一篇文章已经说过kubeedge包含了几个重要的模块,都已经实现了这个接口。然后这些模块初始化时,根据配置文件的配置状态到modules map[string]Module结构中,然后在遍历modules,依次启动相应的服务。依次启动服务的代码如下:
注意:函数中的参数sync.WaitGroup是我为了写demo自己增加的,原函数是不存在的。
2、message.go文件很简单,就是定义message的格式。这里大家应该都可以看明白就不再累赘了。
3、context目录--这个目录我认为是beehive的核心,首先看下context.go文件,这里面定义了核心beehiveContext对象的结构:
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文件,从名字可以得知,他是采用工厂模式创建了一个context对象,具体实现为InitContext函数
这个函数中首先创建了beehiveContext对象,然后根据传入的contextType创建了MsgCtxTypeChannel类型的ChannelContext对象,将beehiveContext的moduleContext、messageContext同时赋值为ChannelContext对象,可想而之,ChannelContext对象同时实现了上面的两个接口的所有方法。
最后我们看下context_channel.go文件,可以确定ChannelContext确实实现了上述接口的所有方法,具体结构如下:
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的工作流程已经完成。