kubeedge系列之Beehive(二)

回顾

上一篇文章我们主要看了下kubeedge模块是如何注册到Beehive通信框架的,这篇文章我们主要看下kubeedge模块是如何基于Beehive进行通信的

消息构造

从上篇文章我们可以看到,模块注册时,会给每个模块绑定一个model.Message类型的channel。这个model.Message就定义了模块间传递消息的具体构造。
kubeedge系列之Beehive(二)_第1张图片

接收消息流程(云端edgecontroller模块举例)

在上篇文章结尾我们看到包含模块注册信息的coreContext作为各个模块Start函数的参数,传递到各个模块。edgecontroller是kubeedge云端的其中一个模块,主要负责边缘端与k8s apiserver的交互,这里我们以该模块举例,看消息是如何传递的。
kubeedge系列之Beehive(二)_第2张图片
首先coreContext作为edgecontroller的Start函数参数,传递到edgecontroller模块,并赋值到config.Context。然后看到启动了两个实例NewUpstreamController和NewDownstreamController,分别控制边缘端到云端和云端到边缘端的事件消息。这里我们先只看NewUpstreamController,这个函数主要就干了两件事,创建k8s的客户端和MessageLayer.
kubeedge系列之Beehive(二)_第3张图片
根据对NewMessageLayer的分析,可知它的具体实现是NewContextMessageLayer,这里我们可以看到包含模块消息channel的config.Context被赋值给ContextMessageLayer.Context。
在这里插入图片描述
我们可以看到ContextMessageLayer的具体实现都是通过调用ContextMessageLayer.Context(ChannelContext)的方法来实现的
kubeedge系列之Beehive(二)_第4张图片
到这里我们已经清楚了NewUpstreamController可以利用core.Context来对消息进行具体的哪些操作了,接下来我们通过对upstream.Start()进行分析,看模块具体是调用这些消息处理方法的例子。
kubeedge系列之Beehive(二)_第5张图片
这里我们主要先关注uc.dispatchMessage这个方法,模块就是通过它来接收其他模块传来的消息。
kubeedge系列之Beehive(二)_第6张图片
这里我们可以看到dispatchMessage通过调用uc.messageLayer.Receive()来接收消息。这个uc.messageLayer.Receive的具体实现是ChannelConext(coreConext)的Receive方法.通过edgecontroller模块注册时,模块绑定model.Message类型的channel获取
kubeedge系列之Beehive(二)_第7张图片

发送消息流程(Cloudhub举例)

cloudhub简介

cloudhub是基于websocket的实现,主要用于收集需要发送到边缘端的云端模块消息,向边缘端发送。然后还负责接收边缘端发送给云端模块的消息。它也像edgecontroller模块一样,需要注册和绑定消息channel。

启动

kubeedge系列之Beehive(二)_第8张图片
这里我们主要关注channelq.NewChannelEventQueue和servers.StartCloudHub两个函数

kubeedge系列之Beehive(二)_第9张图片
从上面可以看出,NewChannelEventQueue创建一个ChannelEventQueue的结构体,包含模块注册信息的上下文和线程安全的map channelPool。然后调用dispatchMessage通过cloudhub绑定的消息channel从其它云端模块获取需要发送给边缘端的消息,通过这个函数,我们还能知道channelPool是以nodeID作为键,包含事件event类型的channel作为值的map。
kubeedge系列之Beehive(二)_第10张图片
当ChannelEventQueue生成后,会作为参数传递给StartCloudHub
kubeedge系列之Beehive(二)_第11张图片
StartCloudHub主要分为认证初始化,websocket handler初始化和websocket server启动三部分,我们这里只需要关注websocket handler的相关实现。从上面看,websocket handler初始化主要是初始化WebSocketHandler下面的EventHandler,其中我们需要关注EventHandler.EventQueue和EventHandler.Handlers两个属性,分别对应事件队列ChannelEventQueue和EventHandler对来往请求处理的函数,包括向边缘端发送事件EventWriteLoop和向云端其它模块发送消息EventReadLoop。
接下来是PathEvent(/{project_id}/{node_id}/events)和handler(ServeEvent)的绑定。当边缘端向websocker server传输数据时,就会调用ServeEvent。
kubeedge系列之Beehive(二)_第12张图片
关于ServeEvent的实现,我们这里只需关注对ServeConn的调用
kubeedge系列之Beehive(二)_第13张图片
然后对EnrollNode的调用

kubeedge系列之Beehive(二)_第14张图片
这里我们主要关注Publish的实现
在这里插入图片描述
这里向“controller”组的所有模块发送消息,如果我们回顾下edgecontroller注册和upstream接受消息的详细实现,edgecontroller注册了模块“controller”并把“controller”放到模块组“controller”中,而upstream通过messagelayer调用Receive(“controller”),则可以接收对应的消息。
到这里我们终于看到基于Beehive通信框架发送消息的方式了

你可能感兴趣的:(kubeedge系列之Beehive(二))