Go - 如何编写 ProtoBuf 插件 (三) ?
2024-08-31 12:13:31
前言
上篇文章《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 - 如何编写 ProtoBuf 插件 (二) ?
- Go - 如何编写 ProtoBuf 插件 (一) ?
- Go - 关于 protoc 工具的小疑惑
- Go - 关于 .proto 文件的小思考
- Go - 基于逃逸分析来提升程序性能
最新文章
- 第三个Sprint冲刺第九天
- redis入门笔记(2)
- asp.net各种cookie代码和解析
- jquery为新增元素添加事件
- BestCoder22 1003.NPY and shot 解题报告
- 对于java中的变量问题
- 转:Java环境变量配置
- WDCP管理面板安装启动EXIF、bcmath完整步骤
- ajax 乱码
- gdb调试 使用心得
- J2EE基础篇——十三个规范
- arm参数传递和返回值
- win10 uwp 俄罗斯方块
- 学习 node.js 搭建web服务器
- javaScript执行环境、作用域链与闭包
- Ubuntu 16.04安装Matlab 2016b教程
- Codeforces Round #419 D. Karen and Test
- vue 自学笔记记录
- MATLAB常微分方程数值解——欧拉法、改进的欧拉法与四阶龙格库塔方法
- js几个小技巧和坑
热门文章
- Google Earth Engine 中的位运算
- java 网络编程基础 TCP/IP协议:服务端ServerSocket;客户端Socket; 采用多线程方式处理网络请求
- ELK部署笔记
- 我写了个IDEA开源插件,vo2dto 一键生成对象转换
- JAVA微信公众号网页开发——获取公众号关注的所有用户(微信公众号粉丝)
- JAVA运行报错 [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
- 查找MySql的配置文件my.cnf所在路径
- 【LeetCode】800. Similar RGB Color 解题报告(C++)
- 【LeetCode】Longest Word in Dictionary through Deleting 解题报告
- 1137 - Expanding Rods