当前位置: 首页 > news >正文

【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 的最小和最大版本。
  • 逻辑
    • 根据配置中的 TlsMinVersionTlsMaxVersion 更新 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 协议是 httpunix 且配置了 TLS,发出警告,忽略 TLS 配置。
    • HTTPS/Unixs 检查:如果 URL 协议是 httpsunixs 且未提供证书文件,返回错误。

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
}
  • 逻辑
    • 如果 ListenClientHttpUrlsListenClientUrls 绑定到同一地址且 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)。
  • 关键点
    1. 检查和更新 TLS 配置。
    2. 支持 HTTP 和 HTTPS 协议,同时处理安全和非安全连接。
    3. 确保资源限制(如文件描述符)满足运行要求。
    4. 注册调试工具(如 pprof)。
  • 核心调用
    • transport.NewListenerWithOpts 创建网络监听器。
    • runtimeutil.FDLimit 检查文件描述符限制。
    • sctx.registerPprof 注册性能剖析工具。

相关文章:

【ETCD】【源码阅读】configureClientListeners () 函数解析

逐步解析 configureClientListeners 函数 configureClientListeners 是 ETCD 的一个重要函数&#xff0c;用于配置客户端通信的监听器&#xff08;Client Listeners&#xff09;。这些监听器主要负责处理外部客户端与 ETCD 服务之间的通信&#xff0c;包括 HTTP 和 gRPC 请求。…...

IO进程学习笔记

man手册 普通命令。系统调用的函数。库函数。特殊文件。文件格式。游戏。附加的一些变量 IO介绍 I&#xff1a;input 输入 O&#xff1a;output 输出 对文件的输入和输出 输入-》写文件&#xff0c;将文件中的内容写到内存中去 输出-》读文件&#xff0c;将内存中的内容读取到文…...

智能手机回暖:华为点火,小米荣耀OV拱火

进入11月中下旬&#xff0c;智能手机圈再度热闹起来。包括华为、小米、OPPO、vivo等诸多手机厂商&#xff0c;都在陆续预热发布新机&#xff0c;其中就包括华为Mate 70、小米Redmi K80、vivo的S20&#xff0c;IQOO Neo10等热门新机&#xff0c;这些热门新机的集中上市迅速吸引了…...

Sqoop导入数据(mysql---->>hive)

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

实验3-实时数据流处理-Flink

1.前期准备 &#xff08;1&#xff09;Flink基础环境安装 参考文章&#xff1a; 利用docker-compose来搭建flink集群-CSDN博客 显示为这样就成功了 &#xff08;2&#xff09;把docker&#xff0c;docker-compose&#xff0c;kafka集群安装配置好 参考文章&#xff1a; …...

深度学习实验十四 循环神经网络(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进行部署的&#xff0c;如果有和我一样情况的&#xff0c;可以参考上面的文档部署postgreasql。 注意事项&#xff1a; 因为odoo不允许使用postgresql的默认用户&#xff0c;也就是po…...

【模型对比】ChatGPT vs Kimi vs 文心一言那个更好用?数据详细解析,找出最适合你的AI辅助工具!

在这个人工智能迅猛发展的时代&#xff0c;AI聊天助手已经深入我们的工作与生活。你是否曾在选择使用ChatGPT、Kimi或是百度的文心一言时感到一头雾水&#xff1f;每款AI都有其独特的魅力与优势&#xff0c;那么&#xff0c;究竟哪一款AI聊天助手最适合你呢&#xff1f;本文将带…...

Java——容器(单例集合)(上)

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

如何配置Github并在本地提交代码

前提: 可以流畅访问github, 需要一些上网技巧, 这就自行处理了 申请一个github账号 Github官网地址 首先就是邮箱注册啦, github没有对邮箱的限制, 只要是能收邮件的就ok, qq邮箱, 163等都可以使用. 然后和普通注册账号一样, 一路填写需要的信息, 验证邮箱即可. 如何新增代…...

工作bug,keil5编译器,理解int 类型函数返回值问题,详解!!!

编写不易&#xff0c;禁止搬运&#xff0c;仅供学习&#xff0c;感谢理解 问题现象 下面是一个在keil5里面写的一个&#xff0c;int类型的返回值函数&#xff0c;这个函数里面&#xff0c;只有if else if else这三个判断条件语句&#xff0c;正常来说任何情况下&#xff0c;…...

简明速通Java接口

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

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&#xff0c;preiod 如果末天数比初天数小&#xff0c;需要进一位 package API;import java.time.LocalDate; import java.time.Period;public class preiod {public static void main(String[] args) {// 计算时间差// LocalDate获取对象其中的一个方法LocalDate d1 LocalD…...

使用 FAISS 进行高效相似性搜索:从文本检索到动态数据处理

在现代数据科学和人工智能应用中&#xff0c;处理大量高维数据并从中找到相似项是一个常见任务。无论是在推荐系统、搜索引擎&#xff0c;还是在自然语言处理应用中&#xff0c;如何高效地进行相似性搜索&#xff08;Similarity Search&#xff09;一直是一个挑战。为了解决这个…...

执行“go mod tidy”遇到“misbehavior”错误

执行“go mod tidy”报错下错误&#xff0c;执行“go clean -modcache”和删除“go env GOMODCACHE”指定目录均无效&#xff1a; SECURITY ERROR go.sum database server misbehavior detected!old database:go.sum database tree3397826xyyhzdyAOat5li/EXx/MK1gONQf3LAGqArh…...

深入详解人工智能机器学习:强化学习

目录 强化学习概述 强化学习的基本概念 定义 关键组件 强化学习过程 常用算法 应用示例 示例代码 代码解释 应用场景 强化学习核心概念和底层原理 核心概念 底层原理 总结 强化学习概述 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是机器学习中的…...

力扣打卡11:合并区间(比较器内联,引用传参的优化)

链接&#xff1a;56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 这道题可以用贪心。 首先将intervals的left&#xff08;intervals[i][0]&#xff09;排序。 然后拿出第一个区间&#xff0c;比较后面相邻的区间&#xff1a; 当前right<后left&#xff0c;表示下一…...

《 bilibili-起步级 用户模块接口文档 经验分享 ~》

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

AES 与 SM4 加密算法:深度解析与对比

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...