服务端接收请求处理及返回响应流程图:
结论:IOworker这边做的工作:编解码,处理心跳,sent方法回调
1.派发策略分析:
所有的sent事件方法、心跳请求全部在IO线程上执行
1)all[com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler] : 除sent事件回调方法、心跳在IO线程执行外,其余全部在线程池上执行。 注:重写了WrappedChannelHandler中的connected,disconnected,received,caught方法
2)execution[com.alibaba.dubbo.remoting.transport.dispatcher.execution.ExecutionChannelHandler] : 与all类似,唯一区就是all在线程池未指定时,可以使用共享线程池。注:重写了WrappedChannelHandler中的connected,disconnected,received,caught方法
3)message [com.alibaba.dubbo.remoting.transport.dispatcher.message.MessageOnlyChannelHandler]: 只有请求事件在线程池中执行,其他在IO线程上执行。 注:重写了WrappedChannelHandler中的received方法
4)connection[com.alibaba.dubbo.remoting.transport.dispatcher.connection.ConnectionOrderedChannelHandler] : 请求事件,连接事件、断开连接事件在线程池中执行,其他在IO线程执行。注:重写了WrappedChannelHandler中的connected,disconnected,received,caught方法
5)direct [com.alibaba.dubbo.remoting.transport.dispatcher.direct.DirectDispatcher]: 所有事件都在IO线程中执行。
WrappedChannelHandler中的方法解释:
1)connected:连接事件,当收到客户端的连接事件时,执行该方法处理相关业务操作
2)disconnected:连接断开事件
3)sent:当可写事件触发时,服务端向客户端返回响应数据,就是通过该方法发送的
4)received:当读事件触发时执行该方法,服务端在接受到客户端的请求数据时,调用该方法
5)caught:发生异常时,调用该方法
2.IOworker所做事情
2.1provider端的编解码
1)provider端解码
ExchangeCodec.decode
- 2)provider端编码
ExchangeCodec.encodeResponse
-
- sent回调由IO处理
可以看到AllChannelHandler继承了WrappedChannelHandler,但是并没有重写sent方法,而MultiMessageHandler.received,HeartbeatHandler,WrappedChannelHandler都是在IO线程去做的,所以sent方法是IO线程做的事。
2.3处理心跳事件
注:如果想深入了解可以按下面进行源码追踪
源码调用流程
--->NettyCodecAdapter.decoder
--->NettyCodecAdapter. InternalDecoder. messageReceived
--->DubboCountCodec.decode
--->ExchangeCodec.decode//对客户端传过来的消息进行解码
--->NettyHandler.messageReceived
--->AbstractPeer.received
--->MultiMessageHandler.received//根据消息类型分发
--->HeartbeatHandler.received//处理心跳事件
--->AllChannelHandler.received//这里处理request请求
--->ChannelEventRunnable.run
--->DecodeHandler//判断请求有没有进行再次编码,如果有就进行解码,因为上面已经解码过了则直接进行HeaderExchangeHandler.received
--->HeaderExchangeHandler.received
--->HeaderExchangeHandler.handleRequest
--->DubboProtocol.ExchangeHandlerAdapter.reply()
--->DubboProtocol.getInvoker
--->JavassistProxyFactory.getInvokerAbstractProxyInvoker
--->AbstractProxyInvoker.invoke//将业务接口执行结果包装一个RpcResult进行返回
--->回到HeaderExchangeHandler.received中得到处理结果,存储在Response中
--->channel.send(response)
--->AbstractPeer.send
--->NettyChannel.send
--->channel.write(message)
--->ExchangeCodec.encodeResponse//对response进行编码