Toasobi
go-zero 添加拦截器,metadata传值
本文最后更新于2022年09月16日,已超过841天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
- 添加rpc服务端拦截器
拦截器如同中间件一样,可以指定调用logic方法前后所执行的指令
首先在main函数外做一个性质是全局函数的拦截器
<div>func TestServerInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
fmt.Printf("TestServerInterceptor ====> start \n")
fmt.Printf("req ======> %+v \n", req)
fmt.Printf("info =====> %+v \n", info)
resp, err = handler(ctx, req)
fmt.Printf("TestServerInterceptor ====> end \n")
return resp, err
}</div>
然后再在main函数里面激活就可以了
<div>s.AddUnaryInterceptors(TestServerInterceptor)</div>
- 添加api客户端拦截器
客户端拦截器需要设置在user-api中的svc下的UserRpcClient内部
具体如下
<div>func NewServiceContext(c config.Config) *ServiceContext {
return &ServiceContext{
Config: c,
UserModel: model.NewUserModel(sqlx.NewMysql(c.DB.DataSource)),
UserRpcClient: usercenter.NewUsercenter(zrpc.MustNewClient(c.UserRpcConf, zrpc.WithUnaryClientInterceptor(Token2uidInterceptor))),
TestMiddleware: middleware.NewTestMiddleware().Handle,
}
}
func Token2uidInterceptor(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
fmt.Println("发送前")
err := invoker(ctx, method, req, reply, cc, opts...)
if err != nil {
return err
}
fmt.Println("发送后")
return nil
}</div>
最后讲解一下各拦截器调用流程
首先从postman传过来数据开始,先是调用了api中的logic函数(handler),在调用grpc之前客户端拦截器先进行一次拦截,之后调用grpc。而在调用grpc的处理方法之前又被服务端拦截器拦截一次,拦截器中调用handler表示开始调用处理器,最后再先调用grpc的拦截器出来,再调用api的拦截器出来,返回数据给前端。
拦截器的用处有很多,具体比较有用的有相互传输数据等等。。。
咱们还是来讲一下吧,关于不同服务之间关于metadata传值
首先是客户端拦截器
然后在rpc的logic方法中通过键值拿取信息(传过来的是一个切片)
完成!