使用go语言实现一个grpc拦截器

在开发grpc服务时,我们经常会遇到一些通用的需求,比如:日志、链路追踪、鉴权等。这些需求可以通过grpc拦截器来实现。本文使用go语言来实现一个 grpc一元模式(unary)拦截器,上报链路追踪信息。
原始类型定义
我们可以在grpc的源码包里(interceptor.go),找到一元模式拦截器的类型定义:
// unaryserverinterceptor provides a hook to intercept the execution of a unary rpc on the server. info// contains all the information of this rpc the interceptor can operate on. and handler is the wrapper// of the service method implementation. it is the responsibility of the interceptor to invoke handler// to complete the rpc.type unaryserverinterceptor func(ctx context.context, req any, info *unaryserverinfo, handler unaryhandler) (resp any, err error)
从上面的定义可以看出,一元模式拦截器是一个函数,接收四个参数,返回两个参数。下面我们来看一下这四个参数的含义:
ctx:上下文对象。
req:请求参数
info:包含了rpc的元信息,比如服务名、方法名等。
handler 实例的方法,用来调用实际的rpc方法。
我们只需要实现一个上述类型的函数,在里面实现我们的功能,然后再执行handler函数,就可以实现一个拦截器了。
实现拦截器
我们新建一个项目grpcdemo。
服务定义
我们先在项目目录下新建一个proto文件,定义一个服务:
hello.proto
定义一个makefile:
protos: protoc --proto_path=./ --go_out=pb --go-grpc_out=pb --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative ./*.prototidy: go mod tidyrun: go mod tidy go run main.go
执行以下命令,生成go代码:
make protos代码开发
第一步,新建一个tracing.go,初始化链路追踪器:
tracing.go
第二步,在main.go文件中,添加相关代码:
main.go
在上面的代码中,我们启动了一个grpc服务,监听8091端口。在启动grpc服务前,初始化了链路追踪信息,然后在grpc服务中,使用了自定义的拦截器。在自定义拦截器中,我们上报了链路追踪信息。
启动jaeger服务
具体的启动方式,可以参考官方文档:www.jaegertracing.io/docs/1.26/g…
测试
我们使用goland的grpc插件,来测试一下:
#grpc localhost:8091/pb.helloservice/hello{ name: zhangsan}#grpc localhost:8091/pb.helloservice/helloagain{ name: zhangsan}
测试结果:
我们再打开jaeger的ui,查看链路追踪信息:
可以看到,我们的链路追踪信息已经上报到了jaeger服务。


人工智能与人脑相差甚远
Crossbar是什么?Crossbar由什么组成?
POWER+模块UPS电源的技术特征和应用研究
生物识别技术助力人工智能大发展
小米6最新消息:不止首发骁龙835 小米6硬件信息全曝光
使用go语言实现一个grpc拦截器
使用Synopsys VIP和测试套件进行验证
永洪科技助力华海药业数字化转型,挖掘药企新优势
飞凌嵌入式FCU1101嵌入式控制单元介绍
英特尔第11代Tiger Lake-H CPU现身,所有核心的睿频平均为2.75GHz
美国政府将制定新法规 无人驾驶汽车上路前先审批
五月,与虹科一起“走进华晨宝马铁西工厂”
美国黑客对医院发动DDoS攻击被判10年监禁
嵌入式软件或许会成为未来自动驾驶技术初创公司的一条出路
POL调节器中的输入纹波和噪声的来源是什么?
数字电路设计
德国开发出医用等离子体快速消毒仪
如何将输出的背钻孔调整为非电镀层NON-Plated
Linux同步方法剖析
谁家的量子计算机最强?