前言

上篇文章《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 插件有一点小的认识,希望对你能够有所帮助。

推荐阅读

最新文章

  1. 第三个Sprint冲刺第九天
  2. redis入门笔记(2)
  3. asp.net各种cookie代码和解析
  4. jquery为新增元素添加事件
  5. BestCoder22 1003.NPY and shot 解题报告
  6. 对于java中的变量问题
  7. 转:Java环境变量配置
  8. WDCP管理面板安装启动EXIF、bcmath完整步骤
  9. ajax 乱码
  10. gdb调试 使用心得
  11. J2EE基础篇——十三个规范
  12. arm参数传递和返回值
  13. win10 uwp 俄罗斯方块
  14. 学习 node.js 搭建web服务器
  15. javaScript执行环境、作用域链与闭包
  16. Ubuntu 16.04安装Matlab 2016b教程
  17. Codeforces Round #419 D. Karen and Test
  18. vue 自学笔记记录
  19. MATLAB常微分方程数值解——欧拉法、改进的欧拉法与四阶龙格库塔方法
  20. js几个小技巧和坑

热门文章

  1. Google Earth Engine 中的位运算
  2. java 网络编程基础 TCP/IP协议:服务端ServerSocket;客户端Socket; 采用多线程方式处理网络请求
  3. ELK部署笔记
  4. 我写了个IDEA开源插件,vo2dto 一键生成对象转换
  5. JAVA微信公众号网页开发——获取公众号关注的所有用户(微信公众号粉丝)
  6. JAVA运行报错 [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
  7. 查找MySql的配置文件my.cnf所在路径
  8. 【LeetCode】800. Similar RGB Color 解题报告(C++)
  9. 【LeetCode】Longest Word in Dictionary through Deleting 解题报告
  10. 1137 - Expanding Rods