当前位置: 首页 > article >正文

go-zero(九) 自定义拦截器

go-zero 拦截器

有时我们需要在处理请求的过程中添加一些额外的逻辑,比如身份验证、日志记录、请求限流、性能监控等,这些都可以通过拦截器实现。go zero可以设置多个拦截器

一、 服务端拦截器

服务端拦截器用于处理传入的 RPC 请求,可以在处理请求之前或之后自定义逻辑,主要用于请求参数校验、身份验证等。

AddUnaryInterceptors 是在 gRPC 服务器初始化时调用的方法,用于将一个或多个服务端拦截器注册到 gRPC 服务器上.

下面我们就简单的演示下日志输出,在rpc项目中,修改 main 函数:

func main() {
	flag.Parse()

	var c config.Config
	conf.MustLoad(*configFile, &c)
	ctx := svc.NewServiceContext(c)

	s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
		pb.RegisterUserServer(grpcServer, server.NewUserServer(ctx))

		if c.Mode == service.DevMode || c.Mode == service.TestMode {
			reflection.Register(grpcServer)
		}
	})
	defer s.Stop()
	s.AddUnaryInterceptors(TestUnaryInterceptors)  //添加服务端拦截器

	fmt.Printf("Starting rpc server at %s...\n", c.ListenOn)
	s.Start()
}

//定义拦截器 
func TestUnaryInterceptors(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) {
	fmt.Printf("req :%v\n", req)
	fmt.Printf("info :%v\n", info)
	return handler(ctx, req)
}

运行项目测试:
在这里插入图片描述

二、客户端拦截器

客户端拦截器,用于拦截并处理发送到后端服务的请求,主要用于请求日志记录、性能监测等。

WithUnaryClientInterceptor 是一个用于配置 gRPC 客户端的选项。通过它,可以指定一个或多个拦截器,拦截器会在客户端请求 RPC 方法时被调用。

下面我们演示下使用拦截器输出请求方法耗时,修改api项目的中的servicecontext.go文件:

func NewServiceContext(c config.Config) *ServiceContext {
	return &ServiceContext{
		Config:    c,
		UserModel: model.NewUsersModel(sqlx.NewMysql(c.MysqlDB.DbSource)),

		TestMiddleware: middleware.NewMD5PasswordMiddleware().Handle,
		UserRpc:        user.NewUser(zrpc.MustNewClient(c.UserRpcConf, zrpc.WithUnaryClientInterceptor(TestClientInterceptor))), //在RPC调用的时候添加拦截器
	}
}

func TestClientInterceptor(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
	stime := time.Now()
	// 拦截前
	err := invoker(ctx, method, req, reply, cc, opts...)
	if err != nil {
		return err
	}
	// 拦截后
	fmt.Printf("调用 %s 方法 耗时: %v\n", method, time.Since(stime))
	return nil
}

在这里插入图片描述


http://www.kler.cn/a/407454.html

相关文章:

  • Rust中的静态派发与动态派发
  • 数据结构--跳表
  • Spark 中的 Shuffle 是分布式数据交换的核心流程,从源码角度分析 Shuffle 的执行路径
  • Microsoft SEAL中dwthandler.h解析
  • OpenCV相机标定与3D重建(3)校正鱼眼镜头畸变的函数calibrate()的使用
  • 【Python · PyTorch】循环神经网络 RNN(基础概念)
  • Rust 力扣 - 198. 打家劫舍
  • 【汽车制动】汽车制动相关控制系统
  • UE5材质篇5 简易水面
  • 11-23刷题记录
  • 23、论文阅读:基于多分辨率特征学习的层次注意力聚合GAN水下图像增强
  • Docker 实践与应用举例:提升开发与运维效率的利器
  • 阿里Qwen系列开源模型介绍
  • 设计模式之 原型模式
  • 高危,Laravel参数注入漏洞安全风险通告
  • 神经网络(系统性学习一):入门篇——简介、发展历程、应用领域、基本概念、超参数调优、网络类型分类
  • SQL的四种语言介绍
  • JavaWeb之综合案例
  • 笔记整理—linux驱动开发部分(15)BMP图片显示
  • 微软安全文章合集