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

news/2024/5/19 14:03:55 标签: 边缘计算, 数据库, 人工智能

(接上篇)

函数StartModules()定义具体如下所示。

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

}

}

从上面 StartModules()函数的定义,可以清楚地知道该函数首先获得已经注册的模块,然后通过一个for循环启动所有的模块。

各模块的启动过程如下所示。

// GracefulShutdown is if it gets the special signals it does modules cleanup

func GracefulShutdown() {

c := make(chan os.Signal)

signal.Notify(c, syscall.SIGINT, syscall.SIGHUP, syscall.SIGTERM,

syscall.SIGQUIT, syscall.SIGILL, syscall.SIGTRAP, syscall.SIGABRT)

select {

case s := <-c:

klog.Infof("Get os signal %v", s.String())

//Cleanup each modules

modules := GetModules()

for name, module := range modules {

klog.Infof("Cleanup module %v", name)

module.Cleanup()

}

}

}

GracefulShutdown()函数与StartModules()函数的逻辑类似,也是首先获得已经注册的模块,然后通过一个for循环等待关闭所有的模块。

EdgeCore组件内部各功能模块的共用框架

(1)EdgeCore中模块的共用框架和功能分析

在《深入理解边缘计算:云、边、端工作原理与源码分析》8.2.2节的EdgeCore代码入口部分,我们已经分析到EdgeCore中功能模块的注册和已注册功能模块的启动,下面接着往下分析。

EdgeCore中功能模块的注册具体如下所示。

// registerModules register all the modules started in EdgeCore

func registerModules() {

devicetwin.Register()

edged.Register()

edgehub.Register()

eventbus.Register()

edgemesh.Register()

metamanager.Register()

servicebus.Register()

test.Register()

dbm.InitDBManager()

}

registerModules()函数中,可以知道EdgeCore中有devicetwin、edged、edgehubeventbusedgemeshmetamanagerservicebus和test共8个功能模块,还有一个db初始化函数。Register()函数定义具体如下所示:

// Register register devicetwin

func Register() {

dtclient.InitDBTable()

dt := DeviceTwin{}

core.Register(&dt)

}

KubeEdge/edge/pkg/devicetwin/devicetwin.go中的Register(…)函数只是调用了KubeEdge/beehive/pkg/core/module.go中的Register(…)函数。下面继续探究Register()函数。

core.Register(&dt)函数定义具体如下所示。

...

var (

// Modules map

modules         map[string]Module

disabledModules map[string]Module

)

...

func Register(m Module) {

if isModuleEnabled(m.Name()) {

modules[m.Name()] = m

klog.Infof("Module %v registered", m.Name())

} else {

disabledModules[m.Name()] = m

klog.Warningf("Module %v is not register, please check modules.yaml",m.Name())

}

}

上述代码中,devicetwin模块注册最终会将该模块的结构体放入一个map[string]Module类型的全局变量modules中。

按照cloudhub模块注册的思路分析,edged、edgehubeventbusedgemeshmetamanagerservicebus和test也做了相同的事情,最终把各自的结构体放入一个map[string]Module类型的全局变量modules中。

这8个功能模块之所以能够采用相同的注册流程,是因为它们都实现了KubeEdge/beehive/pkg/core/module.go中的Module接口。Module接口定义具体内容如下所示。

type Module interface {

Name() string

Group() string

Start(c *context.Context)

Cleanup()

}

我们可以分别在KubeEdge/edge/pkg/devicetwin/devicetwin.go、KubeEdge/edge/pkg/edged/edged.go、KubeEdge/edge/pkg/edgehub/module.go、KubeEdge/edge/pkg/eventbus/event_bus.go、KubeEdge/edge/pkg/edgemesh/module.go、KubeEdge/edge/pkg/metamanager/module.go、KubeEdge/edge/pkg/servicebush/servicebus.go、KubeEdge/edge/pkg/test/test.go中找到devicetwin、edged、edgehubeventbusedgemeshmetamanagerservicebus和test共8个功能模块对Module接口的具体实现。

  「未完待续……

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

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


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

相关文章

【算法题】79. 单词搜索

题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或…

CentOS下使用Yum安装Java的方法

在安装Java之前&#xff0c;我们需要先进行一些准备工作。我们需要确保CentOS系统已经安装了Yum。我们可以通过以下命令来检查&#xff1a; yum --version如果系统已经安装了Yum&#xff0c;则会显示Yum的版本信息&#xff1b;否则&#xff0c;我们需要先安装Yum。 我们需要确…

5G_RACH(一)

什么是RACH RACH 代表 Random Access Channel。这是开机时UE发给eNB的第一条消息。 为什么选择RACH &#xff1f;&#xff08;RACH 的功能是什么&#xff1f; 当你第一次听到RACH或RACH Process这个词时&#xff0c;你脑海中浮现的第一个问题是“为什么是RACH&#xff1f;”…

C# 在矩形内获取一个指定大小的矩形(两个矩形的中心点是重合的)

C# 在矩形内获取一个指定大小的矩形&#xff08;两个矩形的中心点是重合的&#xff09; 示例1&#xff1a; using System.Drawing;public class RectangleUtils {public static Rectangle GetInnerRectangle(Rectangle outerRectangle, Size innerSize){// 计算内部矩形的左上…

Element Plus的el-table表格中单元格内容过多显示省略号,并修改弹框样式

1​​​​​​1el-table表格中内容超出单元格的宽度会自动换行&#xff0c;会使整个表格看起来显得不太美观&#xff0c;此时可以使用el-table-column 自带的 show-overflow-tooltip"true" 属性来设置 <el-table-column prop"address" label"地址…

记 2024-01-30 fiber 学习

【react】什么是fiber&#xff1f;fiber解决了什么问题&#xff1f;从源码角度深入了解fiber运行机制与diff执行 - 知乎 fiber是一种调度让出机制&#xff0c;让渲染可以断开&#xff0c;利用空余时间继续渲染&#xff0c;不影响浏览器掉帧&#xff0c;也是一种并发的处理机制 …

Docker应用-自定义网络连接

Docker网络 文章目录 Docker网络网络的基础配置自定义网络网络连通 网络的基础配置 大量的互联网应用服务包括多个服务组件&#xff0c;这往往需要多个容器之间通过网络通信进行互相配合。 目前Docker提供了映射容器端口到宿主机主机和容器互联机制来为容器提供网络服务&…

【数据结构】二叉搜索树的模拟实现

目录 1、概念 2、模拟实现 2.1、查找 2.2、插入 2.3、删除&#xff08;难点&#xff09; 3、性能分析 4、完整代码 1、概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有…