【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年工作经验,…...
Ubuntu 20.04 LTS下Miniconda3安装与配置全攻略(含常见错误解决)
Ubuntu 20.04 LTS下Miniconda3安装与配置全攻略(含常见错误解决) 如果你正在Ubuntu 20.04 LTS上搭建Python开发或数据科学环境,Miniconda3绝对是一个值得考虑的选择。作为Anaconda的精简版,它保留了核心的conda包管理功能&#x…...
智能媒体捕获:猫抓cat-catch的资源拦截与解析技术方案
智能媒体捕获:猫抓cat-catch的资源拦截与解析技术方案 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓cat-catch作为一款开源浏览器扩展,通过深度网络请求分析与流媒体协议…...
Qwen3.5-27B部署教程(Docker进阶):自定义模型路径、挂载外部存储与日志卷
Qwen3.5-27B部署教程(Docker进阶):自定义模型路径、挂载外部存储与日志卷 1. 环境准备与快速部署 在开始之前,请确保您的系统满足以下要求: 硬件要求:至少4张RTX 4090 D 24GB显卡软件要求:已…...
Mac Mouse Fix革命性指南:让普通鼠标在Mac上实现专业级操作体验
Mac Mouse Fix革命性指南:让普通鼠标在Mac上实现专业级操作体验 【免费下载链接】mac-mouse-fix Mac Mouse Fix - A simple way to make your mouse better. 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix Mac Mouse Fix是一款专为Mac用户…...
知识图谱入门第一步:用SpringBoot+HanLP快速构建你的中文实体识别与关系抽取Demo
知识图谱实战:基于SpringBoot与HanLP的中文实体关系抽取系统构建指南 在人工智能与大数据技术蓬勃发展的今天,知识图谱作为结构化知识的重要载体,正在智能搜索、推荐系统、金融风控等领域展现出巨大价值。但对于许多刚接触这一领域的开发者而…...
可视化是对比原始数据和填补数据的强大工具。你可以使用箱线图、密度图或散点图来可视化原始数据和填补后的数据
下面的内容摘录自《用R探索医药数据科学》专栏文章的部分内容(原文5665字)。 2篇2章6节:R的多重填补法中随机回归填补法的应用,MICE包的实际应用和统计与可视化评估-CSDN博客 在数据分析中,缺失数据是常见且具有挑战性…...
毕设程序java高校辅导员工作管理系统 基于SpringBoot的高校学生事务协同管理平台设计与实现 基于Java的高校学工一体化服务系统开发与应用
毕设程序java高校辅导员工作管理系统95jjf711 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。在高等教育持续扩张的当下,辅导员承担着学生日常管理和服务的重要职责&…...
3步实现专业级字幕去除:面向视频创作者的AI处理工具全指南
3步实现专业级字幕去除:面向视频创作者的AI处理工具全指南 【免费下载链接】video-subtitle-remover 基于AI的图片/视频硬字幕去除、文本水印去除,无损分辨率生成去字幕、去水印后的图片/视频文件。无需申请第三方API,本地实现。AI-based too…...
ai赋能openclaw安装:快马平台智能诊断与个性化配置推荐系统
最近在折腾OpenClaw这个工具时,发现它的安装过程对新手不太友好,各种依赖关系和配置参数让人头大。不过好在现在有了AI辅助开发工具,整个过程变得轻松多了。今天就来分享下如何用智能诊断和个性化推荐系统搞定OpenClaw安装。 依赖关系智能分析…...
隐马尔科夫模型(HMM)实战:从天气预测到股票市场分析
1. 隐马尔科夫模型入门:从天气预报说起 第一次听说隐马尔科夫模型(HMM)时,我正盯着手机上的天气预报发呆。为什么明明显示"晴天",下午却突然下起暴雨?这让我开始思考天气预测背后的数学模型。HMM正是解决这类问题的利器…...
