什么是 Envoy
Envoy 是一款专为大型现代面向服务的架构设计的 L7 代理和通信总线。该项目源于这样一种信念:
网络应该对应用程序透明。当网络和应用程序问题确实发生时,应易于确定问题的来源。
在实践中,实现先前陈述的目标非常困难。Envoy 试图通过提供以下高级功能来做到这一点:
进程外架构:Envoy 是一个独立的进程,旨在与每个应用程序服务器一起运行。所有 Envoy 形成一个透明的通信网格,其中每个应用程序向 localhost 发送和接收消息,并且不知道网络拓扑结构。与传统的库方法相比,进程外架构在服务间通信方面有两个显著的优点:
Envoy 与任何应用程序语言兼容。单个 Envoy 部署可以形成 Java、C++、Go、PHP、Python 等之间的网格。面向服务的架构越来越普遍地使用多个应用程序框架和语言。Envoy 透明地弥合了差距。
正如任何曾在大型面向服务的架构中工作过的人所知,部署库升级可能非常痛苦。Envoy 可以在整个基础架构中快速部署和升级,并且是透明的。
L3/L4 过滤器架构:Envoy 的核心是一个 L3/L4 网络代理。一个可插拔的 过滤器 链机制允许编写过滤器以执行不同的 TCP/UDP 代理任务,并将其插入到主服务器中。已经编写了过滤器来支持各种任务,例如原始 TCP 代理、UDP 代理、HTTP 代理、TLS 客户端证书身份验证、Redis、MongoDB、Postgres 等。
HTTP L7 过滤器架构:HTTP 是现代应用程序架构中如此重要的一个组件,Envoy 支持 额外的 HTTP L7 过滤器层。HTTP 过滤器可以插入到 HTTP 连接管理子系统中,执行不同的任务,例如 缓冲、速率限制、路由/转发、嗅探 Amazon 的 DynamoDB 等。
一流的 HTTP/2 支持:在 HTTP 模式下运行时,Envoy 支持 HTTP/1.1 和 HTTP/2。Envoy 可以双向作为透明的 HTTP/1.1 到 HTTP/2 代理运行。这意味着可以桥接任何组合的 HTTP/1.1 和 HTTP/2 客户端和目标服务器。推荐的服务到服务配置在所有 Envoy 之间使用 HTTP/2,以创建一个持久连接的网格,请求和响应可以在其上复用。
HTTP/3 支持(目前处于 alpha 阶段):从 1.19.0 开始,Envoy 现在支持 HTTP/3 上游和下游,并在任何组合的 HTTP/1.1、HTTP/2 和 HTTP/3 之间进行双向转换。
HTTP L7 路由:在 HTTP 模式下运行时,Envoy 支持一个 路由 子系统,该子系统能够根据路径、权限、内容类型、运行时 值等路由和重定向请求。此功能在将 Envoy 用作前端/边缘代理时最有用,但在构建服务到服务网格时也会被利用。
gRPC 支持:gRPC 是 Google 的一个 RPC 框架,它使用 HTTP/2 或更高版本作为底层的复用传输。Envoy 支持 作为 gRPC 请求和响应的路由和负载均衡底座所需的所有 HTTP/2 功能。这两个系统非常互补。
服务发现和动态配置:Envoy 可选地使用一组分层的 动态配置 API 来进行集中式管理。这些层为 Envoy 提供关于以下内容的动态更新:后端集群中的主机、后端集群本身、HTTP 路由、监听套接字和加密材料。对于更简单的部署,后端主机发现可以 通过 DNS 解析完成(甚至可以 完全跳过),其他层则由静态配置文件替换。
健康检查:构建 Envoy 网格的 推荐 方法是将服务发现视为一个最终一致的过程。Envoy 包含一个 健康检查 子系统,它可以选择性地对上游服务集群执行主动健康检查。然后,Envoy 使用服务发现和健康检查信息的并集来确定健康的负载均衡目标。Envoy 还通过 异常值检测 子系统支持被动健康检查。
高级负载均衡:在分布式系统中不同组件之间进行 负载均衡 是一个复杂的问题。由于 Envoy 是一个独立的代理而不是一个库,因此它能够在单个位置实现高级负载均衡技术,并使它们对任何应用程序都可用。目前 Envoy 包含对 自动重试、断路器、通过外部速率限制服务的 全局速率限制、请求影子 和 异常值检测 的支持。未来计划支持请求竞速。
前端/边缘代理支持:在边缘使用相同的软件有很多好处(可观察性、管理、相同的服务发现和负载均衡算法等)。Envoy 的功能集使其非常适合作为大多数现代 Web 应用程序用例的边缘代理。这包括 TLS 终止、HTTP/1.1 HTTP/2 和 HTTP/3 支持,以及 HTTP L7 路由.
一流的可观察性:如上所述,Envoy 的主要目标是使网络透明。但是,问题既发生在网络级别,也发生在应用程序级别。Envoy 包含对所有子系统的强大 统计信息 支持。statsd(以及兼容的提供商)是当前支持的统计信息接收器,尽管插入另一个接收器并不困难。统计信息也可以通过 管理 端口查看。Envoy 还支持通过第三方提供商进行分布式 跟踪.