对于一个框架来说,通常具备有所谓的中间件,有时候也可以说是拦截器,其实和钩子差不多的概念。
那grpc也不例外。但是使用python如何应用到我们的拦截器的呐? 拦截器又可以做哪些事情呢?
1:grpc的拦截器可以做啥?
本身拦截器的概念和我们的中间件类似,所以类似fastapi中我们的中间件能做,拦截器都可以做:
- 身份验证
- 日志请求记录
- 全局上下文的信息处理等
- 多个拦截器和多个中间件遵循的请求规则都是洋葱模型
- 拦截器必须有返回值,返回是响应报文体
PS:而且相对GRPC来说不止于我们的服务端有钩子,客户端也有钩子(拦截器),和我们的httpx库提供的类似的钩子函数差不多!
PS:拦截器可以作用再客户端和服务端:客户端拦截器和服务端拦截器
2:grpc的拦截器分类
- 一元拦截器(UnaryServerInterceptor)-客户端中
- 流式拦截器(StreamClientInterceptor)- 客户端中
- python中的服务端是实现ServerInterceptor
3:在python实现grpc拦截器
查看服务传递的拦截器参数说明:
3.1 服务端的自带拦截器
主要注意点:
- 拦截器传入是一个实例化的对象
- 拦截器列表的传入,可以是元组也可以是列表
- 多拦截器的形式遵循洋葱模型
服务端拦截器需要实现拦截器的抽象方法:
完整服务端示例代码:
1 | python复制代码from concurrent import futures |
关键的配置地方是:
此时使用我们的客户端请求服务端,服务端会输出一下的信息:
1 | python复制代码我是拦截器1号:开始----1 |
3.2 客户端的自带拦截器
客户端拦截器的需要实现类和服务端的不一样:
且当我们的使用客户端拦截器的时候,主要链接到我们的RPC的时候的方式也有所改变:
完整客户端示例代码:
1 | python复制代码import grpc |
4:grpc拦截器上下文传递
我们的都知道作为中间件的话,一般某些业务场景下是有些使用承载请求上下文的传递的任务滴,然是自带的拦截器,似乎完全没有对应的
1 | vbscript复制代码request, context |
相关的引入传递,如果我们的需要传递上下文的时候呢?这就无法实现了!!!!
要实现具有上下文的传递拦截器的话使用第三方库来实现:
1 | 复制代码 pip install grpc-interceptor |
这个库还字典的相关的测试:
1 | css复制代码$ pip install grpc-interceptor[testing] |
4.1 改造服务端拦截器
该用 第三方库后的完整服务端改造示例:
1 | python复制代码from concurrent import futures |
通过上面的方式,我们就可以对应我们的上下文请求做相关的处理了!这个和我们的web框架的中间件几乎是接近类似了!
4.2 简单分析第三方库简单源码
进入这个第三方库的源码内部的,其实发现它自己也是实现了
1 | 复制代码grpc.ServerInterceptor |
然后对它进一步进行了抽象一层
- 第一步其实和我们自带的实现一样,先是获取返回的下一个带处理的handle
1 | ini复制代码next_handler = continuation(handler_call_details) |
然后对返回这个next_handler进行是那种类型的的拦截器:
1 | diff复制代码- unary_unary |
- 判断完成是哪里蕾西的拦截器之后返回
1 | 复制代码handler_factory, next_handler_method |
然后调用的是最终返回是handler_factory的对象
- handler_factory的对象需要的参数有:
+ invoke\_intercept\_method 拦截器的方法
+ request\_deserializer 请求的系列化
+ response\_serializer 响应的系列化
- 而我们的invoke_intercept_method 拦截器的方法获取则需要
+ 传入定义的一个
1 | makefile复制代码request: Any, |
- 然后返回是我们的最终需要实现的方法!
我去晕了~
4.3 补充说明handler_call_details
如果我们的单纯只是需要获取到RPC请求里面的提交请求头元数据的,我们可以使用它读取:
1 | bash复制代码print("handler call details: ", handler_call_details.invocation_metadata) |
它本身是一个:
1 | 复制代码grpc._server._HandlerCallDetails的类型 |
总结
以上仅仅是个人结合自己的实际需求,做学习的实践笔记!如有笔误!欢迎批评指正!感谢各位大佬!
结尾
END
简书:www.jianshu.com/u/d6960089b…
公众号:微信搜【小儿来一壶枸杞酒泡茶】
小钟同学 | 文 【欢迎一起学习交流】| QQ:308711822
本文转载自: 掘金