【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年工作经验,…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
