TypechoJoeTheme

Toasobi的博客

go-zero 添加拦截器,metadata传值

本文最后更新于2022年09月16日,已超过733天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
  • 添加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方法中通过键值拿取信息(传过来的是一个切片)

完成!

朗读
赞(0)
评论 (0)