rpc服务添加拦截器
s := zrpc.MustNewServer(....)
//...
s.AddUnaryInterceptors(interceptor)
拦截逻辑
func interceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
// 获取metadata 进行请求合法拦截, 不合法直接return
md, ok := metadata.FromIncomingContext(ctx)
if !ok {
return nil, errors.New("获取metadata失败")
}
if values, ok := md["auth"]; ok {
// ...
}
logx.Info("拦截器前...")
resp, err := handler(ctx, req)
logx.Info("拦截器后...")
return resp,err
}
客户端的rpc拦截器 [类比前端的axios拦截器]
func NewServiceContext(c config.Config) *ServiceContext {
return &ServiceContext{
Config: c,
ProductRpc: product.NewProduct(zrpc.MustNewClient(c.ProductRpc, zrpc.WithUnaryClientInterceptor(interceptor))),
}
}
这里的metadata类似http的header
func interceptor(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
md := metadata.New(map[string]string{"name": "lsz"})
ctx = metadata.NewOutgoingContext(ctx, md)
logx.Info("调用rpc服务前")
err := invoker(ctx, method, req, reply, cc)
if err != nil {
return err
}
logx.Info("调用rpc服务后")
return nil
}