【ETCD】【源码阅读】configureClientListeners () 函数解析
逐步解析 configureClientListeners
函数
configureClientListeners
是 ETCD 的一个重要函数,用于配置客户端通信的监听器(Client Listeners)。这些监听器主要负责处理外部客户端与 ETCD 服务之间的通信,包括 HTTP 和 gRPC 请求。
函数签名:
func configureClientListeners(cfg *Config) (sctxs map[string]*serveCtx, err error)
- 输入参数:
cfg *Config
:指向 ETCD 配置结构体的指针,包含监听器相关的所有配置项。
- 返回值:
sctxs map[string]*serveCtx
:返回一个serveCtx
的映射,键是监听地址,值是serveCtx
实例。err error
:如果配置过程中出现错误,返回详细的错误信息。
函数解析
1. 更新加密套件配置
if err = updateCipherSuites(&cfg.ClientTLSInfo, cfg.CipherSuites); err != nil {return nil, err
}
- 作用:更新客户端通信中 TLS 的加密套件。
- 逻辑:
- 使用配置中的
CipherSuites
更新cfg.ClientTLSInfo
。 - 如果加密套件的配置不正确,返回错误。
- 使用配置中的
2. 配置客户端自签名证书
if err = cfg.ClientSelfCert(); err != nil {cfg.logger.Fatal("failed to get client self-signed certs", zap.Error(err))
}
- 作用:为客户端通信生成自签名证书(如果未提供证书文件)。
- 逻辑:
- 调用
ClientSelfCert
方法生成自签名证书。 - 如果生成失败,记录错误日志并终止程序。
- 调用
3. 更新 TLS 版本
updateMinMaxVersions(&cfg.ClientTLSInfo, cfg.TlsMinVersion, cfg.TlsMaxVersion)
- 作用:更新客户端通信中 TLS 的最小和最大版本。
- 逻辑:
- 根据配置中的
TlsMinVersion
和TlsMaxVersion
更新cfg.ClientTLSInfo
。
- 根据配置中的
4. 启用 pprof
if cfg.EnablePprof {cfg.logger.Info("pprof is enabled", zap.String("path", debugutil.HTTPPrefixPProf))
}
- 作用:如果启用了
pprof
(性能剖析工具),记录日志说明已启用。
5. 初始化 serveCtx
映射
sctxs = make(map[string]*serveCtx)
- 作用:创建一个空的
serveCtx
映射,用于存储每个客户端监听器的上下文。
6. 校验客户端 URL
for _, u := range append(cfg.ListenClientUrls, cfg.ListenClientHttpUrls...) {if u.Scheme == "http" || u.Scheme == "unix" {if !cfg.ClientTLSInfo.Empty() {cfg.logger.Warn("scheme is http or unix while key and cert files are present; ignoring key and cert files", zap.String("client-url", u.String()))}if cfg.ClientTLSInfo.ClientCertAuth {cfg.logger.Warn("scheme is http or unix while --client-cert-auth is enabled; ignoring client cert auth for this URL", zap.String("client-url", u.String()))}}if (u.Scheme == "https" || u.Scheme == "unixs") && cfg.ClientTLSInfo.Empty() {return nil, fmt.Errorf("TLS key/cert (--cert-file, --key-file) must be provided for client url %s with HTTPS scheme", u.String())}
}
- 逻辑:
- HTTP/Unix 检查:如果 URL 协议是
http
或unix
且配置了 TLS,发出警告,忽略 TLS 配置。 - HTTPS/Unixs 检查:如果 URL 协议是
https
或unixs
且未提供证书文件,返回错误。
- HTTP/Unix 检查:如果 URL 协议是
7. 为 ListenClientUrls
配置监听器
for _, u := range cfg.ListenClientUrls {addr, secure, network := resolveURL(u)sctx := sctxs[addr]if sctx == nil {sctx = newServeCtx(cfg.logger)sctxs[addr] = sctx}sctx.secure = sctx.secure || securesctx.insecure = sctx.insecure || !securesctx.scheme = u.Schemesctx.addr = addrsctx.network = network
}
- 作用:为所有
ListenClientUrls
配置监听器。 - 逻辑:
- 解析每个 URL 的地址、是否安全(TLS)、网络类型。
- 如果
serveCtx
不存在,则创建新的上下文并添加到sctxs
。 - 更新上下文的协议、地址和网络信息。
8. 为 ListenClientHttpUrls
配置监听器
for _, u := range cfg.ListenClientHttpUrls {addr, secure, network := resolveURL(u)sctx := sctxs[addr]if sctx == nil {sctx = newServeCtx(cfg.logger)sctxs[addr] = sctx} else if !sctx.httpOnly {return nil, fmt.Errorf("cannot bind both --listen-client-urls and --listen-client-http-urls on the same url %s", u.String())}sctx.secure = sctx.secure || securesctx.insecure = sctx.insecure || !securesctx.scheme = u.Schemesctx.addr = addrsctx.network = networksctx.httpOnly = true
}
- 逻辑:
- 如果
ListenClientHttpUrls
和ListenClientUrls
绑定到同一地址且httpOnly
标志不一致,返回错误。 - 配置上下文的安全标志、协议、地址和网络类型。
- 如果
9. 创建实际监听器
for _, sctx := range sctxs {if sctx.l, err = transport.NewListenerWithOpts(sctx.addr, sctx.scheme,transport.WithSocketOpts(&cfg.SocketOpts),transport.WithSkipTLSInfoCheck(true),); err != nil {return nil, err}...
}
- 作用:为每个上下文创建实际的网络监听器。
- 逻辑:
- 调用
transport.NewListenerWithOpts
创建监听器。 - 配置套接字选项和 TLS 信息。
- 调用
10. 检查文件描述符限制
if fdLimit, fderr := runtimeutil.FDLimit(); fderr == nil {if fdLimit <= reservedInternalFDNum {cfg.logger.Fatal("file descriptor limit of etcd process is too low; please set higher",zap.Uint64("limit", fdLimit),zap.Int("recommended-limit", reservedInternalFDNum),)}sctx.l = transport.LimitListener(sctx.l, int(fdLimit-reservedInternalFDNum))
}
- 作用:检查进程的文件描述符限制,确保足够高以支持大规模连接。
- 逻辑:
- 如果限制过低,记录致命错误并终止程序。
11. 注册调试和性能工具
if cfg.EnablePprof || cfg.LogLevel == "debug" {sctx.registerPprof()
}
if cfg.LogLevel == "debug" {sctx.registerTrace()
}
- 作用:如果启用了
pprof
或调试日志,注册性能和跟踪工具。
总结
- 功能:
configureClientListeners
负责为所有客户端通信 URL 创建监听器,并初始化对应的上下文(serveCtx
)。 - 关键点:
- 检查和更新 TLS 配置。
- 支持 HTTP 和 HTTPS 协议,同时处理安全和非安全连接。
- 确保资源限制(如文件描述符)满足运行要求。
- 注册调试工具(如
pprof
)。
- 核心调用:
transport.NewListenerWithOpts
创建网络监听器。runtimeutil.FDLimit
检查文件描述符限制。sctx.registerPprof
注册性能剖析工具。
相关文章:
【ETCD】【源码阅读】configureClientListeners () 函数解析
逐步解析 configureClientListeners 函数 configureClientListeners 是 ETCD 的一个重要函数,用于配置客户端通信的监听器(Client Listeners)。这些监听器主要负责处理外部客户端与 ETCD 服务之间的通信,包括 HTTP 和 gRPC 请求。…...

