1.2-服务提供者调用流程

一:入口

  • 在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有以下:

五:Filter

  • 1111111111.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容