前言
Envoy 是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线,体积小,性能高,它通过一款单一的软件满足了我们的众多需求,而不需要我们去搭配一些工具混合使用。
关注我的小伙伴们应该知道我已经断断续续分享过一些 Envoy 使用指南了,但大多都比较零散随性,没有形成体系。为了能让更多人从零开始入坑 Envoy,我决定撰写一本 Envoy 中文指南,主要内容来自 Envoy 官方文档、各路大神分享的文章以及我自己以前写的一些文章。本指南包括了本人平时在使用 Envoy 时的参考指南和实践总结,形成一个系统化的参考指南以方便查阅。
文档地址:https://fuckcloudnative.io/envoy-handbook/
下面摘录一段本指南中的章节:
Envoy 的架构如图所示:

Envoy 接收到请求后,会先走 FilterChain,通过各种 L3/L4/L7 Filter 对请求进行微处理,然后再路由到指定的集群,并通过负载均衡获取一个目标地址,最后再转发出去。
其中每一个环节可以静态配置,也可以动态服务发现,也就是所谓的 xDS。这里的 x 是一个代词,类似云计算里的 XaaS 可以指代 IaaS、PaaS、SaaS 等。
Envoy 的整体配置结构如下:
{
"node": "{...}",
"static_resources": "{...}",
"dynamic_resources": "{...}",
"cluster_manager": "{...}",
"hds_config": "{...}",
"flags_path": "...",
"stats_sinks": [],
"stats_config": "{...}",
"stats_flush_interval": "{...}",
"watchdog": "{...}",
"tracing": "{...}",
"runtime": "{...}",
"layered_runtime": "{...}",
"admin": "{...}",
"overload_manager": "{...}",
"enable_dispatcher_stats": "...",
"header_prefix": "...",
"stats_server_version_override": "{...}",
"use_tcp_for_dns_lookups": "..."
}
Listener、Cluster和 Secret 三部分组成。参考 config.bootstrap.v2.Bootstrap.StaticResourcesxDS 来获取配置。可以同时配置动态和静态。Filter 认为可以建立连接时,便调用 cluster_manager 的 API 来建立连接。cluster_manager 负责处理负载均衡、健康检查等细节。/stats/prometheus 就可以获取 Prometheus 格式的指标,这里的配置应该是为了支持其他的监控系统。RTDS 动态加载配置。X-Foo,那么 Header 中的 x-envoy-retry-on 将被会变成 x-foo-retry-on。TCP 查询 DNS。可以在 Cluster 的配置中覆盖此配置。Envoy 进程中运行着一系列 Inbound/Outbound 监听器(Listener),Inbound 代理入站流量,Outbound 代理出站流量。Listener 的核心就是过滤器链(FilterChain),链中每个过滤器都能够控制流量的处理流程。过滤器链中的过滤器分为两个类别:
L3/L4,是 Envoy 网络连接处理的核心。L7,由特殊的网络过滤器 HTTP connection manager 管理,专门处理 HTTP1/HTTP2/gRPC 请求。除了 HTTP connection manager 之外,还有一种特别的网络过滤器叫 Thrift Proxy。Thrift 是一套包含序列化功能和支持服务通信的 RPC 框架,详情参考维基百科。Thrift Proxy 管理了两个 Filter:Router 和 Rate Limit。
除了过滤器链之外,还有一种过滤器叫监听器过滤器(Listener Filters),它会在过滤器链之前执行,用于操纵连接的元数据。这样做的目的是,无需更改 Envoy 的核心代码就可以方便地集成更多功能。例如,当监听的地址协议是 UDP 时,就可以指定 UDP 监听器过滤器。
根据上面的分类,Envoy 过滤器的架构如下图所示:
