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

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

configurePeerListeners 是 ETCD 的一个核心函数,用于为集群中节点之间的通信配置监听器(Peer Listener)。这些监听器主要负责 Raft 协议的消息传递、日志复制等功能。函数返回一个包含所有监听器的列表。

函数签名

func configurePeerListeners(cfg *Config) (peers []*peerListener, err error)
  • 输入参数
    • cfg *Config:指向 Config 配置结构体的指针,包含监听器所需的所有配置信息。
  • 返回值
    • peers []*peerListener:返回一个 peerListener 的切片,表示为每个 Peer 配置的监听器。
    • err error:若配置过程中发生错误,返回详细错误信息。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
1. 更新加密套件配置
if err = updateCipherSuites(&cfg.PeerTLSInfo, cfg.CipherSuites); err != nil {return nil, err
}
  • 作用:更新 TLS 的加密套件(Cipher Suites)。
  • 逻辑
    • 使用 cfg.CipherSuites 更新 cfg.PeerTLSInfo 的加密配置。
    • 如果更新失败,返回错误。

2. 配置自签名证书
if err = cfg.PeerSelfCert(); err != nil {cfg.logger.Fatal("failed to get peer self-signed certs", zap.Error(err))
}
  • 作用:为 Peer 生成自签名证书(如果未提供证书文件)。
  • 逻辑
    • 调用 cfg.PeerSelfCert() 方法生成自签名证书。
    • 如果生成失败,记录错误日志并终止程序。

3. 更新 TLS 版本
updateMinMaxVersions(&cfg.PeerTLSInfo, cfg.TlsMinVersion, cfg.TlsMaxVersion)
  • 作用:更新 TLS 的最小和最大版本。
  • 逻辑
    • 使用配置中的 TlsMinVersionTlsMaxVersion 更新 cfg.PeerTLSInfo
    • 确保使用的 TLS 版本在允许范围内。

4. 检查是否启用 TLS
if !cfg.PeerTLSInfo.Empty() {cfg.logger.Info("starting with peer TLS",zap.String("tls-info", fmt.Sprintf("%+v", cfg.PeerTLSInfo)),zap.Strings("cipher-suites", cfg.CipherSuites),)
}
  • 作用:检查 Peer 是否启用了 TLS。
  • 逻辑
    • 如果 cfg.PeerTLSInfo 不为空,记录日志说明已启用 TLS 并打印配置信息。

5. 初始化监听器切片
peers = make([]*peerListener, len(cfg.ListenPeerUrls))
  • 作用:为每个 Peer URL 初始化对应的监听器。
  • 逻辑
    • 根据 cfg.ListenPeerUrls 的长度,创建一个 peerListener 的切片 peers,用于存储所有监听器。

6. 错误处理回滚逻辑
defer func() {if err == nil {return}for i := range peers {if peers[i] != nil && peers[i].close != nil {cfg.logger.Warn("closing peer listener",zap.String("address", cfg.ListenPeerUrls[i].String()),zap.Error(err),)ctx, cancel := context.WithTimeout(context.Background(), time.Second)peers[i].close(ctx)cancel()}}
}()
  • 作用:在监听器创建过程中发生错误时,关闭已经创建的监听器,清理资源。
  • 逻辑
    • 如果 err != nil,遍历 peers,调用每个监听器的 close 方法,确保释放资源。
    • 使用超时时间 1 秒 防止阻塞。

7. 为每个 Peer URL 创建监听器
for i, u := range cfg.ListenPeerUrls {if u.Scheme == "http" {if !cfg.PeerTLSInfo.Empty() {cfg.logger.Warn("scheme is HTTP while key and cert files are present; ignoring key and cert files", zap.String("peer-url", u.String()))}if cfg.PeerTLSInfo.ClientCertAuth {cfg.logger.Warn("scheme is HTTP while --peer-client-cert-auth is enabled; ignoring client cert auth for this URL", zap.String("peer-url", u.String()))}}peers[i] = &peerListener{close: func(context.Context) error { return nil }}peers[i].Listener, err = transport.NewListenerWithOpts(u.Host, u.Scheme,transport.WithTLSInfo(&cfg.PeerTLSInfo),transport.WithSocketOpts(&cfg.SocketOpts),transport.WithTimeout(rafthttp.ConnReadTimeout, rafthttp.ConnWriteTimeout),)if err != nil {cfg.logger.Error("creating peer listener failed", zap.Error(err))return nil, err}// once serve, overwrite with 'http.Server.Shutdown'peers[i].close = func(context.Context) error {return peers[i].Listener.Close()}
}
  • 主要逻辑
    1. 遍历 cfg.ListenPeerUrls,为每个 URL 创建一个监听器。
    2. HTTP 检查
      • 如果 URL 的协议是 HTTP 且启用了 TLS,发出警告日志。
      • 如果启用了 PeerTLSInfo.ClientCertAuth,但协议为 HTTP,也发出警告。
    3. 创建监听器
      • 调用 transport.NewListenerWithOpts 创建监听器。
      • 配置 TLS 信息、套接字选项、连接超时时间等。
    4. 错误处理
      • 如果监听器创建失败,记录错误日志并返回错误。
    5. 关闭逻辑
      • 设置 peerListenerclose 方法,用于在关闭监听器时释放资源。

