元数据(Metadata)

解释元数据是什么,它是如何传输的,以及它的用途。

概述

元数据是一个侧通道,允许客户端和服务器交换与 RPC 相关的信息。

gRPC 元数据是一个键值对数据,在初始或最终的 gRPC 请求或响应中发送。它用于提供有关调用的附加信息,例如认证凭据、追踪信息或自定义头信息。

gRPC 元数据使用 HTTP/2 头部实现。键是 ASCII 字符串,而值可以是 ASCII 字符串或二进制数据。键是大小写不敏感的,并且不能以 grpc- 为前缀,因为该前缀保留给 gRPC 使用。

gRPC 元数据可以由客户端和服务器发送和接收。头部在客户端发送请求之前传递给服务器,在服务器发送响应之前传递给客户端。服务器关闭 RPC 时,会发送尾部。

gRPC 元数据有多种用途,包括:

  • 认证:gRPC 元数据可以用于发送认证凭据到服务器。这可以用来实现不同的认证方案,例如使用标准 HTTP 授权头的 OAuth2JWT

  • 追踪:gRPC 元数据可以用于向服务器发送追踪信息。这有助于追踪请求在分布式系统中的进展。

  • 自定义头信息:gRPC 元数据可以用于发送自定义头信息到服务器或从服务器发送到客户端。这可以用于实现特定于应用程序的功能,如负载均衡、速率限制或从服务器向客户端提供详细的错误信息。

  • 内部用途:gRPC 使用 HTTP/2 头部和尾部,这些将与应用程序指定的元数据集成。

注意事项

服务器可能会限制请求头的大小,默认建议为 8 KiB。

自定义元数据必须遵循 PROTOCOL-HTTP2 中列出的 “Custom-Metadata” 格式,除了二进制头部不需要进行 base64 编码。

头部(Headers)

头部在客户端发送初始请求数据消息之前从客户端传送到服务器,并且在服务器发送初始响应数据之前从服务器传送到客户端。头部包括认证凭据和如何处理 RPC 的信息。一些头部,如授权,是由 gRPC 为你生成的。

自定义头部的处理依赖于所使用的语言,通常通过拦截器(interceptors)来处理。

尾部(Trailers)

尾部是一种特殊的头部,它在消息数据之后发送。尾部用于内部传达 RPC 的结果。在应用程序层面,自定义尾部可以用于传达一些不直接属于数据的内容,如服务器的使用情况和查询成本。尾部仅由服务器发送。

语言支持

语言 示例 备注

Java

Java Header

Java Error Handling

Go

Go Metadata

Go Metadata Interceptor

Go 文档

C++

C++ Metadata

Node

Node Metadata

Python

Python Metadata

Ruby

Example upcoming