dubbo 2.6.0 调用过程

异常堆栈

 at com.service.lmpl.client.ChatServiceImpl.getTalkMsg(LrbServiceMsgServiceImpl.java:1299)
 at com.alibaba.dubbo.common.bytecode.Wrapper80.invokeMethod(Wrapper80.java)
 at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:45)
 at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:71)
 at com.alibaba.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:48)
 at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:52)
 at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:61)
 at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68)
 at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:74)
 at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68)
 at com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:41)
 at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68)
 at com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:77)
 at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68)
 at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:71)
 at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68)
 at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:131)
 at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68)
 at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:37)
 at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68)
 at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:37)
 at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:68)
 at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:98)
 at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:96)
 at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:168)
 at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:50)
 at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:79)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
 at java.lang.Thread.run(Thread.java:750)

让我们分析这个异常堆栈,从下往上讲解 Dubbo 的调用过程:

  1. 线程启动 (java.lang.Thread.run):

    • 调用链的起点是 Java 线程的启动。Thread.run 方法是所有线程执行的入口。
  2. 线程池执行 (ThreadPoolExecutor$Worker.run):

    • 线程池中的工作线程开始执行任务。这里使用的是 ThreadPoolExecutor,它管理并调度线程池中的线程。
  3. 线程池调度 (ThreadPoolExecutor.runWorker):

    • ThreadPoolExecutorrunWorker 方法调度并执行具体的任务。这个任务对应的是一个 RPC 请求的处理。
  4. 通信层处理 (ChannelEventRunnable.run):

    • ChannelEventRunnable 是 Dubbo 中的一个类,用于处理通信通道中的事件。在这里,它执行了网络事件的处理。
  5. 解码器处理 (DecodeHandler.received):

    • DecodeHandler 是 Dubbo 中的一个处理器,用于对收到的数据进行解码。它将解码后的数据传递给下一个处理器。
  6. 请求处理 (HeaderExchangeHandler.received):

    • HeaderExchangeHandler 负责处理解码后的请求,主要是对请求进行处理和响应。
  7. 协议层调用 (HeaderExchangeHandler.handleRequest):

    • 这个方法具体负责处理接收到的请求,并调用相应的服务方法。
  8. Dubbo 协议 (DubboProtocol$1.reply):

    • DubboProtocol 是 Dubbo 中的核心协议处理器,负责将调用分发到具体的服务实现上。这里的 reply 方法是处理响应的。
  9. 过滤器链调用 (ProtocolFilterWrapper$1.invoke):

    • 这个调用标志着过滤器链的开始,过滤器会逐层包裹并处理请求。过滤器链的执行顺序是由内向外的顺序(先执行内部,再执行外部)。
  10. 各类过滤器:

    • EchoFilter.invoke, ClassLoaderFilter.invoke, GenericFilter.invoke, ContextFilter.invoke, TraceFilter.invoke, TimeoutFilter.invoke, MonitorFilter.invoke, ExceptionFilter.invoke:这些过滤器在请求被处理前后插入额外的逻辑,比如日志、监控、超时处理等。
  11. 服务调用 (InvokerWrapper.invoke):

    • InvokerWrapper 负责调用实际的服务实现,它是一个 Invoker 的包装器。
  12. 元数据包装器 (DelegateProviderMetaDataInvoker.invoke):

    • DelegateProviderMetaDataInvoker 是对服务提供者的元数据进行包装和管理。
  13. 抽象代理调用 (AbstractProxyInvoker.invoke):

    • AbstractProxyInvoker 是服务调用的抽象层,通过它来调用实际的服务实现。
  14. 代理调用 (JavassistProxyFactory$1.doInvoke):

    • 这是 Dubbo 动态代理生成的代理类,通过 Javassist 技术生成,用来代理实际的服务调用。
  15. 动态代理方法调用 (Wrapper80.invokeMethod):

    • Wrapper80 是由 Dubbo 生成的动态代理类的字节码,负责调用目标方法。
  16. 业务逻辑层 (ChatServiceImpl.getTalkMsg):

    • 最终,调用到了业务代码中的 ChatServiceImpl.getTalkMsg 方法,这里是具体的业务逻辑执行点,也是异常发生的地方。