8. 返回监听器
return peers, nil
  • 作用:返回配置完成的监听器切片。
  • 如果没有错误,errnilpeers 包含所有配置好的监听器。

总结:

  • 功能configurePeerListeners 函数为集群中每个 Peer URL 配置监听器,用于处理节点间通信。
  • 关键点
    1. 配置 TLS,包括加密套件、TLS 版本、自签名证书等。
    2. 创建监听器并设置关闭逻辑。
    3. 错误回滚机制,确保在发生错误时释放已分配的资源。
    4. 支持 HTTP 和 HTTPS 两种协议,同时发出适当的警告。
  • 核心调用transport.NewListenerWithOpts 是监听器创建的核心方法,它根据配置初始化实际的监听器。

相关文章:

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

configurePeerListeners 是 ETCD 的一个核心函数,用于为集群中节点之间的通信配置监听器(Peer Listener)。这些监听器主要负责 Raft 协议的消息传递、日志复制等功能。函数返回一个包含所有监听器的列表。 函数签名 func configurePeerList…...

1_ssrf总结

content 什么是ssrf?简介原理 危害利用内网访问端口扫描fsockopenurlbypass127.0.0.0被禁止绕过302跳转DNS重绑定绕过 file协议dict协议gopher协议主从复制打redis打mysql打fastcgi协议打未授权redis Defence 什么是ssrf? 简介 SSRF(Server-Side Request Forger…...

深入解析 Redis

1. 为什么 Redis 性能至关重要? 在现代分布式应用中,Redis 被广泛作为缓存系统、消息队列、实时数据存储和会话管理等多种场景的解决方案。作为一个高性能的内存数据库,Redis 的设计理念是提供低延迟和高吞吐量的操作。然而,当 R…...

Visual Studio 2022发布UWP应用证书绑定失败

最近发布UWP应用时,卡在了关联产品这步,一直提示网络链接问题,获取不到产品信息。创建新项目也是这样,猜测低版本的VS不支持发布UWP应用了,便升级到了VS2022。VS2022创建新UWP工程确实可以关联发布应用,并成…...

K8S对接ceph的RBD块存储

1 PG数量限制问题 1.1 原因分析 1.还是老样子,先创建存储池,在初始化为rbd。 [rootceph141~]# ceph osd pool create wenzhiyong-k8s 128 128 Error ERANGE: pg_num 128 size 3 for this pool would result in 295 cumulative PGs per OSD (2067 tot…...

ragflow连不上ollama的解决方案

由于前期wsl默认装在C盘,后期部署好RagFlow后C盘爆红,在连接ollama的时候一直在转圈圈,问其他人没有遇到这种情况,猜测是因为内存不足无法加载模型导致,今天重新在E盘安装wsl 使用wsl装Ubuntu Win11 wsl-安装教程 如…...

ACL与Prefix List(前缀列表)

匹配工具一般搭配其他操作,可实现NAT,路由策略,策略路由,MQC,流量过滤等操作 通配符掩码 我们都知道子网掩码的1是精确匹配,1是大致匹配,1必须连续 我们也知道反掩码的1是大致匹配&#xff0…...

OpenSSH和OpenSSL升级

需求 centos7.9升级SSH和SSL OpenSSH升级为openssh9.8 OpenSSL升级为openssl-3.4.0 下载openssh最新版本与openssl对应版本 openssh最新版本下载地址 wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gzOpenSSL下载地址 这里下载的是3.4.0 wg…...

数据库继续学习

数据库中的外键约束的作用是什么? 外键约束用于在多表操作中保证数据的一致性、完整性和正确性。它确保引用的数据在主表中存在,从而避免孤立记录的出现。 物理外键与逻辑外键的选择? 推荐使用逻辑外键。逻辑外键是指在应用程序层面上实现外键…...

车载以太网-UDPNM

文章目录 UDPNM定义在车载以太网中的作用网络节点状态监测唤醒和睡眠管理网络拓扑发现工作流程消息发送消息接收与处理与其他车载网络协议的比较和协作UDPNM的工作原理是什么?1.消息构建与发送原理消息格式构建发送机制2.消息接收与响应原理接收过程响应机制3.状态管理与定时器…...

网页核心页面设计(第8章)

一、伪元素 伪元素是 CSS 中的一种选择器,用于选择某些特定的元素或元素的一部分,而这些元素本身并不存在于文档的结构中。伪元素使得网页设计师可以更灵活地控制样式,从而可以为元素的内容、框架或文本提供额外的样式,增强网页的…...

在PowerShell下运行curl命令出现错误:Invoke-WebRequest : 无法处理参数,因为参数名称“u”具有二义性

今天在Windows 11下测试Nanamq的HTTP API,按照其文档输入: curl -i --basic -u admin:public -X GET "http://localhost:8081/api/v4/subscriptions" 结果出现二义性错误: 而且输入curl --help命令想看看参数说明的时候&#xff…...

医疗花费预测——协方差矩阵和热力图

引言 在医疗数据分析中,预测个人的医疗花费是一个重要的课题。这不仅有助于个人健康管理,也为医疗资源的合理分配提供了数据支持。本篇博客,我们将探讨如何利用协方差矩阵和热力图来分析和预测个人的医疗花费。我们将以DataFountain提供的数…...

react antd tabs router 基础管理后台模版

在构建 React 后台管理系统时,使用标签页的方式展示路由是一种高效且用户友好的设计模式。这种实现方式通常允许用户在多个页面之间快速切换,并保留页面的状态,类似于浏览器的多标签页功能。 需求分析 1.动态标签页:根据用户的导…...

【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】

目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:编写一个程序实现环形队列的基本运算。 相关知识 为了完成本关任务,你需要掌握: 初始化队列、销毁队列、判断队列是否为空、进队列…...

【数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】

目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:编写一个程序实现链栈的基本运算。 相关知识 为了完成本关任务,你需要掌握: 初始化栈、销毁栈、判断栈是否为空、进栈、出栈、取栈…...

GIT CLONE ERROR: remote: [session-ec426a86] Access denied

报错信息: remote: [session-ec426a86] Access denied 错误原因: 1.更换了不同的GIT仓或者账号 2.之前设置了默认账号密码信息 3. git init 只初始化了GIT项目,并没有清空原有的账号密码配置 处理方法: win11需要到个人文件…...

GitHub 正式收录 MoonBit 作为一门通用编程语言!核心用户突破三万!

MoonBit 编程语言正式被 Github 收录!这对于一个仅有两年发展时间的编程语言来说是一种高度认可,期待未来由 MoonBit 编写的项目数量快速增长,早日成为首个由国人研发迈进 10 万➕ 用户的编程语言。 最近用户数已经接近 3 万(数据…...

PHP中GD库的使用

由于我要用到php的验证码 <?php session_start();// 生成验证码 $random_code substr(md5(uniqid(mt_rand(), true)), 0, 6);// 将验证码保存到 session 中 $_SESSION[captcha] $random_code;// 创建图片 $font 6; $image_width 100; $image_height 40;// 创建图像 $…...

docker安装Elasticsearch和Kibana

上传文件 加载tar包 安装 1.安装elasticsearch 通过下面的Docker命令即可安装单机版本的elasticsearch&#xff1a; docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-node" \-v es-data:/usr/share/elastics…...

【Linux】文件管理必备知识和基本指令

【Linux】文件管理必备知识和基本指令 什么是操作系统什么是文件什么是路径01. ls 指令02. pwd命令03. cd 指令04. touch指令05.mkdir指令&#xff08;重要&#xff09;&#xff1a;06.rmdir指令 && rm 指令&#xff08;重要&#xff09;&#xff1a;rmdir指令rm指令 0…...

欢迪迈手机商城设计与实现

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 题目&#xff1a;欢迪迈手机商城设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管…...

量化交易系统开发-实时行情自动化交易-3.4.2.3.数字货币市场深度数据

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来聊聊基于Okex交易所API获取市场深…...

有序集合ZSET【Redis对象篇】

&#x1f3c6; 作者简介&#xff1a;席万里 ⚡ 个人网站&#xff1a;https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜&#xff0c;同时略懂Vue与React前端技术&#xff0c;也了解一点微信小程序开发。 &#x1f37b; 对计算机充满兴趣&#xff0c;愿意并且希望学习更多的技…...

力扣-图论-9【算法学习day.59】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…...

如何选择安全、可验证的技术?

澳大利亚信号局的澳大利亚网络安全中心 (ASD 的 ACSC) 发布了一份指导文件&#xff0c;题为《选择安全和可验证的技术》&#xff0c;旨在帮助组织在采购软件&#xff08;专有或开源&#xff09;、硬件&#xff08;例如物联网设备&#xff09;和云服务&#xff08;SaaS、MSP 服务…...

Allure在自动化测试中的应用

01 Allure的简介及使用 1、应用场景 自动化的结果一定是通过一个报告来进行体现 Allure 是一个独立的报告插件&#xff0c;生成美观易读的报告&#xff0c;目前支持Python、Java、PHP、C#等语言 为dev/QA 提供详尽的测试报告、测试步骤、日志&#xff0c;也可以为管理层提供统…...

C# 探险之旅:第十一节 - 循环(foreach):一场“遍历”奇幻岛的大冒险!

嘿&#xff0c;勇敢的探险家们&#xff01;欢迎来到C#奇幻岛的第十一站——“遍历”奇幻岛&#xff01;今天&#xff0c;我们要乘坐一艘叫做foreach的魔法船&#xff0c;去遍历&#xff08;也就是一个一个看过来&#xff09;岛上那些神秘的宝藏箱&#xff01;准备好了吗&#x…...

Ubuntu24.04配置STMTrack

项目地址&#xff1a;https://github.com/fzh0917/STMTrack 一、安装 CUDA 参考链接&#xff1a; Ubuntu24.04配置DINO-Tracker Ubuntu多CUDA版本安装及切换 由于之前在其他项目中已经安装了 CUDA12.1&#xff0c;这次需要安装另一个版本。 1. 查看安装版本 按照 requireme…...

【Java学习笔记】Map接口和常用方法

一、 Map接口实现类的 特点[很实用] key是自己存的java对象 value是一个固定的 //当有相同的 k ,就等价于替换. 二、 Map常用方法 &#xff08;根据键–>k&#xff09; 三、Map接口遍历方法 package com.hspedu.map_; import java.util.*; /** * author 韩顺平 * ver…...

下载网站的表格要钱如何做/企业网站制作哪家好

各种算法学习集合 https://github.com/youngyangyang04/leetcode-master 方法介绍 前缀树、字典树 https://blog.csdn.net/weixin_39778570/article/details/81990417 // 侧面有好多的算法集合 https://baike.baidu.com/item/%E5%AD%97%E5%85%B8%E6%A0%91/9825209?fro…...

专业做网站app 真假/提高网站搜索排名

下面主要说一些 View 的基础知识&#xff0c;从而为后面更好的理解 View 做铺垫。 主要内容有&#xff1a; View 的位置参数、 MotionEvent 和 TouchSlop 对象、VelocityTracker、GestureDetector 和 Scroller 对象。 下面来了解一些这些基础的概念吧。(部分内容摘自Android开…...

做网站和小程序的区别/seo搜索优化公司排名

在 fdatool 中发现在对滤波器的数据进行定点化时&#xff0c;可以选择不同的 rounding mode 和 overflow mode&#xff0c;对于舍入模式&#xff0c;我以前只用过round fix floor ceiling&#xff0c;但是这次发现默认的舍入模式是 nearest convergent &#xff0c;没有见过…...

惠州响应式网站建设公司/最新热搜新闻事件

本文将介绍了最先进的深度学习优化方法&#xff0c;帮助神经网络训练得更快&#xff0c;表现得更好。有很多个不同形式的优化器&#xff0c;这里我们只找最基础、最常用、最有效和最新的来介绍。 优化器 首先&#xff0c;让我们定义优化。当我们训练我们的模型以使其表现更好…...

旅游wordpress/网站是否含有seo收录功能

一、简介 EhCache 是一个纯Java的进程内缓存框架&#xff0c;具有快速、精干等特点。ehcache官网&#xff1a;http://www.ehcache.org/ 可以下载文档看看&#xff0c;里面关于EhCache缓存写的非常清楚。 二、特点 主要的特性有&#xff1a; 1. 快速 2. 简单 3. 多种缓存策略 …...

网站改版 请示/网址提交入口

部署在linux上的java程序&#xff0c;有时更新了包&#xff0c;忘记了是否执行了重启&#xff0c;此时有必要根据java进程的启动时间和包的更新时间来确定。 1. 查看Linux进程的启动时间 # ps axo pid,ppid,comm,pmem,lstartPID PPID COMMAND %MEM …...