本文目录导读:

Envoy 是一个高性能、开源的边缘和服务代理,常用于微服务架构中作为 API 网关或服务网格的数据面(如 Istio 的数据面),下面我会从核心概念、配置结构和具体示例(反向代理与负载均衡)三个方面,帮你理解如何使用 Envoy 进行代理。
核心概念:Envoy 的配置模型
Envoy 的配置基于 xDS 协议(动态发现)或静态文件,对于初学者,掌握静态配置就足够了,其核心组件包括:
- Listener(监听器):Envoy 会在哪些 IP:Port 上接收来自下游(客户端)的请求。
- Filter(过滤器):定义如何处理进入 Listener 的流量,最核心的是
http_connection_manager(处理 HTTP 流量)或tcp_proxy(处理 TCP 流量)。 - Cluster(集群):定义上游(后端服务)的地址、负载均衡策略、健康检查等。
- Endpoint(端点):集群中具体的后端服务实例(IP:Port)。
代理的本质Listener 监听端口 -> 过滤器解析请求 -> 根据路由规则转发到对应的 Cluster -> Cluster 将请求发送到具体的 Endpoint。
配置实战:一个简单的反向代理
假设你想让 Envoy 监听本地的 10000 端口,并将所有请求代理到 www.example.com(即一个标准的反向代理)。
编写 Envoy 配置文件(envoy.yaml)
admin:
access_log_path: /tmp/admin_access.log
address:
socket_address:
address: 0.0.0.0
port_value: 9901 # Envoy 管理界面端口
static_resources:
# 1. 定义监听器
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 10000 # 客户端请求入站端口
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
# 2. 定义 HTTP 路由
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"] # 匹配所有域名
routes:
- match:
prefix: "/" # 匹配所有路径
route:
cluster: target_service # 转发到名为 target_service 的集群
# 3. 定义 HTTP 过滤器(此处省略额外过滤器)
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
# 4. 定义集群(上游服务)
clusters:
- name: target_service
type: STRICT_DNS # 使用 DNS 解析
lb_policy: ROUND_ROBIN # 负载均衡策略
load_assignment:
cluster_name: target_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: www.example.com # 上游域名
port_value: 443
# 由于目标是 HTTPS,需要指定 TLS 上下文(作为客户端访问上游)
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
sni: www.example.com
启动 Envoy
# 假设你已经安装好了 envoy envoy -c envoy.yaml
验证
在浏览器或使用 curl 访问 http://localhost:10000,Envoy 会将请求代理到 https://www.example.com(因为上游是 443 端口且配置了 TLS)。
注意:如果你代理的是 HTTP 后端(如 localhost:8080),则不需要 transport_socket 部分,直接配置地址和端口即可。
更常见的场景:代理内部 HTTP 服务 + 负载均衡
假设你的后端有 2 个实例:
0.0.1:80800.0.2:8080
你希望 Envoy 在 8081 端口接收请求,并负载均衡到这两个节点。
配置文件(简化版,只修改 clusters 部分):
clusters:
- name: service_backend
type: STRICT_DNS # 或 STATIC(静态IP)
lb_policy: LEAST_REQUEST # 或 ROUND_ROBIN、RING_HASH
# 对于静态 IP,使用 type: STATIC
load_assignment:
cluster_name: service_backend
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 10.0.0.1
port_value: 8080
- endpoint:
address:
socket_address:
address: 10.0.0.2
port_value: 8080
关键参数说明:
type:STATIC(直接写死 IP)、STRICT_DNS(DNS 解析,支持轮询)、EDS(基于端点发现服务)。lb_policy:ROUND_ROBIN(轮询)、LEAST_REQUEST(最少请求)、RING_HASH(一致性哈希)等。
高级配置:路径路由(API 网关模式)
Envoy 也可以作为网关,根据路径将请求转发到不同的后端服务。
route_config:
virtual_hosts:
- name: api_gateway
domains: ["*"]
routes:
- match: { prefix: "/api/users" }
route: { cluster: user_service }
- match: { prefix: "/api/orders" }
route: { cluster: order_service }
- match: { prefix: "/" }
route: { cluster: default_service }
使用管理接口验证
启动后,你可以通过 Envoy 的管理界面查看配置是否生效:
# 管理接口默认在 localhost:9901 curl http://localhost:9901/config_dump # 查看完整配置 curl http://localhost:9901/clusters # 查看集群和健康状态 curl http://localhost:9901/stats # 查看统计数据
Envoy 代理的核心步骤
- 确定监听入口:
listeners部分定义端口。 - 选择协议过滤器:HTTP(
http_connection_manager)或 TCP(tcp_proxy)。 - 配置路由规则:
route_config中根据域名或路径匹配。 - 定义上游集群:
clusters中指定后端地址和负载均衡策略。 - 启动并观察:使用管理接口排错。
Envoy 的配置非常灵活,但初次接触时容易因为 YAML 的层级复杂而感到困惑,建议从最简单的 HTTP 反代 + 单集群 开始,逐步增加路由规则、TLS、重试、超时等特性。
如果你有更具体的场景(比如想代理 WebSocket、gRPC,或者实现限流、熔断),可以告诉我,我可以给你补充相关的配置片段。
标签: 代理