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
-
Service Mesh
-
Istio: https://istio.io
-
Kuma (Kong Mesh): https://konghq.com/blog/kuma-service-mesh-gateway-mode
-
-
API 网关
-
Gloo Edge: https://docs.solo.io/gloo-edge
-