首页/开发/系统分析与架构设计速查/gRPC 拦截器与横切关注点

gRPC 拦截器与横切关注点

拦截器统一处理鉴权、超时、重试、指标与链路传播:一元与流式拦截器形态不同;顺序与幂等性要设计,避免重复采集或覆盖上下文。

能力鉴权、日志、指标、追踪、限流、异常恢复
形态一元拦截器与流式拦截器分别实现
注意拦截器顺序影响语义;重试类拦截器要约束幂等性
  • 两类拦截器:一元与流式签名不同,需分别注册
  • 顺序设计:鉴权、日志、指标、异常恢复与重试的先后影响语义
  • 上下文传播:经 metadata 传递 trace 与租户信息,注意大小限制
  • 错误映射:统一转换为 status 码,原始信息放 details
  • 重试约束:仅对幂等方法与可重试状态码启用

Go 一元拦截器骨架

Go 一元拦截器骨架
func UnaryLogger(ctx context.Context, req any, info *grpc.UnaryServerInfo, h grpc.UnaryHandler) (any, error) {
    start := time.Now()
    resp, err := h(ctx, req)
    log.Printf("%s dur=%s err=%v", info.FullMethod, time.Since(start), err)
    return resp, err
}
拦截器里做重活(如远程鉴权)会放大每次调用延迟,远程校验结果可做短时缓存。

易错点

  • 流式拦截器遗漏导致流式接口鉴权缺口
  • 拦截器顺序错误,追踪上下文被覆盖丢失

数据来源与参考

  • gRPC Go 文档:Interceptors
  • gRPC 官方文档:Metadata
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