答案:Golang中通过Interceptor实现gRPC中间件,支持Unary和Streaming两种类型,可用于日志、认证、限流等通用逻辑。1. Unary Interceptor处理一元调用,接收上下文、请求、方法信息及处理器函数,示例中实现请求日志记录;2. Streaming Interceptor用于流式调用,需包装stream对象,示例记录流开始与结束日志;3. 可使用go-grpc-middleware库组合多个拦截器,如日志、认证、恢复等,通过ChainUnaryServer和ChainStreamServer链式注册;4. 常见中间件包括认证、日志、错误恢复、限流和监控,注意避免修改原始请求,推荐通过context或metadata传递数据。

在Golang中实现gRPC中间件,主要是通过拦截请求和响应来添加通用逻辑,比如日志、认证、限流等。gRPC本身不提供“中间件”这一抽象概念,但支持通过 Interceptor 实现类似功能。你可以为 unary(一元)调用和 streaming(流式)调用分别定义拦截器。
1. Unary Interceptor(一元中间件)
Unary 拦截器用于处理普通的 RPC 调用。它是一个函数,接收上下文、方法名、请求、响应、目标客户端或服务端、以及一个执行后续处理的函数(handler)。
示例:实现一个简单的日志中间件
func LoggingInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { log.Printf("Received request for %s", info.FullMethod) resp, err := handler(ctx, req) if err != nil { log.Printf("Error handling request: %v", err) } else { log.Printf("Successfully processed request") } return resp, err}
注册到 gRPC 服务端:
s := grpc.NewServer(grpc.UnaryInterceptor(LoggingInterceptor))2. Streaming Interceptor(流式中间件)
Streaming 拦截器用于处理流式 RPC。它更复杂一些,因为需要包装 stream 对象。
立即学习“go语言免费学习笔记(深入)”;
示例:流式日志拦截器
func LoggingStreamInterceptor(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { log.Printf("Starting stream: %s", info.FullMethod) err := handler(srv, ss) if err != nil { log.Printf("Stream error: %v", err) } log.Printf("Stream finished") return err}注册到服务端:
ShopEx助理
一个类似淘宝助理、ebay助理的客户端程序,用来方便的在本地处理商店数据,并能够在本地商店、网上商店和第三方平台之间实现数据上传下载功能的工具。功能说明如下:1.连接本地商店:您可以使用ShopEx助理连接一个本地安装的商店系统,这样就可以使用助理对本地商店的商品数据进行编辑等操作,并且数据也将存放在本地商店数据库中。默认是选择“本地未安装商店”,本地还未安
0 查看详情
s := grpc.NewServer(grpc.StreamInterceptor(LoggingStreamInterceptor))3. 组合多个中间件
可以使用第三方库如 go-grpc-middleware 来简化多个拦截器的组合。
安装:
go get github.com/grpc-ecosystem/go-grpc-middleware组合使用:
import "github.com/grpc-ecosystem/go-grpc-middleware"myInterceptors := []grpc.UnaryServerInterceptor{ LoggingInterceptor, AuthInterceptor, RecoveryInterceptor,}s := grpc.NewServer( grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(myInterceptors...)), grpc.StreamInterceptor(grpc_middleware.ChainStreamServer( LoggingStreamInterceptor, AuthStreamInterceptor, )),)4. 常见中间件类型
认证(Auth):从 metadata 中提取 token 并验证日志(Logging):记录请求方法、参数、耗时错误恢复(Recovery):捕获 panic,避免服务崩溃限流(Rate Limiting):控制请求频率监控(Metrics):上报 Prometheus 指标注意
拦截器中不要修改原始请求结构体字段,除非你确定是深拷贝后的值。建议只读取或附加 context.Value 或 metadata。
基本上就这些。gRPC 的拦截机制足够灵活,配合组合模式可以实现强大而清晰的中间件系统。
以上就是如何在Golang中实现gRPC中间件的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1111399.html
微信扫一扫
支付宝扫一扫