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。
- 触发时机:在与下游的连接中读取或写入数据。
- ReadFilter 实现了 onData 函数。

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
- Service Mesh
- Istio: https://istio.io

- Kuma (Kong Mesh): https://konghq.com/blog/kuma-service-mesh-gateway-mode

- Istio: https://istio.io
- API 网关
- Gloo Edge: https://docs.solo.io/gloo-edge

- Gloo Edge: https://docs.solo.io/gloo-edge