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

(接上篇)

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.mzph.cn/news/662296.shtml

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

相关文章

4-树-合并两个有序链表

这是树的第4篇算法,力扣链接。 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入&#xf…

关于使用js的循环语句打印一个金字塔的三种方案

//for循环方式 <html> <head> <title>金字塔三角形</title> <script> var ta prompt("请输入金字塔的行数"); //浏览行数 for(var i1;i<ta;i){ …

SQL Limit

在 SQL 中&#xff0c;LIMIT 通常用于限制查询结果的行数。然而&#xff0c;具体的语法和用法可能在不同的数据库系统中有所不同。以下是在一些常见的数据库系统中使用 LIMIT 的示例&#xff1a; 1. MySQL / MariaDB: -- 返回前10行 SELECT * FROM your_table LIMIT 10;-- 返…

Linux下gcc的使用与程序的翻译

gcc和程序的翻译过程 gcc介绍程序的翻译过程预编译编译汇编链接 命令行式宏定义 gcc介绍 gcc是一款编译C语言编译器&#xff0c;可以把我们用vim写的代码编译成可执行程序。编译C用g进行编译&#xff0c;C的文件后缀是test.cc或test.cpp或test.cxx 如果要安装g就执行以下命令 …

C# winform 多语言(json)方式实现

前后对比 使用nuget json工具包1.总体思路 创建对应的json字典对照表 { "测试":"Test", "语言":"Language", "设置":"Set", "中文(默认)":"Chinese (default)", "英文":"E…

【HarmonyOS应用开发】ArkTS 属性动画的使用(十二)

一、概述 属性动画&#xff0c;是最为基础的动画&#xff0c;其功能强大、使用场景多&#xff0c;应用范围较广。常用于如下场景中&#xff1a; 一、页面布局发生变化。例如添加、删除部分组件元素。二、页面元素的可见性和位置发生变化。例如显示或者隐藏部分元素&#xff0…

CANoe学习笔记——窗口类型

CANoe中的窗口类型&#xff0c;共分为三种 1&#xff1a;MDI windows 2&#xff1a;Standard Windows 3&#xff1a;Docking Windows 窗口有多种类型&#xff0c;每种类型都定义了特定的窗口行为。通过点击窗口顶部的区域&#xff0c;可以更改窗口类型。 如下图&#xff0…

Python的requests库与HTTP代理的使用:魔法般的网络探险之旅

嘿&#xff0c;各位魔法探险家们&#xff01;今天我们要一起探索Python的requests库与HTTP代理的神奇组合&#xff0c;开启一段魔法般的网络探险之旅&#xff01; 首先&#xff0c;我们要明白什么是requests库。简单说&#xff0c;requests库就是Python中的魔法飞毯&#xff0…

Linux基础知识合集

整理了一下学习的一些关于Linux的一些基础知识&#xff0c;同学们也可以通过公众号菜单栏查看&#xff01; 一、基础知识 Linux基础知识 Linux命令行基础学习 Linux用户与组概念初识 Linux文件与目录权限基础 Linux中文件内容的查看 Linux系统之计划任务管理 二、服务器管理 Vm…

MySql主从同步,同步SQL_ERROR 1032解决办法

1.登录从库 mysql -u root -p 2.输入命令查看状态 SHOW SLAVE STATUS\G; 3.找到对应的错误数据位置 Slave_IO_Running: YesSlave_SQL_Running: NoReplicate_Do_DB: app_push_centerReplicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Tabl…

“欢天喜地迎新春”下姜村邻里守望写对联活动

卯兔追冬去&#xff0c;辰龙报春来。空谷幽香谱佳期&#xff0c;红联金句寄吉祥。春联是我国特有的文学形式&#xff0c;贴春联是继承传统习俗的一种方式&#xff0c;是对祖先的尊敬&#xff0c;对传统的继承。春节前夕&#xff0c;家家户户贴上红红的春联&#xff0c;一副副透…

Ubuntu 关闭rsyslog,var/log/syslog文件过大解决

关闭命令&#xff1a; systemctl stop syslog.socket rsyslog.service这个命令会停止rsyslog服务和syslog.socket。在某些情况下&#xff0c;仅仅停止rsyslog服务是不够的&#xff0c;因为syslog.socket可能会重新启动它。所以&#xff0c;你需要同时停止这两个服务。 请注意&…

Android ViewPager2 同屏显示左右item

大家都知道Google最近发布的ViewPager2基本不兼容ViewPager&#xff0c;虽然众多特性仍然可以使用&#xff0c;但两者在代码和应用方面相差甚远。就比如ViewPager的显示左右ITEM使用在ViewPager2之上仍然会留下左右的边距&#xff0c;但是静止状态下无法显示出左右item&#xf…

西圣Olite开放式耳机持续100+天霸榜:品质优势再掀数码狂潮

随着开放式耳机的市场竞争加剧&#xff0c;用户对耳机的音质和配置要求越来越高。而西圣开放式耳机的不断推陈出新&#xff0c;正是对客户需求的完美回应&#xff01;西圣开放式耳机&#xff0c;在现在鱼龙混杂的市场上&#xff0c;能够获得着卓越的研发成果并且还在不断的追求…

qt学习:停车场管理系统+摄像头+http识别车牌+sqlite3数据库

目录 参考前面发的几篇文章http识别车牌&#xff0c;sqlite3数据库、摄像头的文章 步骤 部分代码 新建一个项目&#xff0c;加入前面用到的http和image两个文件&#xff0c;和加入用到的模块和头函数和成员&#xff0c;加入前面用到的全局变量 配置ui界面 在构造函数中初…

Java14常用类4:Java比较器

5.Java比较器 基本数据类型的数据&#xff08;除Boolean类型外&#xff09;需要比较大小的话&#xff0c;使用比较运算符即可&#xff0c;但是引用数据类型不能直接使用比较运算符来比较大小。 Java中经常涉及到对象数组的排序问题&#xff0c;对此Java有 2种方式实现对象的排…

Qt5 基于OpenGL实现六轴机械臂三维仿真

需求 在Qt中通过OPenGL方式加载三维模型STL文件&#xff0c;然后将多个结构的STL文件类型的模型进行组装&#xff0c;形成6轴机械臂三维模型的显示&#xff0c;并且可以对每个关节进行关节角度的控制。 新建一个C类STLFileLoader&#xff0c;用于加载STL文件&#xff0c;并进…

IP协议(2) 和 数据链路层协议基础

IP协议续 1.路由选择 在复杂的网络结构中,我们需要找到一个通往终点的路线,这就是路由选择 举个例子:我们在没有手机导航之前,想去一个地方得是到一个地方问一下路的方式最终找到目的地 路由的过程,其实就是样子问路的过程 1.当IP数据包到达路由器的时候,会查看目的IP 2.路由器…

Jmeter高级使用

文章目录 JMeter之计数器JMeter之集合点JMeter之断言JMeter之动态关联后置处理器&#xff1a;正则表达式提取器 JMeter之分布式测试JMeter之组件执行顺序元件的作用域元件的执行顺序配置元件Http Cookie管理器 多协议接口的性能测试Debug采样器Http请求中文乱码的解决Post参数设…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 为了答谢各位网友的支持&#xff0c;从今日起…