上一个小节中讲到了关于拦截器简单的使用,查看官网文档的时候,其实也有讲到关于拦截器的一些说明。这里再补充一下
从官网的文档里,顺腾摸瓜的拆解一下我们的第三方拦截库的一些思路。
官网关于拦截器grpc.ServerInterceptor使用到的RpcMethodHandler自介绍,深入到第三方库的时候其实里面处理返回也是一个RpcMethodHandler
拦截器intercept_service官方的说明:
作用:在业务执行之前拦截传入的RPC
具体的需要用的额参数有:
上面的意思大概是:需要经过continuation进行包装我们一个handler_call_details才返回一个RpcMethodHandler实例
continuation 使用HandlerCallDetails并继续调用链中的下一个拦截器(如果有的话)或RPC处理程序查找逻辑的函数,调用详细信息作为参数传递,如果RPC被认为是服务的,则返回RpcMethodHandler实例,否则不会返回RpcMethodHandler实例。---(来自翻译的结果)
handler_call_details 描述RPC的HandlerCallDetails,对应的是grpc.HandlerCallDetails的类型
(上小节也有说到)它是一个RPC请求描述,里面包含有两个属性信息:
一个服务可以有多个方法名,但只有一个服务名称
它是一个服务的RPC方法请求实现(意思就是没一个RPC请求理解是为是一个个的RpcMethodHandler 对象
对应我们的GRPC的HandlerCallDetails,它是对RPC请求描述所以RpcMethodHandler 里面包含有对应的HandlerCallDetails
它支持的RPC请求类型主要有以下几个(标识这个请求是属于那种类型的RPC请求)
- request_streaming
- response_streaming
- request_deserializer
- response_serializer
- unary_unary
- unary_stream
- stream_unary
- stream_stream
一个服务可以有多个方法名,但只有一个服务名称
结合上面对几个对象的了解,结合我们的第三方的库其实可以看得出来,第三方库其实就是对我们的 grpc.RpcMethodHandler进行的封装。而我们的 grpc.RpcMethodHandler是一个RPC方法的实现。
再梳理一下第三方库实现的流程:
next_handler = continuation(handler_call_details)
返回一个RpcMethodHandler对象实例。返回的是一个方法函数和一个GRPC的GenericRpcHandler
4:_get_factory_and_method通过对请求类型的判断返回一个我们的是什么请求的额类型和请求方法,如果类型不支持,这直接的抛出RuntimeError错误
5:然后是调用我们的自己需要实现intercept方法传入的请求参数和请求上下文
6:intercept 我们需要传入参数信息有
自回调的方法
请求对象对象封装
上下文请求提
自定义的方法名称---这个其实好像没用不到
整个流程大致明白了!有点后知后觉的感觉~哈哈
以上仅仅是个人结合自己的实际需求,做学习的实践笔记!如有笔误!欢迎批评指正!感谢各位大佬!
END
简书:https://www.jianshu.com/u/d6960089b087
掘金:https://juejin.cn/user/2963939079225608
公众号:微信搜【小儿来一壶枸杞酒泡茶】
小钟同学 | 文 【欢迎一起学习交流】| QQ:308711822
原文作者:程序员小钟同学;如有侵权,请联系管理员删除。