IO进程学习笔记
man手册 普通命令。系统调用的函数。库函数。特殊文件。文件格式。游戏。附加的一些变量 IO介绍 I:input 输入 O:output 输出 对文件的输入和输出 输入-》写文件,将文件中的内容写到内存中去 输出-》读文件,将内存中的内容读取到文…...
智能手机回暖:华为点火,小米荣耀OV拱火
进入11月中下旬,智能手机圈再度热闹起来。包括华为、小米、OPPO、vivo等诸多手机厂商,都在陆续预热发布新机,其中就包括华为Mate 70、小米Redmi K80、vivo的S20,IQOO Neo10等热门新机,这些热门新机的集中上市迅速吸引了…...

Sqoop导入数据(mysql---->>hive)
目录 数据传输流程脚本报错和异常说明1. Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf2. 数据导入hive后显示NULL 数据传输流程 mysql---->>hdfs---->>hive 数据从mysql表中取出,放到hdfs上(由targ…...

实验3-实时数据流处理-Flink
1.前期准备 (1)Flink基础环境安装 参考文章: 利用docker-compose来搭建flink集群-CSDN博客 显示为这样就成功了 (2)把docker,docker-compose,kafka集群安装配置好 参考文章: …...

深度学习实验十四 循环神经网络(1)——测试简单循环网络的记忆能力
目录 一、数据集构建 1.1数据集的构建函数 1.2加载数据集并划分 1.3 构建Dataset类 二、模型构建 2.1嵌入层 2.2SRN层 2.3模型汇总 三、模型训练 3.1 训练指定长度的数字预测模型 3.2 损失曲线展示 四、模型评价 五、修改 附完整可运行代码 实验大体步骤&#x…...

k8s部署odoo18(kubeshpere面板)
Postgresql部署 链接: kubesphere搭建 postgres15 因为我的是在另一台服务器使用kubesphere进行部署的,如果有和我一样情况的,可以参考上面的文档部署postgreasql。 注意事项: 因为odoo不允许使用postgresql的默认用户,也就是po…...

【模型对比】ChatGPT vs Kimi vs 文心一言那个更好用?数据详细解析,找出最适合你的AI辅助工具!
在这个人工智能迅猛发展的时代,AI聊天助手已经深入我们的工作与生活。你是否曾在选择使用ChatGPT、Kimi或是百度的文心一言时感到一头雾水?每款AI都有其独特的魅力与优势,那么,究竟哪一款AI聊天助手最适合你呢?本文将带…...

Java——容器(单例集合)(上)
一 容器介绍 容器,是用来容纳物体、管理物体。生活中,我们会用到各种各样的容器。如锅碗瓢盆、箱子和包等 程序中的“容器”也有类似的功能,用来容纳和管理数据。比如,如下新闻网站的新闻列表、教育网站的课程列表就是用“容器”来管理 视频…...

如何配置Github并在本地提交代码
前提: 可以流畅访问github, 需要一些上网技巧, 这就自行处理了 申请一个github账号 Github官网地址 首先就是邮箱注册啦, github没有对邮箱的限制, 只要是能收邮件的就ok, qq邮箱, 163等都可以使用. 然后和普通注册账号一样, 一路填写需要的信息, 验证邮箱即可. 如何新增代…...
工作bug,keil5编译器,理解int 类型函数返回值问题,详解!!!
编写不易,禁止搬运,仅供学习,感谢理解 问题现象 下面是一个在keil5里面写的一个,int类型的返回值函数,这个函数里面,只有if else if else这三个判断条件语句,正常来说任何情况下,…...

简明速通Java接口
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文从代码层面直接整理Java接口 让老油子们无需再理解繁杂的概念了。 Java接口在代码层面是做什么的 说白了老铁,Java的接口就是一个类,这个类中只能声明属性和方法,属性需要…...

MVC基础——市场管理系统(二)
文章目录 项目地址三、Produtcts的CRUD3.1 Products列表的展示页面(Read)3.1.1 给Product的Model里添加Category的属性3.1.2 View视图里展示Product List3.2 增加Product数据(Add)3.2.1 创建ViewModel用来组合多个Model3.2.2 在_ViewImposts里引入ViewModels3.2.3 添加Add的…...

java------------常用API preiod duration 计算时间差
1,preiod 如果末天数比初天数小,需要进一位 package API;import java.time.LocalDate; import java.time.Period;public class preiod {public static void main(String[] args) {// 计算时间差// LocalDate获取对象其中的一个方法LocalDate d1 LocalD…...
使用 FAISS 进行高效相似性搜索:从文本检索到动态数据处理
在现代数据科学和人工智能应用中,处理大量高维数据并从中找到相似项是一个常见任务。无论是在推荐系统、搜索引擎,还是在自然语言处理应用中,如何高效地进行相似性搜索(Similarity Search)一直是一个挑战。为了解决这个…...
执行“go mod tidy”遇到“misbehavior”错误
执行“go mod tidy”报错下错误,执行“go clean -modcache”和删除“go env GOMODCACHE”指定目录均无效: SECURITY ERROR go.sum database server misbehavior detected!old database:go.sum database tree3397826xyyhzdyAOat5li/EXx/MK1gONQf3LAGqArh…...
深入详解人工智能机器学习:强化学习
目录 强化学习概述 强化学习的基本概念 定义 关键组件 强化学习过程 常用算法 应用示例 示例代码 代码解释 应用场景 强化学习核心概念和底层原理 核心概念 底层原理 总结 强化学习概述 强化学习(Reinforcement Learning, RL)是机器学习中的…...

力扣打卡11:合并区间(比较器内联,引用传参的优化)
链接:56. 合并区间 - 力扣(LeetCode) 这道题可以用贪心。 首先将intervals的left(intervals[i][0])排序。 然后拿出第一个区间,比较后面相邻的区间: 当前right<后left,表示下一…...

《 bilibili-起步级 用户模块接口文档 经验分享 ~》
bilibili - 用户模块接口文档 - 经验分享 ~ 数据库er关系图 : 迅速跳转链接 枚举码实体类 : 迅速跳转链接 使用apifox.json格式导入接口文档 步骤 登录Apifox。新建文件, 将代码粘贴到该文件, 并更改后缀为 .apifox.json进入项目,点击“导入”。选择“Apifox”格式…...

AES 与 SM4 加密算法:深度解析与对比
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...