「连载」边缘计算(十四)02-02:边缘部分源码(源码分析篇)

(接上篇)

CloudCore

本节将对CloudCore进行剖析,对CloudCore组件中功能模块共用的消息框架和各功能模块的具体功能进行深入剖析,具体包括CloudCore功能模块之间通信的消息框架、cloudhub剖析、edgecontroller剖析、devicecontroller剖析。

CloudCore功能模块之间通信的消息框架

CloudCore组件中各个功能模块之间是通过Beehive来组织和管理的。Beehive的消息框架是在CloudCore的功能模块启动的时候启动的,具体如下所示。

KubeEdge/beehive/pkg/core/core.go

import (

...

"GitHub.com/KubeEdge/beehive/pkg/core/context"

)

// 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)

}

}

上述代码中,在CloudCore的功能模块启动之前,首先实例化了一个beehive的context,然后再获得各个功能模块,最后用一个for循环逐个启动功能模块,并将已实例化的beehive的context作为参数,传入每个功能模块的启动函数中。这样,CloudCore中独立的功能模块就被beehive的context组织成了一个统一的整体。至于beehive的context是怎么做到的,还需要进入beehive的context的实例化函数context.GetContext()一探究竟。

context.GetContext()函数定义具体如下所示。

KubeEdge/beehive/pkg/core/context/contex_factory.go

// GetContext gets global context instance

func GetContext(contextType string) *Context {

once.Do(func() {

context = &Context{}

switch contextType {

case MsgCtxTypeChannel:

channelContext := NewChannelContext()

context.messageContext = channelContext

context.moduleContext = channelContext

default:

klog.Warningf("Do not support context type:%s", contextType)

}

})

return context

}

context.GetContext()函数定义中的第3行context = &Context{}实例化了一个空context。下面我们分析该实例化context。context 结构体具体如下所示。

KubeEdge/beehive/pkg/core/context/context.go

// Context is global context object

type Context struct {

moduleContext  ModuleContext

messageContext MessageContext

}

//ModuleContext is interface for context module management

type ModuleContext interface {

AddModule(module string)

AddModuleGroup(module, group string)

Cleanup(module string)

}

//MessageContext is interface for message syncing

type MessageContext interface {

// async mode

Send(module string, message model.Message)

Receive(module string) (model.Message, error)

// sync mode

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

}

从上面的Context结构体,可以看出该Context的两个属性——moduleContextmessageContext,它们都是interface类型,所以可以断定该Context不是真身。在函数GetContext()(KubeEdge/beehive/pkg/core/context/context.go)继续往下看,在第6行channelContext := NewChannelContext()有一个context实例化函数NewChannelContext(),进入该函数的定义去看一下它是不是真身。

 「未完待续……

点击下方标题可阅读技术文章

「连载」边缘计算(一)01-16:边缘计算系统逻辑架构(原理篇)
「连载」边缘计算(二)01-17:边缘计算系统逻辑架构(原理篇)
「连载」边缘计算(三)01-18:边缘部分原理解析(原理篇)
「连载」边缘计算(四)01-19:边缘部分原理解析(原理篇)
「连载」边缘计算(五)01-22:边缘部分原理解析(原理篇)
「连载」边缘计算(六)01-23:边缘部分原理解析(原理篇)
「连载」边缘计算(七)01-24:边缘部分原理解析(原理篇)
「连载」边缘计算(八)01-25:边缘部分源码(源码分析篇)
「连载」边缘计算(九)01-26:边缘部分源码(源码分析篇)

「连载」边缘计算(十)01-29:边缘部分源码(源码分析篇)
「连载」边缘计算(十一)01-30:边缘部分源码(源码分析篇)
「连载」边缘计算(十二)01-31:边缘部分源码(源码分析篇)
「连载」边缘计算(十三)02-01:边缘部分源码(源码分析篇)

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-05 11:48:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-05 11:48:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-05 11:48:01       87 阅读
  4. Python语言-面向对象

    2024-02-05 11:48:01       96 阅读

热门阅读

  1. Chapter 8 - 6. Congestion Management in TCP Storage Networks

    2024-02-05 11:48:01       59 阅读
  2. 算法提升——LeetCode383场周赛总结

    2024-02-05 11:48:01       57 阅读
  3. 力扣_字符串3—通配符匹配

    2024-02-05 11:48:01       37 阅读
  4. prettier和eslint冲突怎么解决?

    2024-02-05 11:48:01       58 阅读
  5. LINUX 日常使用命令

    2024-02-05 11:48:01       41 阅读
  6. float与double区别

    2024-02-05 11:48:01       51 阅读