写点什么

A tour of gRPC:09 - gRPC Interceptor 拦截器

作者:BUG侦探
  • 2022 年 8 月 31 日
    北京
  • 本文字数:793 字

    阅读完需:约 3 分钟

A tour of gRPC:09 - gRPC Interceptor 拦截器

在上一篇中,我们体验了 gRPC 的反射和拦截器功能,并尝试使用 evans 客户端对接口进行了测试。在 本篇中,我们将体验 拦截器功能,拦截器就像一个中间件功能。

​拦截器可以在 server 和 client 上添加,服务端拦截器会在实际方法被调用前先执行,它有多种用途,例如:日志记录,跟踪,速率限制,身份验证和授权。同样,客户端拦截器会在实际调用发起前先执行。

接下来我们来测试一下

1. 在 server/main.go 上添加 一个简单的一元拦截器做测试、一个流拦截器做测试

​2. 运行服务端和客户端测试

​可以看到 server 上添加的 unary 拦截器成功运行了,接下来我们不妨做点更有意思的!

  • 实践一下!

我们在我们的系统上增加一个用户登录并返回 JWT 访问令牌的方式

1. 在 service 包下添加 User.go 实体

​2. 接下来,在 service\user_store.go 中创建一个用于存储用户信息的类

​3. 接着,实现一个 JWT 管理器来为用户生成 和验证访问令牌

​4. 新增一个 auth_service.proto

​5. 在 service 包下新建 auth_server.go 负责认证和登录

​6. 在 server/main.go 中添加 userStore 内容

​7. 添加一个 service/auth_interceptor.go

​8. 在 server/main.go 中添加几个种子用户,并把上面的拦截器注册到 server 上

​9. 接下来我们来实现客户端登录携带 token 的操作,新增一个 client/auth_client.go

​10. 接下来我们实现一个客户端拦截器 auth_interceptor.go 目的是在调用服务器方法之前,拦截 所有 gRPC 请求,并为其添加访问令牌

​11. 将之前 main/client.go 中的逻辑,抽到新建的 client/laptop_client.go 中

​12. 重构一下 main/client.go

​修改 makefile

​好了,我们接下来进行一个小测试,看我们的拦截器是否起到了身份验证和鉴权,我们先用一个 user 权 限的账号(种子用户设置在 server/main.go 中) 尝试进行 createLaptop。

​可以看到,提示了权限不足,接下来我们换用一个 admin 权限的账号

​创建成功!可以看到拦截器的运行符合预期。






发布于: 刚刚阅读数: 3
用户头像

BUG侦探

关注

还未添加个人签名 2021.06.08 加入

专注于发掘程序员/工程师的有趣灵魂,对工作中的思路与总结进行闪光播报。

评论

发布
暂无评论
A tour of gRPC:09 - gRPC Interceptor 拦截器_gRPC_BUG侦探_InfoQ写作社区