gRPC拦截器那点事,希望帮到你

上一篇介绍了gRPC的接口认证,我们客户端需要实现gRPC提供的接口,然后在服务端业务接口实现中通过metadata获取认证信息,进行判断,那么当我们有几十个,几百个业务接口时,如果都在接口实现中去做,那将是一个噩梦,也不符合DRY(Don't Repeat Yourself)原则,今天一起来看看如何通过gRPC的拦截器做到统一接口认证工作

初识gRPC拦截器

  • gRPC在grpc包中定义了一个变量,如下,这个变量叫做UnaryServerInterceptor(一元服务拦截器),
  • 其类型是一个函数,这个函数有,4个入参,两个出参,介绍如下
  • ctx context.Context 上下文
  • req interface{} 用户请求的参数
  • info UnaryServerInfo RPC 方法的所有信息,定义如下
  • handler UnaryHandler RPC方法本身
  • resp interface{} RPC方法执行结果

如何使用

  • 首先定义一个拦截器
  • 在服务端启动时将拦截器添加进去
  • 如上就是服务端使用拦截器的所有步骤,客户端在访问服务端时就会被拦截

如何添加多个拦截器

  • 有人说我看上面代码grpc.NewServer是一个可变参数,我传多个不就好了吗?真的是这样吗,我们来试试,代码如下我们添加了两个拦截器
  • 很遗憾,服务端启动失败,报错信息如下,什么含义呢,意思是说,这个一元服务拦截器只能设置一个,不能重复,其实从名字就能看出,一元拦截器,就是说只能设置一个拦截器,gRPC有意的阻止拦截器链的形式

panic: The unary server interceptor was already set and may not be reset. [recovered] panic: The unary server interceptor was already set and may not be reset.

  • 那我们如果真的需要拦截器链,该如何配置呢,核心思想是递归,代码如下:
  • github上已经有这么一个项目,如下
  • https://github.com/grpc-ecosystem/go-grpc-middleware
  • 这个项目提供了拦截器的interceptor链式的功能,还有其它一些功能,大家可以去学习学习。

gRPC还有哪些拦截器

统一在grpc包下,其他拦截器如下

type UnaryClientInterceptor

这是一个客户端上的拦截器,在客户端真正发起调用之前,进行拦截,这是一个实验性的api,这是gRPC官方的说法

type StreamClientInterceptor

在流式客户端调用时,通过拦截clientstream的创建,返回一个自定义的clientstream,可以做一些额外的操作,这是一个实验性的api,这是gRPC官方的说法

type UnaryServerInterceptor (就是上面我们demo中的拦截器)

type StreamServerInterceptor

拦截服务器上流式rpc的执行

gRPC的拦截分类

  • 按功能来分
  1. 一元拦截器 UnaryInterceptor
  2. 流式拦截器 StreamInterceptor
  • 按端来分
  1. 客户端拦截器 ClientInterceptor
  2. 服务端拦截器 ServerInterceptor
  • 大家平时使用时灵活使用即可,慢慢的就会融会贯通

本文分享自微信公众号 - GoLang那点事(aweiaichitudou)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏BAT的乌托邦

【小家Spring】Feign发送Get请求时,采用POJO对象传递参数的最终解决方案 Request method 'POST' not supported (附带其余好几个坑)

spring cloud技术栈里面,Feign可以使得我们的rest调用和调用本地方法一样方便。但是它真的有非常多的坑,苦不堪言啊。本文将描述我们最为常遇到的坑...

84230
来自专栏IT码农

安装yii2高级版

选择VPN或者设置composer的镜像服务器 镜像用法: 有两种方式启用本镜像服务: • 系统全局配置: 即将配置信息添加到 Composer 的全局配...

14810
来自专栏chenchenchen

微信定时消息之搞定女朋友

有时候,你很想关心她,但是你太忙了,以至于她一直抱怨,觉得你不够关心她。你暗自下决心,下次一定要准时发消息给她,哪怕是几句话,可是你又忘记了。你觉得自己很委屈?...

22910
来自专栏IT码农

vscode常用插件

快捷键:ctrl+alt+i 顶部注释,可定义作者、时间等信息,保存文件时自动更新最后修改时间。

19940
来自专栏玩转JavaEE

团队开发中 Git 最佳实践,不给队友拖后腿!

本文要从具体实践角度,尤其是在团队协作中,阐述如何去好好地应用 Git。既然是讲在团队中的应用实践,我就尽可能地结合实际场景来讲述。

10410
来自专栏Rust语言学习交流

【Rust日报】 2019-09-01 - default-boxed:让结构体定义的时候,直接分配在堆上

作者尝试了基于 wavelet 来构建一个去中心化的博客,也算是迈向 w3 过程中的一个尝试。

11030
来自专栏IT码农

composer系列之五

是的,既然我们在使用一个composer扩展的时候根据一份composer.json来安装依赖包,那么我们发布扩展包的时候,也应该先有一份描述自己的清单 - c...

7850
来自专栏五分钟学算法

【周末轻松一刻】 GitHub 上的这些沙雕项目

一直对我们的微博保持关注的朋友应该知道,今年年初的时候,我们同时开通了 GitHubDaily 公众号与知乎账号。

7520
来自专栏生信宝典

单细胞预测Doublets软件包汇总|过渡态细胞是真的吗?

对于高通量方法,在细胞捕获效率和doublets比例之间存在折中,通常的做法是以1-5%的doublets为目标(Ziegenhain et al., 2017...

43740
来自专栏IT码农

CentOS7下gogs安装总结

七、使用浏览器访问http://IP:3000,完成配置安装,建议使用SQLite:

9820

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励