| 能力 | 鉴权、日志、指标、追踪、限流、异常恢复 |
|---|---|
| 形态 | 一元拦截器与流式拦截器分别实现 |
| 注意 | 拦截器顺序影响语义;重试类拦截器要约束幂等性 |
- 两类拦截器:一元与流式签名不同,需分别注册
- 顺序设计:鉴权、日志、指标、异常恢复与重试的先后影响语义
- 上下文传播:经 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
}拦截器里做重活(如远程鉴权)会放大每次调用延迟,远程校验结果可做短时缓存。