kratos项目使用中间件Middleware介绍
demo项目地址
https://gitee.com/huoyingwhw/kratos-middleware
业务场景
很多情况下我们需要对请求的URI进行token校验——用户登录成功后将token与uid的对应关系存储到redis中,然后在某个时机去刷新token数据,接下来的所有请求都需要校验一下当前请求的token是否合法,如果合法的话将uid取出来传递给每一个service中进行业务处理——这样就不用再去查数据库了。
我们省略token管理的逻辑(具体token什么时候过期、如何刷新token这些逻辑),在redis中先存好token与uid对应的数据。
还有一些时候,我们需要在所有的http请求的响应做一些统一的操作,比如将当前时间戳保存到某个响应头中,这样方便客户端做时间核对。
以上的场景合适在中间件中去处理,因为这些需求在后端来说都是“全局”的。
另外,案例中只给出了http的例子,其实grpc的用法也是一样的~
kratos中集成的中间件参考官方文档
https://go-kratos.dev/docs/component/middleware/overview/
注意下,“先进后出”的生效顺序:
项目中使用
1、在server/http.go中加上一些ServerOption
2、自定义的middleware封装到自己写的包中:
3、校验成功的话将uid放到请求的ctx中:
4、在业务代码中从ctx中获取uid:
~~~
效果演示
先看下redis中的数据:
login接口在白名单,不用校验:
redis中存在token的话正确返回,并且业务中能从ctx中拿到uid:
token不存在的情况:
而且每次返回的响应头都有自定义的当前时间戳的数据:
~~~