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

(接上篇)

组件中模块的共用框架和功能分析

KubeEdge组件中各个功能模块之间是通过Beehive来组织和管理的。Beehive是一个基于go-channels的消息框架。但本文的重点不是Beehive,所以只会分析KubeEdge中用到的Beehive的相关功能。下面深入CloudCoreEdgeCoreedgemeshedgesite组件,探究组件内部各功能模块的共用框架。

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

  1. CloudCore组件内部各功能模块的共用框架

(1)CloudCore中功能模块的注册

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

func registerModules() {

cloudhub.Register()

edgecontroller.Register()

devicecontroller.Register()

}

registerModules()函数中,可以知道CloudCore中有cloudhubedgecontrollerdevicecontroller共3个功能模块。

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

func Register() {

core.Register(&cloudHub{})

}

KubeEdge/cloud/pkg/cloudhub/cloudhub.go中的Register()函数只是调用KubeEdge/beehive/pkg/core/module.go中的Register()函数。    core.Register(&cloudHub{})函数定义具体如下所示。

...

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

}

}

从上面的变量和函数定义可以清楚地看到,cloudhub模块注册最终会将该模块的结构体放入一个map[string]Module类型的全局变量modules中。

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

cloudhubedgecontrollerdevicecontroller三个功能模块之所以能够采用相同的注册流程,是因为它们都实现了KubeEdge/beehive/pkg/core/module.go中的Module接口。

Module接口定义具体内容如下所示。

type Module interface {

Name() string

Group() string

Start(c *context.Context)

Cleanup()

}

我们可以分别在KubeEdge/cloud/pkg/cloudhub/cloudhub.go、KubeEdge/cloud/pkg/controller/controller.go、KubeEdge/cloud/pkg/devicecontroller/module.go中找到cloudhubedgecontrollerdevicecontroller三个功能模块对Module接口的具体实现。

(2)CloudCore中功能模块的启动

CloudCore中功能模块的启动具体如下所示。

//Run starts the modules and in the end does module cleanup

func Run() {

//Address the module registration and start the core

StartModules()

// monitor system signal and shutdown gracefully

GracefulShutdown()

}

上述代码中,通过StartModules()启动已经注册的模块,通过GracefulShutdown()将模块优雅地停止。至于如何启动和停止,需要进入GracefulShutdown()函数内容一探究竟。

 「未完待续……

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/656933.shtml

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

相关文章

Vertica单点更改服务器ip

需求 服务器网段调整,将ip:192.168.40.190收回,使用ip:192.168.40.200 默认情况下,节点 IP 地址和导出 IP 地址配置相同的 IP 地址。导出地址是网络上有权访问其他 DBMS 系统的节点的 IP 地址。使用导出地址从 DBMS …

解锁Web3:数字未来的大门

随着科技的不断推进,我们正站在数字时代的新门槛上。Web3,作为互联网的下一个演进阶段,正在逐渐揭开数字未来的面纱。本文将深入探讨Web3的本质、对社会的影响以及在数字时代中所扮演的关键角色。 什么是Web3? Web3是互联网发展的…

vs2008配置mysql

1.在官网下载C库:MySQL Connector C 1.0.5 2.在官网下载C库:mysql-connector-c-noinstall-6.0.2-win32 3.vs2008中工程配置 4.拷贝dll到程序运行目录

DFS专题(dfs求连通块)P1451 求细胞数量——洛谷(题解)

题目描述 一矩形阵列由数字 00 到 99 组成,数字 11 到 99 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。 输入格式 第一行两个整数代表矩阵大小 �n 和 �m。 接下…

从源码到成功经营:连锁餐饮管理系统的开发实践

连锁餐饮业更是需要精密的系统来统一管理多个分店的运营,提高效益并确保一致的服务标准。所以,本篇文章小编将为大家讲述如何开发连锁餐饮管理系统,希望对您有一定的启发。 一、系统设计与架构 首先,成功的连锁餐饮管理系统源码需…

高等数学:导数

本文主要参考视频如下: 【建议收藏】同济七版《高等数学》精讲视频 | 期末考试 | 考研零基础 | 高数小白_哔哩哔哩_bilibili 仅供本人学习使用。 之前主要学习了三个概念: 极限; 无穷小; 连续; 先简单捋一捋。 极限是说…

IDEA:git 回滚本地提交-git 选择 Reset Current Branch to

前言 回滚提交到本地但是还没有 Push 上去的提交 选择我们要回滚的节点,然后点击 git 选择 Reset Current Branch to… 再选择 Hard 。当我们点击 Reset 的时候,代码就会回滚到单前选中的这个版本

C++求素数

