gRPC
gRPC 是 Google 的一个 RPC 框架。它使用协议缓冲区作为底层序列化/IDL 格式。在传输层,它使用 HTTP/2 或更高版本进行请求/响应多路复用。Envoy 对 gRPC 具有强大的支持,包括传输层和应用层。
gRPC 使用尾部信息来传递请求状态。Envoy 是少数几个正确支持尾部信息的 HTTP 代理之一,因此是少数几个可以传输 gRPC 请求和响应的代理之一。
某些语言的 gRPC 运行时还处于相对不成熟的阶段。请参阅 下面,了解有助于将 gRPC 扩展到更多语言的过滤器概述。
gRPC-Web 由 过滤器 支持,该过滤器允许 gRPC-Web 客户端通过 HTTP/1.1 向 Envoy 发送请求,并将其代理到 gRPC 服务器。它正在积极开发中,有望成为 gRPC 桥接过滤器 的继任者。
gRPC-JSON 转码器由 过滤器 支持,该过滤器允许 RESTful JSON API 客户端通过 HTTP 向 Envoy 发送请求,并将其代理到 gRPC 服务。
gRPC 桥接
Envoy 支持多种 gRPC 桥接。
grpc_http1_bridge 过滤器 允许将 gRPC 请求通过 HTTP/1.1 发送到 Envoy。Envoy 然后将请求转换为 HTTP/2 或 HTTP/3,以便传输到目标服务器。响应将转换回 HTTP/1.1。安装后,桥接过滤器除了标准的全局 HTTP 统计信息外,还收集每个 RPC 的统计信息。
grpc_http1_reverse_bridge 过滤器 允许将 gRPC 请求发送到 Envoy,然后在发送到上游时将其转换为 HTTP/1.1。然后,在发送到下游时,响应将转换为 gRPC。此过滤器还可以选择管理 gRPC 帧头,从而允许上游完全不必了解 gRPC。
connect_grpc_bridge 过滤器 允许将 Connect 请求发送到 Envoy。Envoy 然后将请求转换为 gRPC,并将其发送到上游。响应将转换为 Connect 协议,并发送回下游。HTTP/1.1 请求将在需要时升级到 HTTP/2 或 HTTP/3。
gRPC 服务
除了在数据平面代理 gRPC 之外,Envoy 还利用 gRPC 来实现其控制平面,它从 管理服务器获取配置,并在过滤器中使用 gRPC,例如用于 速率限制 或授权检查。我们将这些称为 *gRPC 服务*。
在指定 gRPC 服务时,有必要指定使用 Envoy gRPC 客户端 还是 Google C++ gRPC 客户端。我们将在下面讨论此选择权衡。
Envoy gRPC 客户端是对 gRPC 的最小自定义实现,它利用了 Envoy 的 HTTP/2 或 HTTP/3 上游连接管理。服务被指定为常规 Envoy 集群,并对 超时、重试、端点 发现/负载均衡/故障转移/负载报告、断路器、健康检查、异常检测 进行了常规处理。它们与 Envoy 数据平面共享相同的 连接池 机制。同样,集群 统计信息 也可用于 gRPC 服务。由于客户端很小,它不包括高级 gRPC 功能,例如 OAuth2 或 gRPC-LB 旁路。
Google C++ gRPC 客户端基于 Google 在 https://github.com/grpc/grpc 上提供的 gRPC 参考实现。它提供了 Envoy gRPC 客户端中缺少的高级 gRPC 功能。Google C++ gRPC 客户端执行自己的负载均衡、重试、超时、端点管理等,独立于 Envoy 的集群管理。Google C++ gRPC 客户端还支持 自定义身份验证插件。
建议在大多数情况下使用 Envoy gRPC 客户端,在这种情况下,不需要 Google C++ gRPC 客户端中的高级功能。这提供了配置和监控的简便性。如果 Envoy gRPC 客户端中缺少必要的功能,则应改为使用 Google C++ gRPC 客户端。