Go中的 Interceptor
拦截器
前言
在编写 golang
的gRPC服务时,想要使用类似于laravel框架中的 middleware
中间件的功能,恰巧原生的代码中并没有相关中间件的功能,在翻阅了一些大量文档后,发现有一个和中间件功能很相识的东西,就是 Interceptor
拦截器。
拦截器详解
grpc服务端提供了interceptor功能,可以在服务端接收到请求时优先对请求中的数据做一些处理后再转交给指定的服务处理并响应,功能类似middleware,很适合在这里处理验证、日志等流程。
普通拦截器(UnaryServerInterceptor)
- 拦截普通的一次请求一次响应的rpc服务
流式拦截器(StreamServerInterceptor)
- 拦截流式的rpc服务
用法
这里主要讲解 普通拦截器(UnaryServerInterceptor)
的使用方法,我们打开 go
的源码,查看 UnaryServerInterceptor
的相关代码,,如下:
1 | /* |
可以看出 UnaryInterceptor
函数的唯一参数是一个 UnaryServerInterceptor
, UnaryInterceptor
返回的 ServerOption
作为 grpc.NewServer
的参数。而 UnaryServerInterceptor
是一个函数类型,其中四个参数分别是
- ctx: 当前请求的Context
- req:当前请求的参数
- info:当前请求的服务端信息
- handler:服务端处理这次请求的handler
那么我们如何去实现一个拦截器呢?代码如下:
1 | // SentryUnaryServerInterceptor 实现xxx拦截器 |
我们只需要在方法内实现一个拦截器的闭包,返回一个 grpc.UnaryServerInterceptor
实例,在外部接收并使用到到 grpc.NewServer
中去,即可使用该拦截器了。
结语
PHPer 的转 go
的辛酸路0.0