IT 行业正在向微服务架构和云原生解决方案发展。由于使用不同的技术开发了成百上千的微服务,这些系统可能变得复杂,难以调试。
作为一个应用开发者,你考虑的是业务逻辑——购买产品或生成发票。然而,任何像这样的业务逻辑都会导致不同服务之间的多个服务调用。每个服务可能都有它的超时、重试逻辑和其他可能需要调整或微调的网络特定代码。
如果在任何时候最初的请求失败了,就很难通过多个服务来追踪,准确地指出失败发生的地方,了解请求为什么失败。是网络不可靠吗?是否需要调整重试或超时?或者是业务逻辑问题或错误?
服务可能使用不一致的跟踪和记录机制,使这种调试的复杂性增加。这些问题使你很难确定问题发生在哪里,以及如何解决。如果你是一个应用程序开发人员,而调试网络问题不属于你的核心技能,那就更是如此。
将网络问题从应用程序堆栈中抽离出来,由另一个组件来处理网络部分,让调试网络问题变得更容易。这就是 Envoy 所做的事情。
在每个服务实例旁边都有一个 Envoy 实例在运行。这种类型的部署也被称为 Sidecar 部署。Envoy 的另一种模式是边缘代理,用于构建 API 网关。
Envoy 和应用程序形成一个原子实体,但仍然是独立的进程。应用程序处理业务逻辑,而 Envoy 则处理网络问题。
在发生故障的情况下,分离关注点可以更容易确定故障是来自应用程序还是网络。
为了帮助网络调试,Envoy 提供了以下高级功能。
进程外架构
Envoy 是一个独立的进程,旨在与每个应用程序一起运行 —— 也就是我们前面提到的 Sidecar 部署模式。集中配置的 Envoy 的集合形成了一个透明的服务网格。
路由和其他网络功能的责任被推给了 Envoy。应用程序向一个虚拟地址(localhost)而不是真实地址(如公共 IP 地址或主机名)发送请求,不知道网络拓扑结构。应用程序不再承担路由的责任,因为该任务被委托给一个外部进程。
与其让应用程序管理其网络配置,不如在 Envoy 层面上独立于应用程序管理网络配置。在一个组织中,这可以使应用程序开发人员解放出来,专注于应用程序的业务逻辑。
Envoy 适用于任何编程语言。你可以用 Go、Java、C++ 或其他任何语言编写你的应用程序,而 Envoy 可以在它们之间架起桥梁。Envoy 的行为是相同的,无论应用程序的编程语言或它们运行的操作系统是什么。
Envoy 还可以在整个基础设施中透明地进行部署和升级。这与为每个单独的应用程序部署库升级相比,后者可能是非常痛苦和耗时的。
进程外架构是有益的,因为它使我们在不同的编程语言 / 应用堆栈中保持一致,我们可以免费获得独立的应用生命周期和所有的 Envoy 网络功能,而不必在每个应用中单独解决这些问题。
L3/L4 过滤器结构
Envoy 是一个 L3/L4 网络代理,根据 IP 地址和 TCP 或 UDP 端口进行决策。它具有一个可插拔的过滤器链,可以编写你的过滤器来执行不同的 TCP/UDP 任务。
过滤器链(Filter Chain) 的想法借鉴了 Linux shell,即一个操作的输出被输送到另一个操作中。例如:
ls -l | grep "Envoy*.cc" | wc -l
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,并为 Envoy 提供关于主机、集群 HTTP 路由、监听套接字和加密信息。
健康检查
负载均衡器有一个特点,那就是只将流量路由到健康和可用的上游服务。Envoy 支持健康检查子系统,对上游服务集群进行主动健康检查。然后,Envoy 使用服务发现和健康检查信息的组合来确定健康的负载均衡目标。Envoy 还可以通过异常点检测子系统支持被动健康检查。
高级负载均衡
Envoy 支持自动重试、断路、全局速率限制(使用外部速率限制服务)、影子请求(或流量镜像)、异常点检测和请求对冲。
前端 / 边缘代理支持
Envoy 的特点使其非常适合作为边缘代理运行。这些功能包括 TLS 终端、HTTP/1.1、HTTP/2 和 HTTP/3 支持,以及 HTTP L7 路由。
TLS 终止
应用程序和代理的解耦使网格部署模型中所有服务之间的 TLS 终止(双向 TLS)成为可能。
一流的可观测性
为了便于观察,Envoy 会生成日志、指标和追踪。Envoy 目前支持 statsd(和兼容的提供者)作为所有子系统的统计。得益于可扩展性,我们也可以在需要时插入不同的统计提供商。
HTTP/3(Alpha)
Envoy 1.19.0 支持 HTTP/3 的上行和下行,并在 HTTP/1.1、HTTP/2 和 HTTP/3 之间进行双向转义。