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

news/2024/5/19 16:03:07 标签: 边缘计算, 人工智能

(接上篇)

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:边缘部分源码(源码分析篇)


http://www.niftyadmin.cn/n/5361674.html

相关文章

了解UDP发送过快导致的问题和对应解决方案

在当今这个以数据为核心的时代,企业对于数据传输的速度和稳定性有着日益增长的需求。UDP凭借其低延迟和高效率的特性,在实时通信和大规模数据传输领域扮演着关键角色。然而,UDP的无连接特性和缺乏可靠性也给数据传输带来了挑战,尤…

Elasticsearch(简称ES)性能优化 实践

Elasticsearch(简称ES)性能优化主要包括以下几个方面: 索引优化: 选择合适的分片数:根据业务需求和数据量合理设置分片数,避免过多或过少分片造成性能问题。分片数过多会导致创建分片速度变慢、集群易崩溃…

Java——Arrays常用方法

Arrays常用方法 Java 中的 Arrays 类提供了一系列静态方法,可以用来操作数组。 1. sort() 方法——默认升序排序 Arrays.sort() 方法用于对数组进行排序。该方法有多个重载版本,可以对不同类型的数组进行排序。 public static void sort(int[] arr) …

T113-Pro的buildroot添加gdisk ( GPT disks )出现gptfdisk needs a toolchain w/ C++的解决方法

问题背景: 最近入手了百问网的全志T113-Pro,用Emmc启动发现一张32GB的SD卡在烧录了百问网镜像 100ask-t113-pro_sdcard.img 的系统后,仅有200多M的存储空间。第一时间上百问网论坛看是否有板友也出现类似情况,发现了一个帖子正是描…

【开源】基于JAVA+Vue+SpringBoot的教学资源共享平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

Cmake语法学习3:语法

1.双引号 1.1 命令参数 1)介绍 命令中多个参数之间使用空格进行分隔,而 cmake 会将双引号引起来的内容作为一个整体,当它当成一个参数,假如你的参数中有空格(空格是参数的一部分),那么就可以使…

Ubuntu中rosdep update报错的解决办法

1.问题: Ubuntu22.04系统下面,rosdep update总是报错 2.方法 2.1 方法一 a.直接访问raw.githubusercontent.com不可行,按一下网址查询raw.githubusercontent.com的ip地址 多个地点ping[raw.githubusercontent.com]服务器-网站测速-站长工…

holidaywork1

1.指针&#xff1a; 指针就像是一个存放地址的变量。它们帮助我们访问其他变量的位置 int x 10; int *ptr; ptr &x;2.函数指针&#xff1a; 这是一个指向函数的指针变量&#xff0c;就像是可以指向函数的“指南针” #include <stdio.h>int add(int a, int b) {re…