理解 Envoy 的架构

理解 Envoy 的架构对于深入理解 Istio 至关重要,因为 Envoy 是 Istio 数据平面的核心。Envoy 是一个高性能的 C++ 分布式代理,设计为云原生应用和大规模微服务架构的网络基础。

以下是 Envoy 架构的关键组成部分和核心理念:

核心设计理念:

  1. 进程外架构 (Out-of-Process): Envoy 作为独立的代理进程运行,与应用程序进程解耦。这使得它可以为任何语言编写的应用程序提供通用的网络功能。

  2. 高性能 (High Performance):

    • 非阻塞 I/O: 完全基于事件驱动和非阻塞的异步处理模型(通常使用 libevent 或类似的库),能够在少量线程下处理大量并发连接。

    • 多线程模型: 通常有一个主线程处理协调和信号,多个 Worker 线程处理连接和请求。每个 Worker 线程独立处理一部分连接,减少了线程间同步的开销。

  3. L3/L4 和 L7 感知: Envoy 既能作为 L3/L4 层的网络代理(如 TCP 代理),也能作为 L7 层的应用代理(如 HTTP/2, gRPC 代理)。

  4. 可扩展性 (Extensibility): 通过过滤器 (Filters) 机制,可以轻松地插入自定义逻辑来处理网络流量,例如修改头部、认证、授权、速率限制等。

  5. 动态配置 (Dynamic Configuration): Envoy 可以通过一组称为 xDS (Discovery Service) 的 API 从管理服务器(如 Istio 的 Istiod)动态获取其全部配置,无需重启即可更新。

  6. 可观测性 (Observability): Envoy 从一开始就设计为具有强大的可观测性,提供详细的统计数据 (stats)、日志 (logging) 和分布式追踪 (distributed tracing) 支持。

  7. 最终一致性 (Eventually Consistent): 在大规模分布式系统中,配置的更新是最终一致的,Envoy 的设计能够很好地适应这一点。

核心架构组件:

