一:入口
在PersonServiceImpl|say方法中断点,然后根据debug的栈最前面找,很容易找到ChannelEventRunnable.class类,可以想象,如果要调用该类,必须先new,于是再在这个类的构造函数上debug。
在ChannelEventRunnable构造函数上debug后,继续在栈找很容易找到NettyHandler类,NettyHandler继承了SimpleChannelHandler类。SimpleChannelHandler是netty的提供的Handler。到此NettyHandler的channelConnected便是建立连接的入口。而实际接收到client信息的是NettyHandler类的messageReceived方法。
二:接受信息调用链
根据上面说的调用链如下:
- NettyHandler|messageReceived
- NettyServer|received
- MultiMessageHandler|received
- HeartbeatHandler|received
- AllChannelHandler|received
- 调用到这里后会启动一个线程池去处理。并且根据参数传递持有NettyChannel。AllChannelHandler代码如下:
public void received(Channel channel, Object message) throws RemotingException {
ExecutorService cexecutor = getExecutorService();
try {
cexecutor.execute(new ChannelEventRunnable(channel, handler, ChannelState.RECEIVED, message));
} catch (Throwable t) {
throw new ExecutionException(message, channel, getClass() + " error when process received event .", t);
}
}
三:ChannelEventRunnable
- 该类是一个执行单元,dubbo把接受到的请求放进线程池去处理。并且调用到ChannelEventRunnable的run方法,继而DecodeHandler|received。
- 经过DecodeHandler|received后进入HeaderExchangeHandler
- 在HeaderExchangeHandler的received有一行代码是:Response response = handleRequest(exchangeChannel, request);
这里就是正式把request处理完返回response 。 - 根据HeaderExchangeHandler进入DubboProtocol的reply
四:DubboProtocol
- 在DubboProtocol中有一个 Map<String, Exporter<?>> exporterMap|该属性来自DubboProtocol的父类AbstractProtocol,根据request拿到key,比如com.wang.dubbo.api.PersonService:20880。从这里取到Exporter。
- 拿到Exporter后,里面有一个包括的invoker。
- 到了invoker后调用invoke,不过这里会经过很多invoke的Filter这些Filter有以下: