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

news/2024/5/19 14:45:26 标签: 边缘计算, 人工智能

(接上篇)

EdgeCore中功能模块的启动

EdgeCore中功能模块的启动与中的CloudCore中功能模块的启动流程完全相同,大家可以参考该部分。

组件源码分析

本节将对Kubernetes的核心组件的源码进行梳理和分析。这些组件包括控制节点的kube-apiserverkube-controller-manager、kube-scheduler,计算节点的kube-let、kube-proxy。

配置文件读取

截至目前,我们已经分析了KubeEdge源码整体架构以及KubeEdge项目中各组件的源码入口。本节将分析KubeEdge项目中CloudCoreEdgeCore组件都会用到的读取配置文件的逻辑。

配置文件读取流程剖析

KubeEdge各模块配置文件读取使用的是相同的,流程也是高度相似的。所以,这里只对KubeEdge其中一个模块读取配置文件的流程进行深入剖析。关于其他模块的配置文件的读取,读者可以在本节的基础上自行剖析。

(1)配置文件读取流程剖析

CloudCore组件的cloudhub模块的配置初始化切入,对KubeEdge的配置文件读取流程进行剖析,具体如下所示。

KubeEdge/cloud/edge/pkg/cloudhub/cloudhub.go

func (a *cloudHub) Start(c *beehiveContext.Context) {

...

initHubConfig()

...

}

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

KubeEdge/cloud/pkg/cloudhub/cloudhub.go

import(

...

"GitHub.com/KubeEdge/beehive/pkg/common/config"

...

)

func initHubConfig() {

cafile, err := config.CONFIG.GetValue("cloudhub.ca").ToString()

...

certfile, err := config.CONFIG.GetValue("cloudhub.cert").ToString()

...

keyfile, err := config.CONFIG.GetValue("cloudhub.key").ToString()

...

util.HubConfig.ProtocolUDS, _ = config.CONFIG.GetValue("cloudhub.enable_uds").ToBool()

util.HubConfig.Address, _ = config.CONFIG.GetValue("cloudhub.address").ToString()

util.HubConfig.Port, _ = config.CONFIG.GetValue("cloudhub.port").ToInt()

util.HubConfig.QuicPort, _ = config.CONFIG.GetValue("cloudhub.quic_port").ToInt()

util.HubConfig.MaxIncomingStreams, _ = config.CONFIG.GetValue("cloudhub.max_incomingstreams").ToInt()

util.HubConfig.UDSAddress, _ = config.CONFIG.GetValue("cloudhub.uds_address").ToString()

util.HubConfig.KeepaliveInterval, _ = config.CONFIG.GetValue("cloudhub.keepalive-interval").ToInt()

util.HubConfig.WriteTimeout, _ = config.CONFIG.GetValue("cloudhub.write-timeout").ToInt()

util.HubConfig.NodeLimit, _ = config.CONFIG.GetValue("cloudhub.node-limit").ToInt()

...

}

根据initHubConfig()函数定义和相关导入可知,config是导入的package,真正起作用的是config.CONFIG。config.CONFIG的定义如下所示。

KubeEdge/beehive/pkg/common/config/config.go

// CONFIG conf

var CONFIG archaius.ConfigurationFactory

上述代码中,config.CONFIG是定义的一个archaius.ConfigurationFactory类型的全局变量。至此,读者会疑惑只定义一个全局变量怎么读取配置文件?肯定会有函数对这个全局变量进行赋值,根据以往经验,这样的全局变量会被所在文件的init()函数初始化。检查该变量所在文件的init()函数,具体如下所示。

KubeEdge/beehive/pkg/common/config/config.go

func init() {

InitializeConfig()

}

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

KubeEdge/beehive/pkg/common/config/config.go

import (

...

archaius "GitHub.com/go-chassis/go-archaius"

...

)

// config file  only support .yml or .yaml  !

