文章目录
- 什么是envoy?
- 进程外架构
- L3/L4 滤波器架构
- L7 滤波器架构
- 一流的 HTTP/2 支持
- HTTP 路由
- gRPC 就绪
- 服务发现和动态配置
- 健康检查
- 高级负载平衡
- 前端/边缘代理支持
- TLS 终止
- 一流的可观察性
- HTTP/3(阿尔法)
什么是envoy?
该行业正在转向微服务架构和云原生解决方案。随着使用不同技术开发的成百上千的微服务,这些系统可能变得复杂且难以调试。
作为应用程序开发人员,您正在考虑业务逻辑——购买产品或生成发票。但是,任何类似的业务逻辑都会导致不同服务之间的多次服务调用。每个服务都可能有其超时、重试逻辑和其他可能需要调整或微调的特定于网络的代码。
如果在任何时候初始请求失败,将很难通过多个服务对其进行跟踪,查明失败发生的位置,并了解失败的原因。网络不可靠吗?我们是否需要调整重试或超时?还是业务逻辑问题或错误?
增加调试复杂性的是服务可能使用不一致的跟踪和日志记录机制。这些问题使得很难确定问题、问题发生的位置以及如何解决问题。如果您是应用程序开发人员并且调试网络问题超出了您的核心技能范围,则尤其如此。
使调试这些网络问题更容易的是将网络问题排除在应用程序堆栈之外,并让另一个组件处理网络部分。这就是 Envoy 可以做到的。
在其部署模式之一中,我们在每个服务实例旁边运行一个 Envoy 实例。这种类型的部署也称为边车部署。Envoy 可以很好地使用的另一种模式是edge-proxy,它用于构建 API 网关。
Envoy 和应用程序形成一个原子实体,但仍然是独立的进程。应用程序处理业务逻辑,Envoy 处理网络问题。
如果发生故障,分离关注点可以更容易地确定故障是来自应用程序还是来自网络。
为了帮助进行网络调试,Envoy 提供了以下高级功能:
进程外架构
Envoy 是一个独立的进程,旨在与每个应用程序一起运行——我们之前提到的 Sidecar
部署模式。集中配置的 Envoy 集合形成了一个透明的网格。
路由和其他网络功能的责任被推给了 Envoy。应用程序将请求发送到虚拟地址 (localhost) 而不是真实地址(如公共 IP 地址或主机名),不知道网络拓扑。应用程序不再承担路由的责任,因为该任务被委派给外部进程。
网络配置不是让应用程序管理其网络配置,而是在 Envoy 级别独立于应用程序进行管理。在组织中,这可以让应用程序开发人员专注于应用程序的业务逻辑。
Envoy 适用于任何编程语言。您可以使用 Go、Java、C++ 或任何其他语言编写应用程序,Envoy 可以弥合它们之间的差距。无论应用程序的编程语言或它们运行的操作系统如何,它的行为都是相同的。
Envoy 还可以在整个基础架构中透明地部署和升级。这与为每个单独的应用程序部署库升级相比,这可能非常痛苦和耗时。
进程外架构是有益的,因为它为我们提供了跨编程语言/应用程序堆栈的一致性,并且我们免费获得了独立的生命周期和所有 Envoy 网络功能,而无需在每个应用程序中单独处理它们。
L3/L4 滤波器架构
Envoy 是一个 L3/L4 网络代理,它根据 IP 地址和 TCP 或 UDP 端口做出决策。它具有可插入的过滤器链来编写过滤器以执行不同的 TCP/UDP 任务。
过滤器链来自 shell 思想,其中一个操作的输出通过管道传输到另一个操作。例如:
Envoy 可以通过堆叠形成过滤器链的所需过滤器来构建逻辑和行为。存在许多过滤器并支持诸如原始 TCP 代理、UDP 代理、HTTP 代理、TLS 客户端证书认证等任务。Envoy 也是可扩展的,我们可以编写我们的过滤器。
L7 滤波器架构
Envoy 支持额外的 HTTP L7 过滤层。我们可以将 HTTP 过滤器插入到 HTTP 连接管理子系统中,该子系统执行不同的任务,例如缓冲、速率限制、路由/转发等。
一流的 HTTP/2 支持
Envoy 同时支持 HTTP/1.1 和 HTTP/2,并且可以在两个方向上作为透明的 HTTP/1.1 到 HTTP/2 代理运行。这意味着可以桥接 HTTP/1.1 和 HTTP/2 客户端和目标服务器的任意组合。即使您的遗留应用程序不通过 HTTP/2 进行通信,如果您将它们与 Envoy 代理一起部署,它们最终也会通过 HTTP/2 进行通信。
推荐的服务到服务配置在所有 Envoy 之间使用 HTTP/2 来创建一个持久连接的网格,请求和响应可以多路复用。
HTTP 路由
在 HTTP 模式下运行并使用 REST 时,Envoy 支持路由子系统,该子系统能够根据路径、权限、内容类型和运行时值路由和重定向请求。此功能在使用 Envoy 作为前端/边缘代理来构建 API 网关时非常有用,并在构建服务网格(sidecar 部署模式)时加以利用。
gRPC 就绪
Envoy 支持用作 gRPC 请求和响应的路由和负载平衡基础所需的所有 HTTP/2 功能。
gRPC 是一个开源的远程过程调用 (RPC) 系统,它使用 HTTP/2 进行传输和协议缓冲区作为接口描述语言 (IDL),并提供身份验证、双向流和流控制、阻塞/非阻塞等功能绑定,取消和超时。
服务发现和动态配置
我们可以使用描述服务以及如何与它们通信的静态配置文件来配置 Envoy。
对于静态配置 Envoy 不切实际的高级场景,Envoy 支持动态配置并在运行时自动重新加载配置。一组称为 xDS 的发现服务可用于通过网络动态配置 Envoy,并提供有关主机、集群 HTTP 路由、侦听套接字和加密材料的 Envoy 信息。届时,Envoy 将尝试优雅地耗尽所有连接。
健康检查
与负载平衡器相关的一项功能是将流量仅路由到健康且可用的上游服务。Envoy 支持健康检查子系统,该子系统执行上游服务集群的主动健康检查。Envoy 然后使用服务发现和健康检查信息的联合来确定健康的负载平衡目标。Envoy 还可以通过异常值检测子系统支持被动健康检查。
高级负载平衡
Envoy 支持自动重试、断路、全局速率限制(使用外部速率限制服务)、请求影子(或流量镜像)、异常值检测和请求对冲。
前端/边缘代理支持
Envoy 具有使其非常适合作为边缘代理运行的功能。此类功能包括 TLS 终止、HTTP/1.1、HTTP/2 和 HTTP/3 支持,以及 HTTP L7 路由。
TLS 终止
应用程序和代理的解耦启用了网格部署模型中所有服务之间的 TLS 终止(相互 TLS)。
一流的可观察性
为了可观察性,Envoy 会生成日志、指标和跟踪。Envoy 当前支持statsd(和兼容的提供程序)作为所有子系统的统计信息接收器。由于可扩展性,如果需要,我们还可以插入不同的统计提供程序。
HTTP/3(阿尔法)
Envoy 1.19.0 支持 HTTP/3 上游和下游,并在 HTTP/1.1、HTTP/2 和 HTTP/3 之间双向转换。