Go - 如何编写 ProtoBuf 插件 (三) ?

简介: Go - 如何编写 ProtoBuf 插件 (三) ?

文章目录:

  • 前言
  • 演示代码
  • 小结
  • 推荐阅读


前言

上篇文章《Go - 如何编写 ProtoBuf 插件 (二) 》,分享了基于 自定义选项 定义了 interceptor 插件,然后在 helloworld.proto 中使用了插件,最后在 golang 代码中获取到使用的插件信息。

接上篇,继续分享。

既然获取到了插件信息,我们就可以使用它们。本文主要分享在 grpc.ServerOption 中的 grpc.UnaryInterceptor 中使用。

演示代码

还是以上篇文章中 helloworld.proto 为例。

// 生成 helloworld.pb.go
// 生成 helloworld_grpc.pb.go
// 使用的 protoc --version 为 libprotoc 3.18.1
// 使用的 protoc-gen-go --version 为 protoc-gen-go v1.27.1
// 使用的 protoc-gen-go-grpc --version 为 protoc-gen-go-grpc 1.1.0
// 在根目录下执行 protoc 命令
protoc --go_out=helloworld/gen --go-grpc_out=helloworld/gen helloworld/helloworld.proto

一、基于上篇文章中获取 options 的代码进行修改,主要是将其存入到结构体即可。

// 演示代码,结构体
var handlers = &struct {
 Methods  map[string]*options.MethodHandler  // FullMethod : Handler
 Services map[string]*options.ServiceHandler // FullMethod : Handler
}{
 Methods:  make(map[string]*options.MethodHandler),
 Services: make(map[string]*options.ServiceHandler),
}


二、在 grpc.NewServer 中使用拦截器。

// 演示代码
serverOptions := []grpc.ServerOption{
 grpc.UnaryInterceptor(unaryServerInterceptor()),
}
srv := grpc.NewServer(serverOptions...)
resolveFileDescriptor() // 解析 options 扩展项


三、在 unaryServerInterceptor() 方法中,可以根据当前请求的服务名和方法名获取到对应设置的 options

// 演示代码
fullMethod := strings.Split(info.FullMethod, "/")
serviceName := fullMethod[1]
// 获取 service options
getServiceHandler(serviceName)
// 获取 method options
getMethodHandler(info.FullMethod)


四、自己写一个 grpcclient 调用一下即可。

--- /helloworld.Greeter/SayHello1 ---
service use interceptor authorization: login_token
method use interceptor whitelist: ip_whitelist
method use interceptor logger: true

至此,在 grpc.UnaryInterceptor 中就可以获取到 options 了,其他演示代码我就不贴了。

最后,通过获取到的 options,便可以执行自己定义的具体方法。

小结

通过最近的 “如何编写 ProtoBuf 插件” 这三篇文章,相信你对编写 ProtoBuf 插件有一点小的认识,希望对你能够有所帮助。

推荐阅读

目录
相关文章
|
开发框架 Go 计算机视觉
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C++ 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。此外,在许多情况下,在各种平台上安装 OpenCV 是很麻烦的。使用纯Go开发的插件不仅在开发时方便,在项目部署和项目维护也能省很多时间精力。
308 5
Go - 如何编写 ProtoBuf 插件 (一) ?
Go - 如何编写 ProtoBuf 插件 (一) ?
156 2
|
运维 监控 测试技术
Golang质量生态建设问题之接入并使用Go单元测试插件的问题如何解决
Golang质量生态建设问题之接入并使用Go单元测试插件的问题如何解决
154 1
Go - 如何编写 ProtoBuf 插件(二)?
Go - 如何编写 ProtoBuf 插件(二)?
182 0
|
JSON Linux 测试技术
go语言处理数据、基本通信以及环境配置 -- json,protobuf,grpc
go语言处理数据、基本通信以及环境配置 -- json,protobuf,grpc
196 1
|
网络架构
flutter推荐路由器插件:go_router
flutter推荐路由器插件:go_router
580 0
|
Go 开发者
Go语言插件开发:Pingo库实践
Go语言插件开发:Pingo库实践
235 0
|
JSON 人工智能 API
用 Go 编写 ChatGPT 插件
用 Go 编写 ChatGPT 插件
226 0
|
2月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
182 1
|
4月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
291 1

热门文章

最新文章