下面我们来看一下 Envoy 内部的关键组件以及请求是如何流经这些组件的:

  1. Downstream (下游): 指发起请求的客户端,例如你的服务 A,或者浏览器。

  2. Upstream (上游): 指接收请求并提供响应的服务,例如你的服务 B。

  3. Listener (监听器):

    • 作用: 监听器是 Envoy 接收下游连接的入口。每个监听器绑定到一个 IP 地址和端口。

    • 配置: 定义了当连接被接受时如何处理。

    • 核心: 每个监听器都包含一个或多个过滤器链 (Filter Chains)

  4. Filter Chain (过滤器链):

    • 作用: 当监听器接受一个新连接时,它会根据匹配条件(如 SNI、ALPN、源/目标 IP 等)选择一个过滤器链来处理该连接。

    • 组成: 过滤器链由一个或多个网络过滤器 (Network Filters) 组成。

  5. Network Filters (L3/L4 网络过滤器):

    • 作用: 处理原始字节流和连接级别的事件。它们按顺序执行。

    • 常见的网络过滤器:

      • envoy.filters.network.tcp_proxy: TCP 代理,将 TCP 流量转发到上游集群。

      • envoy.filters.network.http_connection_manager (HCM): 这是最重要的网络过滤器之一。 它将原始字节流解释为 HTTP/1.x, HTTP/2, HTTP/3 协议,并管理 HTTP 流的生命周期。HCM 内部有其自己的 HTTP 过滤器链

      • envoy.filters.network.tls_inspector: 检查 TLS 握手中的 SNI 或 ALPN,用于过滤器链匹配。

      • envoy.filters.network.rbac: 基于角色的访问控制。

      • envoy.filters.network.mongo_proxy, envoy.filters.network.redis_proxy 等: 特定协议的解析和代理。

  6. HTTP Connection Manager (HCM):

    • 作用: 如上所述,它是一个特殊的网络过滤器,专门用于处理 HTTP 流量。

    • 核心: HCM 内部包含一个或多个 HTTP 过滤器 (HTTP Filters)

  7. HTTP Filters (L7 HTTP 过滤器):

    • 作用: 处理 HTTP 请求和响应的各个方面,例如读取/修改头部、请求体、路由决策、认证、授权等。它们也按顺序执行。

    • 常见的 HTTP 过滤器:

      • envoy.filters.http.router (Router Filter): 这是最重要的 HTTP 过滤器,通常是 HTTP 过滤器链中的最后一个。 它的核心任务是根据请求的属性(如 Host, Path, Headers)和路由配置 (Route Configuration) 将请求路由到合适的上游集群 (Upstream Cluster)

      • envoy.filters.http.jwt_authn: JWT 认证。

      • envoy.filters.http.rbac: HTTP 级别的 RBAC。

      • envoy.filters.http.lua: 通过 Lua 脚本扩展功能。

      • envoy.filters.http.wasm: 通过 WebAssembly 插件扩展功能 (Istio 常用)。

      • envoy.filters.http.cors: CORS 处理。

      • envoy.filters.http.fault: 故障注入。

      • envoy.filters.http.gzip: 压缩/解压缩。

  8. Router Filter 和 Route Configuration (路由配置):

    • 作用: Router 过滤器使用路由配置来决定如何处理一个 HTTP 请求。

    • 路由配置包含:

      • Virtual Hosts (虚拟主机): 根据 Host 头部匹配。

      • Routes (路由规则): 在虚拟主机内,根据路径、头部、查询参数等匹配请求。

      • Action: 匹配成功后执行的动作,最常见的是将请求转发到一个或多个集群 (Cluster),但也可能是重定向、直接响应等。

      • Retry Policy (重试策略): 定义失败请求的重试行为。

      • Timeout (超时): 定义请求超时。

  9. Cluster (集群):

    • 作用: Cluster 是 Envoy 可以连接的一组逻辑上相似的上游主机(后端服务实例)。

    • 配置:

      • Load Balancing Policy (负载均衡策略): 如 Round Robin, Least Request, Ring Hash 等。

      • Health Checking (健康检查): Envoy 会主动对集群中的主机进行健康检查,并将不健康的主机从负载均衡池中剔除。

      • Outlier Detection (异常点检测): 根据连续的 5xx 错误、延迟等指标,暂时将表现不佳的主机从负载均衡池中移除。

      • Circuit Breaking (熔断): 限制对上游集群的并发连接数、挂起请求数等,防止雪崩效应。

      • TLS Context: 定义连接到上游主机时使用的 TLS 配置(如客户端证书、CA 证书等)。

  10. Endpoints / Hosts (端点/主机):

    • 作用: Cluster 中的具体上游服务实例,通常是 IP:Port。

    • 发现方式: 端点信息可以通过静态配置,或通过 EDS (Endpoint Discovery Service) 动态发现。

  11. xDS API (动态发现服务):
    Envoy 通过 gRPC 或 REST API 从管理服务器获取其配置。主要的 xDS 服务包括:

    • LDS (Listener Discovery Service): 获取监听器配置。

    • RDS (Route Discovery Service): 获取 HTTP 路由配置 (由 HCM 内的 Router Filter 使用)。

    • CDS (Cluster Discovery Service): 获取集群配置。

    • EDS (Endpoint Discovery Service): 获取集群中各个端点(主机)的信息。

    • SDS (Secret Discovery Service): 获取 TLS 证书、私钥等敏感信息。

    • ADS (Aggregated Discovery Service): 将多个 xDS 服务聚合在一个 gRPC 流上,简化管理和保证更新顺序。

请求处理流程概览 (以 HTTP 为例):

  1. 连接建立: 客户端 (Downstream) 向 Envoy 的某个 Listener 的 IP:Port 发起 TCP 连接。

  2. Listener 接受: Listener 接受连接。

  3. Filter Chain 匹配: 根据连接属性选择一个 Filter Chain。

  4. Network Filter 处理: 连接流经 Network Filter Chain:

    • 例如,TLS Inspector 可能首先运行。

    • 然后,http_connection_manager (HCM) 接管。

  5. HCM 处理: HCM 开始解析 HTTP 协议。

  6. HTTP Filter 处理: 请求流经 HCM 内部的 HTTP Filter Chain:

    • 例如,JWT 认证过滤器检查 Token。

    • RBAC 过滤器检查权限。

    • 最后到达 Router Filter。

  7. 路由决策: Router Filter 根据其 Route Configuration (通过 RDS 获取) 匹配请求,找到目标 Cluster。

  8. 上游连接:

    • Envoy 从 Cluster (通过 CDS 获取) 中选择一个健康的 Endpoint (通过 EDS 获取),并根据负载均衡策略。

    • Envoy 与选定的 Endpoint 建立上游连接 (可能使用 mTLS,证书通过 SDS 获取)。

  9. 请求转发: Envoy 将 HTTP 请求转发给上游 Endpoint。

  10. 响应处理: 上游 Endpoint 返回响应。

  11. 响应过滤: 响应数据会反向流经 HTTP Filter Chain (某些过滤器也处理响应) 和 Network Filter Chain。

  12. 响应返回: Envoy 将最终的响应发送给下游客户端。