C continue语句求100-200之间的素数 #include <iostream>int main() {for (int num 100; num < 200; num) {bool isPrime true;for (int i 2; i < num / 2; i) {if (num % i 0) {isPrime false;break; // 跳出当前循环}}if (isPrime) {std::cout << nu…

「优选算法刷题」:只出现一次的数字Ⅲ

一、题目 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。 示例 1&#xff1a; …

计算机网络-数据交换方式(电路交换 报文交换 分组交换及其两种方式 )

文章目录 为什么要数据交换&#xff1f;总览电路交换电路交换的各个阶段建立连接数据传输释放连接 电路交换的特点电路交换的优缺点 报文交换报文交换流程报文交换的优缺点 分组交换分组交换流程分组交换的优缺点 数据交换方式的选择分组交换的两种方式数据报方式数据报方式的特…

密码加密——MD5与BCryptPasswordEncoder

目录 一、问题 二、密码加密 1、MD5密码加密 2、BCryptPasswordEncoder加密&#xff08;推荐&#xff09; 2.1 特点 2.2 使用步骤 一、问题 在数据库表中的密码都是明文存储的&#xff0c;安全性太低 需求&#xff1a; 将密码加密后存储&#xff0c;提高安全性 二、密码加密…

探析零知识证明高能发展路径:走向更安全、私密且可扩展的 Web3 新时代

原文&#xff1a;https://www.coinbase.com/blog/understanding-the-zero-knowledge-landscape 作者&#xff1a;Jonathan King&#xff5c;Coinbase Ventures 编译&#xff1a;TinTinLand 本文核心观点 2023 年&#xff0c;零知识技术吸引了逾 4 亿美元的投资&#xff0c;主…

正则表达式补充以及sed awk

正则表达式&#xff1a; 下划线算 在单词里面 解释一下过程&#xff1a; 在第二行hello world当中&#xff0c;hello中的h 与后面第一个h相匹配&#xff0c;所以hello中的ello可以和abcde匹配 在world中&#xff0c;w先匹配h匹配不上&#xff0c;则在看0&#xff0c;r&#…

三、ElasticSearch集群搭建实战

本篇ES集群搭建主要是在Linux VM上&#xff0c;未使用Docker方式, ES版本为7.10 ,选择7.10版本原因可以看往期文章介绍。 一、ElasticSearch集群搭建须知 JVM设置 Elasticsearch是基于Java运行的&#xff0c;es7.10可以使用jdk1.8 ~ jdk11之间的版本&#xff0c;更高版本还没…

防御保护 笔记整理

一、ASPF--- 针对应用层的包过滤 ASPF --- 针对应用层的包过滤 --- 用来抓取多通道协议中协商端口的关键数据包&#xff0c;之后&#xff0c;将端 口算出&#xff0c;将结果记录在sever-map表中&#xff0c;相当于开辟了一条隐形的通道。 FTP --- 文件传输协议 FTP协议是一个典…

Android imageView.setImageXXX() 引发的卡顿问题

在 Android 开发中&#xff0c;ImageView 是一个用户界面控件&#xff0c;用于在应用中显示图片。它是 Android UI 组件库中一个非常基础和常用的部分。使用 ImageView&#xff0c;你可以在屏幕上显示来自不同来源的图像&#xff0c;比如位图文件、绘图资源 drawable、网络来源…

NPDP认证:产品经理的国际专业认证

你是否想证明自己在产品开发与管理方面的专业能力&#xff1f;NPDP认证正是你需要的&#xff01;&#x1f525; NPDP认证&#xff0c;即产品经理国际资格认证&#xff0c;由美国产品开发与管理协会&#xff08;PDMA&#xff09;所发起&#xff0c;是全球公认的新产品开发专业认…

Redis(九)集群(cluster)

文章目录 概述作用1. redis集群的槽位slot2. redis集群的分片3. 第1,2点的优势&#xff1a;**最大优势&#xff0c;方便扩缩容和数据分派查找**4. slot槽位映射&#xff0c;一般业界有3种解决方案第一种&#xff1a;哈希取余分区第二种&#xff1a;一致性哈希算法分区第三种&am…

源码安装nginx并提供服务脚本

一、下载nginx ①官网复制下载链接 ②在Linux中下载 [rootopenEuler2 ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz 二、解压并指定路径 [rootopenEuler2 ~]# tar xf nginx-1.24.0.tar.gz -C /usr/local/src/ 三、安装依赖 dnf install -y gcc gcc-c mak…

微信小程序从入门到进阶(三)

数据监听器 通过observers声明数据监听器 使用场景&#xff1a;1、需要监听数据的变化 2、在数据变化之后&#xff0c;进行一些操作的时候 <view wx:for"{{ listData }}" wx:key"index" class"tab {{ active index ? active : }}" bind…