gRPC

gRPC 是来自 Google 的 RPC 框架。它使用 protocol buffers 作为底层序列化/IDL(接口描述语言)格式。在传输层,它使用 HTTP/2 进行请求/响应复用。Envoy在传输层和应用层都提供对 gRPC 一流的支持:

  • gRPC 使用 HTTP/2 trailers 来传送请求状态。 Envoy 是能够正确支持 HTTP/2 trailers 的少数几个 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 HTTP/1.1 桥接过滤器 允许将 gRPC 请求通过 HTTP/1.1 发送到 Envoy。然后,Envoy 将请求转换为 HTTP/2 传输到目标服务器。响应则被转换回 HTTP/1.1。安装后,桥接过滤器除了收集标准的全局 HTTP 统计数据外,还收集每个 RPC 的统计数据。

  • gRPC HTTP/1.1 反向桥接过滤器 允许将 gRPC 请求发送到 Envoy,然后在发送到上游时转换为 HTTP/1.1。在发送到下游时,响应又被转换回 gRPC。该过滤器还可以选择性地管理 gRPC 帧头,这样一来,上游就完全不用知道 gRPC 了。

gRPC 服务

Envoy 除了在数据平面上代理 gRPC 外,在控制平面上也使用了 gRPC,在控制平面上,它从中 获取管理服务器的配置 以及过滤器的配置,例如将其用于 限流 或授权检查。我们称之为 gRPC 服务

当指定 gRPC 服务时,必须指定使用 Envoy gRPC 客户端Google C++ gRPC 客户端。 我们在下面讨论这种选择的权衡。

Envoy gRPC 客户端是 gRPC 的最小自定义实现,它使用 Envoy 的 HTTP/2 上游连接管理。服务被指定为常规的 Envoy 集群,并定期处理 超时、重试、端点 发现负载均衡/故障转移、负载报告、熔断健康检查异常检测。它们与 Envoy 的数据面共享相同的 连接池 机制。同样,集群 统计信息 用于 gRPC 服务。由于客户端是简化版的 gRPC 实现,因此不包括诸如 OAuth2gRPC-LB 之类的高级 gRPC 功能后备。

Google C++ gRPC 客户端的实现是基于 Google 在 https://github.com/grpc/grpc 上提供的 gRPC 参考。它提供了 Envoy gRPC 客户端中缺少的高级 gRPC 功能。Google C++ gRPC 客户端独立于 Envoy 的集群管理,执行自己的负载平衡、重试、超时、端点管理等。Google C ++ gRPC客户端还支持 自定义身份认证插件

在大多数情况下,当你不需要 Google C++ gRPC 客户端的高级功能时,建议使用 Envoy gRPC 客户端。这使得配置和监控更加简单。如果 Envoy gRPC 客户端中缺少你所需要的功能,则应该使用 Google C++ gRPC 客户端。