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

(接上篇)

函数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.mzph.cn/news/659652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

了解 Redis Channel:消息传递机制、发布与订阅,以及打造简易聊天室的实战应用。

文章目录 1. Redis Channel 是什么2. Redis-Cli 中演示使用3. 利用 Channel 打造一个简易的聊天室参考文献 1. Redis Channel 是什么 Redis Channel 是一种消息传递机制&#xff0c;允许发布者向特定频道发布消息&#xff0c;而订阅者则通过订阅频道实时接收消息。 Redis Cha…

Linux命令-ar命令(建立或修改备存文件,或是从备存文件中抽取文件)

补充说明 ar命令 是一个建立或修改备存文件&#xff0c;或是从备存文件中抽取文件的工具&#xff0c;ar可让您集合许多文件&#xff0c;成 为单一的备存文件。在备存文件中&#xff0c;所有成员文件皆保有原来的属性与权限. 语法 ar [-]{dmpqrtx}[abcfilNoPsSuvV] [memberna…

BioTech - 小分子药物生成与从头设计 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135930139 小分子药物生成是一种利用计算方法自动探索化学空间&#xff0c;寻找具有理想生物活性和药物特性的分子结构的过程。从头设计是一种特殊…

【日常总结】windows11 设置文件默认打开方式

一、场景 二、实战 Stage 1&#xff1a;打开设置 Stage 2&#xff1a;应用 > 默认应用 > 搜索 .txt Stage 3&#xff1a;修改成notepad &#xff0c;设置默认值即可 一、场景 windows 11 .txt 默认记事本打开 需求&#xff1a;如何使用notepad打开呢 &#xff1f;…

隧道穿越:隧道穿透技术介绍

后面会进行一些隧道穿越的实验&#xff0c;因此在本篇中这里先介绍一些有关隧道穿越的技术知识点 隧道和隧道穿透 隧道是一种通过互联网基础设施在网络之间传递数据的方式&#xff0c;设计从数据封装、传输到解包的全过程&#xff0c;使用隧道传递的数据&#xff08;或者负载…

abap_bool 类型

abap_bool 类型 abap_bool 有两种abap_true和abap_false&#xff0c;abap_true代表x&#xff0c;abap_false是空

【Emgu CV教程】6.7、图像平滑之MedianBlur()中值滤波

文章目录 一、介绍1.原理2.函数介绍 二、举例1.原始素材2.代码3.运行结果 一、介绍 1.原理 图像的滤波分为线性滤波和非线性滤波,常见的线性滤波就是前面介绍的均值滤波、方框滤波、高斯滤波。常见的非线性滤波主要包括中值滤波、双边滤波&#xff0c;今天就先介绍中值滤波。…

二进制安全虚拟机Protostar靶场(5)堆的简单介绍以及实战 heap0

前言 这是一个系列文章&#xff0c;之前已经介绍过一些二进制安全的基础知识&#xff0c;这里就不过多重复提及&#xff0c;不熟悉的同学可以去看看我之前写的文章 什么是堆 堆是动态内存分配的区域&#xff0c;程序在运行时用来分配内存。它与栈不同&#xff0c;栈用于静态…

【PHP】在ThinkPHP 5.0中设置缓存以提高性能

在ThinkPHP 5.0中&#xff0c;您可以使用Cache类来设置缓存&#xff0c;以提高应用程序的性能。缓存可以减少对数据库的访问次数&#xff0c;从而提高应用程序的响应速度。 首先&#xff0c;确保您已经在config.php文件中启用了缓存。在config.php文件中&#xff0c;将cache配…

asdf安装不同版本的nodejs和yarn和pnpm

安装asdf 安装nodejs nodejs版本 目前项目中常用的是14、16和18 安装插件 asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git asdf plugin-add yarn https://github.com/twuni/asdf-yarn.git可以查看获取所有的nodejs版本 asdf list all nodejs有很多找…

【TCP】三次握手(建立连接)

前言 在网络通信的世界里&#xff0c;可靠传输协议&#xff08;TCP&#xff09;扮演着重要的角色&#xff0c;它保证了数据包能够按顺序、完整地从发送端传送到接收端。TCP协议中有一个至关重要的机制——三次握手。这一过程确保了两个TCP设备在开始数据传输之前建立起一个稳定…

机器的大小端存储模式

大、小端字节序 一个整形数据在内存中的存储方式是该数据的补码&#xff1b; 该数据本事的数据是从高地址位到低地址位的&#xff0c;而计算机的内存中刚好相反&#xff01; 以数字10为例&#xff1a; 补码&#xff1a;0000 0000 0000 0000 0000 0000 0000 1010 补码的十六进制…

windows10设置多个jar后台开机自启

1、window10启动多个jar包的脚本 新建一个txt文档&#xff0c;将以下内容复制到文档中&#xff1a; echo off taskkill /f /im javaw.exe //停用之前启动过的所有后台javaw程序 d: //jar包所在盘符 cd saas //jar包所在文件夹 start cmd /c "title 程序…

Redis简单阐述、安装配置及远程访问

目录 一、Redis简介 1.什么是Redis 2.特点 3.优势 4.数据库对比 5.应用场景 二、 安装与配置 1.下载 2.上传解压 3.安装gcc 4.编译 5.查看安装目录 6.后端启动 7.测试 8.系统服务配置 三、Redis远程访问 1.修改访问IP地址 2.设置登录密码 3.重启Redis服务 …

Maven安装,学习笔记,详细整理maven的一些配置

Maven 1. 初识Maven 2. Maven概述 Maven模型介绍 Maven仓库介绍 Maven安装与配置 3. IDEA集成Maven 4. 依赖管理 01. Maven课程介绍 1.1 课程安排 学习完前端Web开发技术后&#xff0c;我们即将开始学习后端Web开发技术。做为一名Java开发工程师&#xff0c;后端 Web开发技术…

算法练习01——哈希部分双指针

目录 1. 两数之和(*)242. 有效的字母异位词(easy)49. 字母异位词分组(*)349. 两个数组的交集202. 快乐数(1.使用Set存哈希&#xff0c;2.快慢指针)454. 四数相加 II383. 赎金信15. 三数之和*(双指针)18. 四数之和*(双指针)128. 最长连续序列 1. 两数之和(*) https://leetcode.…

Gas Hero Common Heroes NFT 概览与数据分析

作者&#xff1a;stellafootprint.network 编译&#xff1a;mingfootprint.network 数据源&#xff1a;Gas Hero Common Heroes NFT Collection Dashboard Gas Hero “盖世英雄” 是一个交互式的 Web3 策略游戏&#xff0c;强调社交互动&#xff0c;并与 FSL 生态系统集成…

备战蓝桥杯---数据结构与STL应用(入门4)

本专题主要是关于利用优先队列解决贪心选择上的“反悔”问题 话不多说&#xff0c;直接看题&#xff1a; 下面为分析&#xff1a; 很显然&#xff0c;我们在整体上以s[i]为基准&#xff0c;先把士兵按s[i]排好。然后&#xff0c;我们先求s[i]大的开始&#xff0c;即规定选人数…

若依前后端分离集成多数据源SQL Server教程

本章教程,主要介绍如何在若依开源框架前后端分离版本中集成多数据源SQL Server教程。 目录 一、添加依赖 二、修改配置 三、修改代码 四、如何使用 一、添加依赖