worker的任务

服务端接收请求处理及返回响应流程图:

 

 

结论: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中的connecteddisconnectedreceivedcaught方法

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中的connecteddisconnectedreceivedcaught方法

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

  1. 2)provider端编码

ExchangeCodec.encodeResponse

    1. 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进行编码

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值