拦截器
解释如何使用拦截器来实现适用于许多 RPC 方法的通用行为。
拦截器
解释如何使用拦截器来实现适用于许多 RPC 方法的通用行为。
概述
构建 gRPC 服务的核心是实现 RPC 方法。但某些功能与正在运行的方法无关,应适用于所有或大多数 RPC。拦截器非常适合这项任务。
何时使用拦截器
您可能已经熟悉拦截器的概念,但可能习惯称它们为“过滤器”或“中间件”。拦截器非常适合实现不特定于单个 RPC 方法的逻辑。它们也易于在不同的客户端或服务器之间共享。拦截器是扩展 gRPC 的重要且常用的方式。您可能会发现一些您想要的功能已经作为拦截器在更广泛的 gRPC 生态系统中可用。
拦截器的一些示例用例是
- 元数据处理
- 日志记录
- 故障注入
- 缓存
- 指标
- 策略执行
- 服务器端身份验证
- 服务器端授权
注意
虽然客户端身份验证可以通过拦截器完成,但 gRPC 提供了一个更适合此任务的专用“调用凭据”API。有关客户端身份验证的详细信息,请参阅身份验证指南。如何使用拦截器
可以在构建 gRPC 通道或服务器时添加拦截器。然后,将为该通道或服务器上的每个 RPC 调用拦截器。客户端和服务器端的拦截器 API 不同,因此拦截器将是“客户端拦截器”或“服务器拦截器”。
拦截器本质上是按调用进行的;它们对于管理 TCP 连接、配置 TCP 端口或配置 TLS 没有用。虽然是大多数自定义的合适工具,但它们并非可以用于所有事情。
拦截器顺序
当使用多个拦截器时,它们的顺序很重要。您需要确保了解您的 gRPC 实现将执行它们的顺序。将拦截器视为应用程序和网络之间的一条线是有用的。一些拦截器将“更靠近网络”,并且对发送的内容有更多的控制权,而另一些拦截器将“更靠近应用程序”,它们可以更好地了解应用程序的行为。
假设您有两个客户端拦截器:一个缓存拦截器和一个日志记录拦截器。它们应该按什么顺序排列?您可能希望日志记录拦截器更靠近网络,以便更好地监视您的应用程序的通信并忽略缓存的 RPC
flowchart LR
APP(Application) --> INT1
INT1(Caching\nInterceptor) -->|Cache miss| INT2
INT2(Logging\nInterceptor) --> NET
NET(Network)
或者,您可能希望它更靠近应用程序,以便了解您的应用程序的行为并查看它正在加载哪些信息
flowchart LR
APP(Application) --> INT2
INT1(Caching\nInterceptor) -->|Cache miss| NET
INT2(Logging\nInterceptor) --> INT1
NET(Network)
您可以通过更改拦截器的顺序在这些选项之间进行选择。
语言支持
语言 | 示例 |
---|---|
C++ | C++ 示例 |
Go | Go 示例 |
Java | Java 示例 |
Python | Python 示例 |
上次修改时间为 2024 年 2 月 29 日:指南:添加拦截器 (#1267) (d9bbae5)