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 的调用过程:
线程启动 (
java.lang.Thread.run
):- 调用链的起点是 Java 线程的启动。
Thread.run
方法是所有线程执行的入口。
- 调用链的起点是 Java 线程的启动。
线程池执行 (
ThreadPoolExecutor$Worker.run
):- 线程池中的工作线程开始执行任务。这里使用的是
ThreadPoolExecutor
,它管理并调度线程池中的线程。
- 线程池中的工作线程开始执行任务。这里使用的是
线程池调度 (
ThreadPoolExecutor.runWorker
):ThreadPoolExecutor
的runWorker
方法调度并执行具体的任务。这个任务对应的是一个 RPC 请求的处理。
通信层处理 (
ChannelEventRunnable.run
):ChannelEventRunnable
是 Dubbo 中的一个类,用于处理通信通道中的事件。在这里,它执行了网络事件的处理。
解码器处理 (
DecodeHandler.received
):DecodeHandler
是 Dubbo 中的一个处理器,用于对收到的数据进行解码。它将解码后的数据传递给下一个处理器。
请求处理 (
HeaderExchangeHandler.received
):HeaderExchangeHandler
负责处理解码后的请求,主要是对请求进行处理和响应。
协议层调用 (
HeaderExchangeHandler.handleRequest
):- 这个方法具体负责处理接收到的请求,并调用相应的服务方法。
Dubbo 协议 (
DubboProtocol$1.reply
):DubboProtocol
是 Dubbo 中的核心协议处理器,负责将调用分发到具体的服务实现上。这里的reply
方法是处理响应的。
过滤器链调用 (
ProtocolFilterWrapper$1.invoke
):- 这个调用标志着过滤器链的开始,过滤器会逐层包裹并处理请求。过滤器链的执行顺序是由内向外的顺序(先执行内部,再执行外部)。
各类过滤器:
EchoFilter.invoke
,ClassLoaderFilter.invoke
,GenericFilter.invoke
,ContextFilter.invoke
,TraceFilter.invoke
,TimeoutFilter.invoke
,MonitorFilter.invoke
,ExceptionFilter.invoke
:这些过滤器在请求被处理前后插入额外的逻辑,比如日志、监控、超时处理等。
服务调用 (
InvokerWrapper.invoke
):InvokerWrapper
负责调用实际的服务实现,它是一个Invoker
的包装器。
元数据包装器 (
DelegateProviderMetaDataInvoker.invoke
):DelegateProviderMetaDataInvoker
是对服务提供者的元数据进行包装和管理。
抽象代理调用 (
AbstractProxyInvoker.invoke
):AbstractProxyInvoker
是服务调用的抽象层,通过它来调用实际的服务实现。
代理调用 (
JavassistProxyFactory$1.doInvoke
):- 这是 Dubbo 动态代理生成的代理类,通过 Javassist 技术生成,用来代理实际的服务调用。
动态代理方法调用 (
Wrapper80.invokeMethod
):Wrapper80
是由 Dubbo 生成的动态代理类的字节码,负责调用目标方法。
业务逻辑层 (
ChatServiceImpl.getTalkMsg
):- 最终,调用到了业务代码中的
ChatServiceImpl.getTalkMsg
方法,这里是具体的业务逻辑执行点,也是异常发生的地方。
- 最终,调用到了业务代码中的