Envoy Proxy 简介

Envoy 的特性

  • 四层和七层代理。

  • 流量治理(路由、分流、限流、重试等)。

  • 高性能(基于 C++ 开发)。

  • 负载均衡(支持多种算法)。

  • 高可观测性(统计和追踪)。

  • 支持多种协议(HTTP/1.1、HTTP/2、HTTP/3、gRPC、Redis 等)。

  • 支持动态配置和热重启。

  • 可扩展性(支持自定义插件)。

基础概念

  • Downstream:与 Envoy 连接(或向 Envoy 发送数据报)的下游节点。

  • Listener:与 IP 和端口绑定,接收 TCP 连接(或 UDP 数据报),并编排请求的处理流程。

  • Filter:处理连接或请求的单元,可被编排为 Filter Chain。

  • Endpoint:接收请求的服务,可被划分到 Cluster 中。

  • Cluster:Endpoint 的逻辑集合。

  • Upstream:接收 Envoy 请求的上游节点。

上图只是画出了请求的链路,实际上该链路是双向的:

(图片来源:https://youtu.be/XdWmm_mtVXI

线程模型

  • Envoy 架构:单进程和多线程。

    • Main Thread(只有一个):处理 Envoy 的启动和关闭、xDS API、热更新等。

    • Worker Thread(可以有多个):通过 Listener 处理连接和请求,以及连接过程中的所有 IO。

  • 模型:非阻塞 IO(事件驱动)。

    • 一个 Worker Thread 可以处理多个连接。

    • 代码需要使用异步编程范式。

    • 底层依赖于 libevent 库。

  • 对于一个配置的 Listener(包括 IP 和端口),每个 Worker Thread 都会创建一个对应的 Listener 实例。

  • 在默认情况下,Envoy 会给每个 Worker Thread 上的 Listener 实例创建单独的 (listening) socket。

  • 对于绑定地址相同的多个 (listening) socket,Linux 内核每次会从中选择一个来建立 TCP 连接或发送 UDP 数据报。

  • 例子:假设 Envoy 里有三个 Worker Thread,用户配置了两个 Listener(分别绑定到地址 address1 和 address2)。

Network Filter

  • Network Filter 处理字节层级的数据。

  • 分类:

    • ReadFilter 实现了 onData 函数。

      • 触发时机:在与下游的连接中读取数据。
    • WriteFilter 实现了 onWriter 函数

      • 触发时机:在与下游的连接中写入数据。
    • Filter 同时实现了 ReadFilter 和 WriteFilter。

      • 触发时机:在与下游的连接中读取或写入数据。

HTTP Filter

  • HTTP Connection Manager 是一个 Network Filter 的实现,其内部包含 HTTP Filter 可对 HTTP 请求和响应进行操作。

  • HTTP Filter 分类:

    • StreamDecoderFilter 实现了处理下游请求的回调函数。

    • StreamEncoderFilter 实现了处理上游响应的回调函数。

    • StreamFilter 实现了 StreamDecoderFilter 和 StreamEncoderFilter。

  • HTTP Filter 回调函数执行顺序(以 decoder 为例):

  • router filter 负责将 HTTP 请求转发到匹配的集群上:

Filter

实现自定义 Filter 的方式:

  • C++

    • 需要静态编译。

    • 性能最好。

  • Lua

    • 只能实现 HTTP Filter。

    • 不适合复杂且对性能有要求的 Filter。

  • Wasm (WebAssembly)

    • 运行时加载插件,通过 VM 运行。

    • 沙盒环境运行,保证安全性。

    • 支持多种语言编写 Filter(C++、Rust、Go、AssemblyScript 等)。

(图片来源:https://github.com/tetratelabs/proxy-wasm-go-sdk

xDS

  • Envoy 可通过文件系统或者管理服务器的 API(gRPC 和 HTTP)来获取动态配置。

  • 各类的资源发现服务及其 API 被称为 xDS。例如,Endpoint 的发现服务及其 API 被称为 EDS(Endpoint Discovery Service)。

  • xDS 支持配置的全量获取和增量获取。

Envoy 的应用:Service Mesh

Updated: