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

(接上篇)

ChannelContext struct定义如下所示。

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

// ChannelContext is object for Context channel

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

}

上述代码中,ChannelContext 函数实现了Context struct(KubeEdge/beehive/pkg/core/context/context.go)属性包含的所有interface(ModuleContextMessageContext)。毫无疑问,ChannelContext struct就是CloudCore中各功能模块相互通信的消息队列框架的真身了。

至于ChannelContext struct在CloudCore中各功能模块是如何相互通信的,感兴趣的读者可以根据本文的梳理自己去深入剖析。

cloudhub剖析

cloudhub功能模块启动函数的具体内容如下所示。

KubeEdge/cloud/edge/pkg/cloudhub/cloudhub.go

func (a *cloudHub) Start(c *beehiveContext.Context) {

var ctx context.Context

a.context = c

ctx, a.cancel = context.WithCancel(context.Background())

initHubConfig()

messageq := channelq.NewChannelMessageQueue(c)

// start dispatch message from the cloud to edge node

go messageq.DispatchMessage(ctx)

// start the cloudhub server

if util.HubConfig.ProtocolWebsocket {

go servers.StartCloudHub(servers.ProtocolWebsocket, messageq, c)

}

if util.HubConfig.ProtocolQuic {

go servers.StartCloudHub(servers.ProtocolQuic, messageq, c)

}

if util.HubConfig.ProtocolUDS {

// The uds server is only used to communicate with csi driver from KubeEdge on cloud.

// It is not used to communicate between cloud and edge.

go udsserver.StartServer(util.HubConfig, c)

}

}

从以上cloudhub的启动函数Start()定义中,可以清晰地看出cloudhub在启动时主要做了如下几件事。

1) 接收beehiveContext.Context的通信框架实例,并保存(a.context = c);

2) 初始化cloudhub的配置(initHubConfig());

3) 将接收到的beehiveContext.Context的通信框架实例进行修饰(messageq := channelq.NewChannelMessageQueue(c)),在原用通信框架实例的基础上加入缓存功能;

4) 启动一个消息分发go routine(go messageq.DispatchMessage(ctx)),监听云端的事件下发到edge端;

5) 如果设置了websocket启动,就启动websocket服务器的go routine(go servers.StartCloudHub(servers.ProtocolWebsocket, messageq, c)

);

6)如果设置了quic启动,就启动quic服务器的go routine(go servers.StartCloudHub(servers.ProtocolQuic, messageq, c));

7) 如果设置了unix domain socket启动,就启动unix domain socket服务器的go routine(go udsserver.StartServer(util.HubConfig, c))。

需要对以上内容说明的是:

1) websocket server和quic server的功能是相同。也就是说,两者可以选其一,如果条件允许的话,建议选quic server,速度更快一些。

2) unix domain socket是用来与KubeEdgecsi(container storage interface) 通信的。

以上就是CloudCorecloudhub功能模块的剖析,如果读者对cloudhub具体都做了哪些事,是怎么做的感兴趣,可以在本文的基础上自行剖析。

 「未完待续……

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

「连载」边缘计算(一)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:边缘部分源码(源码分析篇)
「连载」边缘计算(十四)02-02:边缘部分源码(源码分析篇)

 

你可能感兴趣的:(边缘计算,人工智能)