0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

马哥Linux运维 来源:稀土掘金技术社区 2023-12-18 10:13 次阅读

在开发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 ./*.proto
tidy:
  go mod tidy


run:
  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"
}

测试结果:

084b53a4-9ccd-11ee-8b88-92fbcf53809c.png

我们再打开jaeger的UI,查看链路追踪信息:

084b53a4-9ccd-11ee-8b88-92fbcf53809c.png

可以看到,我们的链路追踪信息已经上报到了jaeger服务。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 源码
    +关注

    关注

    8

    文章

    574

    浏览量

    28589
  • 日志
    +关注

    关注

    0

    文章

    126

    浏览量

    10526
  • go语言
    +关注

    关注

    1

    文章

    157

    浏览量

    8927

原文标题:怎样开发一个grpc拦截器

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何运用Go语言实现人脸识别

    但是,有一个非常酷的机器学习库 —— dlib 库,一下就吸引了我的注意力。首先,它是用 C ++ 语言编写的,因此你可以使用 cgo 轻松地创建 Go 语言绑定。其次,在 Wild
    的头像 发表于 08-23 09:41 1.3w次阅读

    GRPC的基础使用方法

    语言gRPC 客户端和服务器实现,它提供了一个简单易用的 API,可以方便地创建和使用 gRPC 服务。 基础用法 创建 gRPC
    的头像 发表于 09-19 16:08 507次阅读

    我想做一个号码拦截器。面对面5米内接收到对方的手机号码。我也咨询很多人,不是技

    我想做一个号码拦截器。面对面5米内接收到对方的手机号码。我也咨询很多人,不是技术问题就是,怕这东西触犯法律。我只是正规用途,并不会触犯法律底线!望“能人”解决我的问题!样品只要符合以上条件,重金酬谢...谢谢!QQ896776242加我请注明电子*** 丁先生
    发表于 04-29 16:16

    基于Proteus和C语言实现

    基于Proteus和C语言实现共四题目,有没有人愿意尝试下?
    发表于 07-14 06:20

    如何使用C语言实现模糊PID控制?

    如何使用C语言实现模糊PID控制?
    发表于 09-24 08:54

    C语言实现常用排序算法是什么?

    C语言实现常用排序算法是什么?
    发表于 10-19 06:41

    动能拦截器六自由度仿真建模研究

    仿真建模技术是动能拦截器制导律研究中的重要技术,文中主要建立动能拦截器的轨道运动动力学以及姿态运动动力学模型,并建立完整的制导控制系统数学模型。文末,以某型
    发表于 08-07 08:50 14次下载

    DSP算法的c语言实现

    DSP算法的c语言实现,又需要的朋友下来看看。
    发表于 05-09 10:59 0次下载

    springmvc 自定义拦截器实现未登录用户的拦截

    springmvc自定义拦截器实现未登录用户的拦截
    发表于 11-25 14:44 2432次阅读
    springmvc 自定义<b class='flag-5'>拦截器</b><b class='flag-5'>实现</b>未登录用户的<b class='flag-5'>拦截</b>

    4个重要算法C语言实现源代码

    4个重要算法C语言实现源代码
    发表于 06-10 08:00 12次下载

    go语言实现的简单im即时通信系统

      本文介绍了一个 go 语言实现的简单 im 即时通信系统。 简介 纯go实现的im即时通讯系统,各层可单独部署,之间通过rpc通讯,支持集群,github地址 https
    的头像 发表于 10-20 16:02 3115次阅读

    CRC校验算法原理及c语言实现

    CRC校验算法原理及c语言实现
    发表于 11-30 10:04 9次下载

    累加校验和C语言实现

    累加校验和C语言实现
    发表于 11-29 18:06 10次下载
    累加校验和C<b class='flag-5'>语言实现</b>

    怎么用C语言实现多态

    这里我想主要介绍下在C语言中是如何实现的面向对象。知道了C语言实现面向对象的方式,我们再联想下,C++中的class的运行原理是什么?
    的头像 发表于 10-12 09:12 1637次阅读

    springboot过滤器和拦截器哪个先执行

    Spring Boot是一个用于构建Java应用程序的开发框架,它提供了许多功能和工具来简化开发和部署过程。其中两个重要的功能是过滤器和拦截器。本文将详细介绍Spring Boot过滤器和拦截器
    的头像 发表于 12-03 15:00 713次阅读