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

    文章

    641

    浏览量

    29206
  • 日志
    +关注

    关注

    0

    文章

    138

    浏览量

    10641
  • go语言
    +关注

    关注

    1

    文章

    158

    浏览量

    9049

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    介绍C语言实现的http下载

    做OTA升级功能时,能直接拿到的往往只是升级包的链接,需要我们自己去下载,这时候就需要用到http下载,下文介绍C语言实现的http下载
    发表于 02-22 10:25 399次阅读

    GRPC的基础使用方法

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

    HarmonyOS实战开发-如何在Navigation中完成路由拦截

    路由拦截器interceptor.ets,定义拦截容器、注册方法和公共拦截逻辑,interceptor.ets /** * 定义拦截实现
    发表于 05-08 14:21

    基于Proteus和C语言实现

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

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

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

    Verilog HDL语言实现时序逻辑威廉希尔官方网站

    Verilog HDL语言实现时序逻辑威廉希尔官方网站 在Verilog HDL语言中,时序逻辑威廉希尔官方网站 使用always语句块来实现。例如,实现
    发表于 02-08 11:46 4714次阅读

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

    springmvc自定义拦截器实现未登录用户的拦截
    发表于 11-25 14:44 2519次阅读
    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次下载

    如何使用C语言实现比较简单的猜数游戏的程序免费下载

    本文档的主要内容详细介绍的是如何使用C语言实现比较简单的猜数游戏的程序免费下载
    发表于 04-24 18:31 0次下载
    如何使用C<b class='flag-5'>语言实现</b><b class='flag-5'>一</b><b class='flag-5'>个</b>比较简单的猜数游戏的程序免费下载

    使用C语言实现压缩目录每一个文件为单独的zip文件程序免费下载

    本文档的主要内容详细介绍的是使用C语言实现压缩目录每一个文件为单独的zip文件程序免费下载。
    发表于 11-01 15:07 16次下载

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

      本文介绍了 go 语言实现的简单 im 即时通信系统。 简介 纯go实现的im即时通讯系
    的头像 发表于 10-20 16:02 3649次阅读

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

    【导读】 本文介绍了 go 语言实现的简单 im 即时通信系统。 简介 纯go实现的im即时
    的头像 发表于 10-26 09:22 4405次阅读
    <b class='flag-5'>go</b><b class='flag-5'>语言实现</b>的简单im即时通信系统解析

    使用Java语言实现的向量化BLAS库VectorBLAS

    VectorBLAS是使用Java语言实现的向量化BLAS高性能库,目前已在openEuler社区开源。
    的头像 发表于 08-16 10:40 1213次阅读
    <b class='flag-5'>一</b><b class='flag-5'>个</b>使用Java<b class='flag-5'>语言实现</b>的向量化BLAS库VectorBLAS

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

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