func InitializeConfig() {

once.Do(func() {

err := archaius.Init()

...

CONFIG = archaius.GetConfigFactory()

ms := memoryconfigsource.NewMemoryConfigurationSource()

CONFIG.AddSource(ms)

cmdSource := commandlinesource.NewCommandlineConfigSource()

CONFIG.AddSource(cmdSource)

envSource := envconfigsource.NewEnvConfigurationSource()

CONFIG.AddSource(envSource)

confLocation := getConfigDirectory() + "/conf"

_, err = os.Stat(confLocation)

if !os.IsExist(err) {

os.Mkdir(confLocation, os.ModePerm)

}

err = filepath.Walk(confLocation, func(location string, f os.FileInfo, err error) error {

if f == nil {

return err

}

if f.IsDir() {

return nil

}

ext := strings.ToLower(path.Ext(location))

if ext == ".yml" || ext == ".yaml" {

archaius.AddFile(location)

}

return nil

})

...

})

}

上述代码中, InitializeConfig()函数对config.CONFIG进行了赋值,也是读取配置文件内容的真身。

 「未完待续……

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

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


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

相关文章

【Node系列】创建第一个服务器应用

文章目录 一、node介绍二、node创建应用三、node创建应用步骤四、相关链接 一、node介绍 Node.js是一个基于Chrome V8引擎的JavaScript运行环境,可以用于构建高性能的网络应用程序。它采用事件驱动、非阻塞I/O模型,使得程序可以以高效地方式处理并发请求…

如何将 Git 的默认编辑器从 nano 更改为 vim

文章目录 确保安装了 Vim: sudo apt-get install vim这个命令用于在基于 Debian 的系统(如 Ubuntu)上安装 Vim 编辑器。如果 Vim 尚未安装,此命令会从软件仓库下载并安装它。 更改 Git 配置以使用 Vim 作为默认编辑器: code .git/config您提…

计算机网络(第六版)复习提纲21

SS4.6 互联网的路由选择协议 1 关于路由选择协议的基本概念 A 理想的路由算法(路由选择协议的核心)157 1 算法是正确和完整的 2 计算上简单 3 能适应通信量和网络拓扑的变化(自适应性) 4 稳定性 5 公平性 6 应当最佳(特…

第0章 Linux 基础入门

第0章 Linux 基础入门 RHCSA Red Hat Certified System Administrator 红帽认证系统管理员。 什么是计算机 计算机的组成: 控制器 运算器 存储器 输出设备 输入设备 计算机只能识别0和1,也就是二进制数。 为什么要学习Linux Linux 因其高效率…

谷歌浏览器网站打不开,显示叹号

问题: 您与此网站之间建立的连接不安全请勿在此网站上输入任何敏感信息(例如密码或信用卡信息),因为攻击者可能会盗取这些信息。 了解详情 解决方式: 网上有很多原因,亲测为DNS问题,设置&…

WPS WORD 宏导出高亮文本

WPS手机版可以直接导出高亮文本,但只能导出手机编辑的部分,如果同时在电脑上编辑过,电脑上高亮的无法导出,因为作者不一样。 但WPS电脑版没有这个功能,只能通过宏编程实现。 这里利用了审阅模式,在文字高亮…

Go 中 struct tag 如何用?基于它实现字段级别的访问控制

嗨,大家好!本文是系列文章 Go 小技巧第十篇,系列文章查看:Go 语言小技巧。 在 Go 中,结构体主要是用于定义复杂数据类型。而 struct tag 则是附加在 struct 字段后的字符串,提供了一种方式来存储关于字段的…

Spring实现事务(一)

Spring事务 .什么是事务事务的操作Spring中事务的实现准备工作创建表创建项目,引入Spring Web, Mybatis, mysql等依赖配置文件实体类 编程式事务(手动写代码操作事务)声明式事务(利用注解自动开启和提交事务) . 什么是事务 事务是⼀组操作的集合, 是⼀个不可分割的操作 在我们…