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

news/2024/11/25 13:10:53/

go-zero 拦截器

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

一、 服务端拦截器

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

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

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

func main() {flag.Parse()var c config.Configconf.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.ppmy.cn/news/1549824.html

相关文章

操作系统进程和线程——针对实习面试

目录 操作系统进程和线程什么是进程和线程?进程和线程的区别?进程有哪些状态?什么是线程安全?如何实现线程安全?什么是线程安全?如何实现线程安全? 进程间的通信有哪几种方式?什么是…

微信小程序开发指南:从基础到进阶

​🌈个人主页:前端青山 🔥系列专栏:微信小程序篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来微信小程序篇专栏内容:微信小程序开发指南:从基础到进阶 前言 随着移动互联网的快速发展&…

归并排序与逆序对问题(C语言版)

一、引言 归并排序是一种高效且稳定的排序方法,而逆序对问题是算法领域的一个经典问题,本文教大家如何实现归并排序,以及如何使用归并排序去结果逆序对问题 二、归并排序 归并排序思想 分解:将待排序的数组分成两半&#xff0c…

社交电商专业赋能高校教育与产业协同发展:定制开发AI智能名片及2+1链动商城小程序的创新驱动

摘要:本文围绕社交电商有望成为高校常态专业这一趋势展开深入探讨,剖析国家政策认可下其学科发展前景,着重阐述在专业建设进程中面临的师资短缺及实践教学难题。通过引入定制开发AI智能名片与21链动商城小程序,探究如何借助这些新…

实现可视化大屏的适配,并且解决缩放导致的事件偏移问题

项目上有一个大屏是根据UI的设计稿,已经将宽高固定了,现在要求做适配,这里推荐两款用过的适配插件。 1、v-scale-screen 组件库地址:https://www.npmjs.com/package/v-scale-screen?activeTabreadme v-scale-screen这个插件利…

K8s 下通过prometheus监控 nginx

k8s 下有两个版本的nginx ingress 分别是 ingress nginx 以及 nginx ingress Ingress-nginx 与 Nginx-ingress - LeoZhanggg - 博客园 这里我讨论的是 nginx ingress Nginx Ingress 使用Prometheus 导出数据 nginx ingress 本身支持通过支持这个提供prometheus 格式的…

【轻量级 Java Web 整合开发(第 2 版)-框架编程技术】-期末复习(第二版)

第一章 Java Web 技术概述 作业 1、完成课后(P28)选择题和问答题(只需完成,不需要提交) 2、Tomcat的目录结构及其用途? bin:启动/关闭应用服务器的bat批处理命令; conf:包含不同的配置文件。包括server.xml&#xff…

ubuntu24.04下Matlab安装踩坑记录

1. 版本选择 link:https://ww2.mathworks.cn/downloads/matlab2024/2022x按官网执行后,均会出现暂时无法解决的bug;想到以前科大的虚拟机平台的版本是2019b,沿用这个版本即可;(其实很多软件根本没必要更新&#xff0c…