线程模型:

  • Main Thread: 负责初始化、xDS 通信、信号处理、Admin 端点等。

  • Worker Threads: 数量可配置。每个 Worker 线程运行一个事件循环 (event loop),处理分配给它的监听器上的连接、I/O 事件、执行过滤器链等。Worker 线程之间几乎没有共享状态,数据通过线程本地存储 (TLS - Thread Local Storage,非 Transport Layer Security) 或消息传递来处理。这种设计大大减少了锁竞争,提高了并发性能。

总结:

Envoy 的架构设计使其成为一个功能强大、高性能且高度可配置的代理。其分层的过滤器模型提供了极大的灵活性,而 xDS API 则使其能够适应动态的微服务环境。理解这些核心组件和它们之间的交互方式,是理解 Istio 如何实现流量管理、安全性和可观测性的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/79216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android开发-常用布局

在Android应用开发中,布局决定了用户界面的结构和元素之间的相对位置。选择合适的布局不仅能够提升用户体验,还能提高代码的可维护性和灵活性。本文将介绍几种最常用的Android布局方式,包括LinearLayout、RelativeLayout、ConstraintLayout以…

如何在MySQL中实现类似Redis的PING命令的功能来检测连接状态?

要在MySQL中实现类似Redis的PING命令的功能来检测连接状态,可以采用以下方法: 方法一:使用简单的SQL查询 最直接的方法是通过执行一个简单的查询来检测连接状态,例如: SELECT 1;如果查询成功并返回结果(…

Vue 系列之:defineProps、defineEmits、...

defineProps 用于接收父组件传递的属性值。 父组件&#xff1a; <!-- 父组件 --> <template><Child1 str"字符串" :num"num" />-----------------<Child2 str"字符串" :num"num" /> </template><…

windows服务器部署Gitlab

代码托管,如果对工具功能要求不高,Gitea也可以满足需要,只是功能相对比较简单。 通常GltLab是部署在linux服务器上的,windows版本已经不维护了。不过现在windows10 11已经可以实现部署了,一个是windows本机部署linux虚拟机(windows商店直接安装或者其他虚拟机平台都可以)…

剖析 FFmpeg:从基本功能到过滤器,实现音视频处理的灵活性

目录 1.解复用2 解码2.1 音频解码2.2 视频解码 3 修饰3.1 avio3.2 重采样 4 过滤器4.1 过滤器基本知识4.2 简单过滤器4.3 复杂滤镜图 1.解复用 解复用就是把容器中的媒体流分离出来&#xff0c;方便我们对媒体流处理。 step1&#xff1a;对媒体文件上下文初始化 AVFormatCont…

kafka学习笔记(四、生产者、消费者(客户端)深入研究(三)——事务详解及代码实例)

1.事务简介 Kafka事务是Apache Kafka在流处理场景中实现Exactly-Once语义的核心机制。它允许生产者在跨多个分区和主题的操作中&#xff0c;以原子性&#xff08;Atomicity&#xff09;的方式提交或回滚消息&#xff0c;确保数据处理的最终一致性。例如&#xff0c;在流处理中…

Missashe计网复习笔记(随时更新)

Missashe计算机网络复习笔记 前言&#xff1a;这篇笔记用于博主对计网这门课所学进行记录和总结&#xff0c;也包括一些个人的理解。正在更新当中…… 第一章 计算机网络体系结构 考纲内容 (一) 计算机网络概述 计算机网络的概念、组成与功能;计算机网络的分类; 计算机网络…

PVP鼠标推荐(deepseek)

下面有不懂的自行百度查找&#x1f44d; ❤️ 以下是几款在 双击性能&#xff08;DBC&#xff09; 和 拖拽点击&#xff08;DC&#xff09; 方面表现优秀的游戏鼠标推荐&#xff0c;结合了硬件性能、微动寿命以及玩家口碑&#xff1a; 1. 罗技 G102/G203 Lightsync 特点&#…

ABP vNext + EF Core 实战性能调优指南

ABP vNext EF Core 实战性能调优指南 &#x1f680; 目标 本文面向中大型 ABP vNext 项目&#xff0c;围绕查询性能、事务隔离、批量操作、缓存与诊断&#xff0c;系统性地给出优化策略和最佳实践&#xff0c;帮助读者快速定位性能瓶颈并落地改进。 &#x1f4d1; 目录 ABP vN…

为啥大模型一般将kv进行缓存,而q不需要

1. 自回归生成的特点 大模型&#xff08;如 GPT 等&#xff09;在推理时通常采用自回归生成的方式&#xff1a; 模型逐个生成 token&#xff0c;每次生成一个新 token 时&#xff0c;需要重新计算注意力。在生成第 t 个 token 时&#xff0c;模型需要基于前 t-1 个已生成的 t…

3DGS-slam:splatam公式

配套讲解视频&#xff1a;https://www.bilibili.com/video/BV1ZgfBYdEpg/?spm_id_from333.1387.homepage.video_card.click&vd_sourced4c3e747c32049ddd90dcce17208f4e0 1、多维高斯分布公式: 对于多维&#xff08;多变量&#xff09;高斯分布&#xff0c;概率密度函数的…

从Dockerfile 构建docker镜像——保姆级教程

从Dockfile开始 dockerfile简介开始构建1、编辑dockerfile2、构建镜像3、拉取镜像4、推送到镜像仓库 镜像的优化1、优化的基本原则2、多阶段构建 dockerfile简介 开始构建 1、编辑dockerfile # 使用官方的 Python 3.8 镜像作为基础镜像 FROM python:3.8-slim# 设置工作目录 …

开元类双端互动组件部署实战全流程教程(第2部分:控制端协议拆解与机器人逻辑调试)

作者&#xff1a;那个写了个机器人结果自己被踢出房间的开发者 游戏逻辑房间结构参考界面 从这张图我们能看出&#xff0c;该组件按功能结构细分为多个房间&#xff0c;每个房间底注、准入标准不同&#xff0c;对应的控制模块也有层级区分。常规来说&#xff0c;一个“互动房间…

[特征工程]机器学习-part2

1 特征工程概念 特征工程:就是对特征进行相关的处理 一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程 特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。 特征工程步骤…

[数据库之十一] 数据库索引之联合索引

执行数据库查询时&#xff0c;通常查询条件是多对个属性进行判断和约束&#xff0c;对于这种类型的查询&#xff0c;如果存在多个索引则使用多个索引&#xff0c;或者使用建立在多属性搜索码上的索引&#xff0c;这样能提高查询效率。 一、使用多个单码索引 假设数据表 instruc…

增强学习(Reinforcement Learning)简介

增强学习&#xff08;Reinforcement Learning&#xff09;简介 增强学习是机器学习的一种范式&#xff0c;其核心目标是让智能体&#xff08;Agent&#xff09;通过与环境的交互&#xff0c;基于试错机制和延迟奖励反馈&#xff0c;学习如何选择最优动作以最大化长期累积回报。…

PaddlePaddle 和PyTorch选择与对比互斥

你遇到的错误信息如下&#xff1a; RuntimeError: (PreconditionNotMet) Tensors dimension is out of bound.Tensors dimension must be equal or less than the size of its memory.But received Tensors dimension is 8, memorys size is 0.[Hint: Expected numel() * Size…

vison transformer vit 论文阅读

An Image is Worth 16x16 Words 20年的论文看成10年的哈斯我了 [2010.11929] 一张图像胜过 16x16 个单词&#xff1a;用于大规模图像识别的转换器 --- [2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 为什么transformer好训练&am…

依赖关系-根据依赖关系求候选码

关系模式R&#xff08;U, F&#xff09;, U{}&#xff0c;F是R的函数依赖集&#xff0c;可以将属性分为4类&#xff1a; L: 仅出现在依赖集F左侧的属性 R: 仅出现在依赖集F右侧的属性 LR: 在依赖集F左右侧都出现的属性 NLR: 在依赖集F左右侧都未出现的属性 结论1: 若X是L类…

SAP note 3565626 : Baltimore CyberTrust 根证书即将过期

SAP note 3565626 &#xff1a; Baltimore CyberTrust 根证书即将过期 20250512 2025年5月9日 症状 您已收到来⾃ SAP Integration Suite/Cloud Integration 服务的通知邮件&#xff0c; 建议 Baltimore CyberTrust 根证书将于 2025 年 5 ⽉ 12 ⽇ 过期&#xff0c;其中 Balt…