Dubbo源码分析(四)Handler & Filter
来源:互联网 发布:数据库是什么文件 编辑:程序博客网 时间:2024/04/19 21:23
本文将主要介绍Server端处理一次请求的流程,同时讲解一个比较巧妙的设计——Filter。
根据前面的分析我们可以推断出Server端处理网络通信的组件为NettyServer,对应处理具体事件的handler为NettyHandler,它的构造函数需要一个ChannelHandler的参数,这里传递的就是NettyServer实例的引用。这样一来,handler对messageReceived()的事件处理,又传递给了NettyServer的receive()方法
NettyServer本身没有实现receive方法,这个调用由基类AbstractPeer处理,而它也是再调用自己维护的ChannelHandler,也就是构造NettyServer时传入的handler。这是一个ChannelHandlerDispatcher实例,它允许同时触发一组普通的handler。实际构建时的handler为new DecodeHandler(new HeaderExchangeHandler(handler)),HeaderExchangeHandler中有一部分处理的逻辑,同时还会调用外部传递handler。
最后调用了handelr.reply()方法, 它的实现与具体的协议有关,比如默认配置下就是在DubboProtocol中构建的requestHandler,在createServer()方法中传递给Exchanger。
看到了invoker.invoke(),也就是真正执行调用的地方。这个Invoker实例来自于根据serviceKey查找的Exporter,它是通过ExtensionLoader创建的,是一个ProtocolFilterWrapper实例。
这里会将原来的Invoker通过各种Filter包装成一个InvokerChain,一次调用会依次经过这些FilterChain到达最终的Filter。在这些Filter中可以进行超时校验、数据监控等工作,每个Filter相对独立,使得代码结构非常清晰,也便于为新功能进行扩展。
这个链的结构是:除了初始传入的Invoker外,对于每个Filter都新建一个Invoker,并返回最后一个创建的Invoker。当执行这些后来构建的Invoker.invoker()方法时,实际调用了filter.invoker(next, invocation),这样会去执行filter中的逻辑,然后再由filter调用下一个Invoker的invoke方法。直至最后一个原始的Invoker,它的invoke方法不会调用filter,而是正常的invoke逻辑。
以TimeoutFilter为例具体来看一下
在调用下一个Invoker的前后记录时间,并将超时的信息打印出来。其中原始的Invoker来自JavassistProxyFactory创建的实例
基类的invoke方法调用子类的doInvoke,去执行真正的反射调用。Server端处理一次请求的流程就介绍到这里。
文中提到的核心类包括
- NettyServer
- NettyHandler
- HeaderExchangeHandler
- DubboProtocol
- ProtocolFilterWrapper
- JavassistProxyFactory
- Dubbo源码分析(四)Handler & Filter
- Dubbo源码分析 Handler & Filter
- Dubbo源码分析(Filter)
- dubbo Filter源码分析
- Dubbo源码分析(四):Dubbo之Registry
- Dubbo源码分析(四):Dubbo之Registry
- dubbo源码分析-consumer端5-Filter
- dubbo源码分析-consumer端5-Filter
- Dubbo源码分析(四):dubbo中bean的加载
- dubbo源码分析(一)
- dubbo源码分析(一)
- Dubbo源码分析之四:服务的调用
- Dubbo源码分析(三):Dubbo之服务端(Service)
- Dubbo源码分析(三):Dubbo之服务端(Service)
- Dubbo源码分析(三):Dubbo之服务端(Service)
- Dubbo系列(七)Dubbo源码分析之结构描述
- Handler消息机制源码解析(四)
- Dubbo源码分析(一):概览
- PHP框架开发教程(四) 单一入口
- 设置listview高度包裹内容
- JAVA的反射机制浅谈
- 了解流程类型,第 4 部分:左右滑动类
- 收集的小工具1【win7文件删除】
- Dubbo源码分析(四)Handler & Filter
- Leetcode 355. Design Twitter 实现一个Twitter系统 解题报告
- 实习杂记(26):File的renameto的用法
- ios xml
- 设置手机网页不可长按选中元素的方法
- 关于DDR3布线规范和技巧
- swiper的基础使用(十六)
- 微信开发 获取用户基本信息 php
- Maven入门2- 添加远程仓库地址