(接上篇)
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(ModuleContext,MessageContext)。毫无疑问,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是用来与KubeEdge的csi(container storage interface) 通信的。
以上就是CloudCore中cloudhub功能模块的剖析,如果读者对cloudhub具体都做了哪些事,是怎么做的感兴趣,可以在本文的基础上自行剖析。
「未完待续……」
点击下方标题可阅读技术文章
「连载」边缘计算(一)01-16:边缘计算系统逻辑架构(原理篇)
「连载」边缘计算(二)01-17:边缘计算系统逻辑架构(原理篇)
「连载」边缘计算(三)01-18:边缘部分原理解析(原理篇)
「连载」边缘计算(四)01-19:边缘部分原理解析(原理篇)
「连载」边缘计算(五)01-22:边缘部分原理解析(原理篇)
「连载」边缘计算(六)01-23:边缘部分原理解析(原理篇)
「连载」边缘计算(七)01-24:边缘部分原理解析(原理篇)
「连载」边缘计算(八)01-25:边缘部分源码(源码分析篇)
「连载」边缘计算(九)01-26:边缘部分源码(源码分析篇)文章来源:https://www.toymoban.com/news/detail-825658.html
「连载」边缘计算(十)01-29:边缘部分源码(源码分析篇)
「连载」边缘计算(十一)01-30:边缘部分源码(源码分析篇)
「连载」边缘计算(十二)01-31:边缘部分源码(源码分析篇)
「连载」边缘计算(十三)02-01:边缘部分源码(源码分析篇)
「连载」边缘计算(十四)02-02:边缘部分源码(源码分析篇)
文章来源地址https://www.toymoban.com/news/detail-825658.html
到了这里,关于「连载」边缘计算(十五)02-18:边缘部分源码(源码分析篇)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!