(接上篇)
函数StartModules()定义具体如下所示。
// StartModules starts modules that are registered func StartModules() { coreContext := context.GetContext(context.MsgCtxTypeChannel) modules := GetModules() for name, module := range modules { //Init the module coreContext.AddModule(name) //Assemble typeChannels for sendToGroup coreContext.AddModuleGroup(name, module.Group()) go module.Start(coreContext) klog.Infof("Starting module %v", name) } } |
从上面 StartModules()函数的定义,可以清楚地知道该函数首先获得已经注册的模块,然后通过一个for循环启动所有的模块。
各模块的启动过程如下所示。
// GracefulShutdown is if it gets the special signals it does modules cleanup func GracefulShutdown() { c := make(chan os.Signal) signal.Notify(c, syscall.SIGINT, syscall.SIGHUP, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGILL, syscall.SIGTRAP, syscall.SIGABRT) select { case s := <-c: klog.Infof("Get os signal %v", s.String()) //Cleanup each modules modules := GetModules() for name, module := range modules { klog.Infof("Cleanup module %v", name) module.Cleanup() } } } |
GracefulShutdown()函数与StartModules()函数的逻辑类似,也是首先获得已经注册的模块,然后通过一个for循环等待关闭所有的模块。
EdgeCore组件内部各功能模块的共用框架
(1)EdgeCore中模块的共用框架和功能分析
在《深入理解边缘计算:云、边、端工作原理与源码分析》8.2.2节的EdgeCore代码入口部分,我们已经分析到EdgeCore中功能模块的注册和已注册功能模块的启动,下面接着往下分析。
EdgeCore中功能模块的注册具体如下所示。
// registerModules register all the modules started in EdgeCore func registerModules() { devicetwin.Register() edged.Register() edgehub.Register() eventbus.Register() edgemesh.Register() metamanager.Register() servicebus.Register() test.Register() dbm.InitDBManager() } |
从registerModules()函数中,可以知道EdgeCore中有devicetwin、edged、edgehub、eventbus、edgemesh、metamanager、servicebus和test共8个功能模块,还有一个db初始化函数。Register()函数定义具体如下所示:
// Register register devicetwin func Register() { dtclient.InitDBTable() dt := DeviceTwin{} core.Register(&dt) } |
在KubeEdge/edge/pkg/devicetwin/devicetwin.go中的Register(…)函数只是调用了KubeEdge/beehive/pkg/core/module.go中的Register(…)函数。下面继续探究Register()函数。
core.Register(&dt)函数定义具体如下所示。
... var ( // Modules map modules map[string]Module disabledModules map[string]Module ) ... func Register(m Module) { if isModuleEnabled(m.Name()) { modules[m.Name()] = m klog.Infof("Module %v registered", m.Name()) } else { disabledModules[m.Name()] = m klog.Warningf("Module %v is not register, please check modules.yaml",m.Name()) } } |
上述代码中,devicetwin模块注册最终会将该模块的结构体放入一个map[string]Module类型的全局变量modules中。
按照cloudhub模块注册的思路分析,edged、edgehub、eventbus、edgemesh、metamanager、servicebus和test也做了相同的事情,最终把各自的结构体放入一个map[string]Module类型的全局变量modules中。
这8个功能模块之所以能够采用相同的注册流程,是因为它们都实现了KubeEdge/beehive/pkg/core/module.go中的Module接口。Module接口定义具体内容如下所示。
type Module interface { Name() string Group() string Start(c *context.Context) Cleanup() } |
我们可以分别在KubeEdge/edge/pkg/devicetwin/devicetwin.go、KubeEdge/edge/pkg/edged/edged.go、KubeEdge/edge/pkg/edgehub/module.go、KubeEdge/edge/pkg/eventbus/event_bus.go、KubeEdge/edge/pkg/edgemesh/module.go、KubeEdge/edge/pkg/metamanager/module.go、KubeEdge/edge/pkg/servicebush/servicebus.go、KubeEdge/edge/pkg/test/test.go中找到devicetwin、edged、edgehub、eventbus、edgemesh、metamanager、servicebus和test共8个功能模块对Module接口的具体实现。
「未完待续……」
点击下方标题可阅读技术文章
「连载」边缘计算(一)01-16:边缘计算系统逻辑架构(原理篇)
「连载」边缘计算(二)01-17:边缘计算系统逻辑架构(原理篇)
「连载」边缘计算(三)01-18:边缘部分原理解析(原理篇)
「连载」边缘计算(四)01-19:边缘部分原理解析(原理篇)
「连载」边缘计算(五)01-22:边缘部分原理解析(原理篇)
「连载」边缘计算(六)01-23:边缘部分原理解析(原理篇)
「连载」边缘计算(七)01-24:边缘部分原理解析(原理篇)
「连载」边缘计算(八)01-25:边缘部分源码(源码分析篇)
「连载」边缘计算(九)01-26:边缘部分源码(源码分析篇)
「连载」边缘计算(十)01-29:边缘部分源码(源码分析篇)