hprose for dotnet 自定义拦截器实现
-
-
- 前言
- 解决步骤
-
- 1.架构图:[github:hprose for dotnet](https://github.com/hprose/hprose/wiki/%E6%9E%84%E6%9E%B6%E7%AE%80%E4%BB%8B)
- 2.上下文对象:[github:hprose for dotnet](https://github.com/hprose/hprose/wiki/%E4%B8%8A%E4%B8%8B%E6%96%87%E5%AF%B9%E8%B1%A1)
- 3.插件处理器:[github:hprose for dotnet](https://github.com/hprose/hprose/wiki/%E6%8F%92%E4%BB%B6%E5%A4%84%E7%90%86%E5%99%A8)
- 4.关于github上问题的回复
- 5.问题的解决
- 6.代码
- 7.解释与不足
-
前言
1.问题:hprose没有已经实现好的拦截器
2.解决:根据hprose提供的架构及上下文对象,对github上已经搭建好的日志、hprose for java过滤器实例进行研究,自定义拦截器配置。
解决步骤
1.架构图:github:hprose for dotnet
在hprose3.0开发者手册里,我重新对hprose的架构有了新的认识,首先是hprose的架构图。
这里分为客户端和服务端,客户端调用过程中将先执行invokeHandler,即调用处理器;在将调用的方法即具体参数通过解编码器进行序列化和反序列化,值得一提的是,这里可以通过hprose序列化协议,也根据需要自定义解编码器,进行不同的序列化协议,例如jsonrpc解编码器。之后通过iohandler,即输入输出处理器,传输到传输层。以上都在wiki中有了明确的说明。
在上图中,我们将传输层抽象为transports对象和handlers对象,它们将对不同的通讯协议提供不同的通讯方式,这将由最开始客户端和服务端注册时所声明的传输协议保持一致。例如可以采用tcp协议、可以采用http协议等。
hprose或者说rpc协议的远程过程调用正是通过这种方式让使用者不需要知道底层的传输协议就可以进行正常的通信。
回到正题,经过传输层后通信到达服务端,服务端的处理器与客户端保持一致,但调用过程恰恰相反,或者说对称。先有iohandler进行处理,再经过解编码器处理后传输给invokehandlers,最后再执行;执行过后原路返回,依照原有的路线和既定的传输协议携带数据返回客户端。这就是hprose中一个远程过程调用的全部过程。
2.上下文对象:github:hprose for dotnet
上下文对象context中类似于kv键值对的形式,key是字符串形式,value可以是任何形式的参数(Object)。上下文对象封装有不同的方法(clone、contains),另:客户端上下文对象为clientcontext,服务端上下文对象为servicecontext,两者均继承自context。
在这里,开发者这样建议我们:我们可以使用clone方法创建多个上下文对象副本,然后通过修改副本上下文对象的服务地址属性,就可以将一个调用变为对多个不同服务的调用。通过这个我们就可以在拆分微服务后对多个微服务进行调用并返回结果,这样