这篇文章主要聊聊 dubbo 的服务端接受请求处理流程
服务端接口声明及实现如下:
public interface DemoService {
String sayHello(String name);
}
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();
}
}
在真实业务处理 sayHello return 语句加入断点可以得到如下调用栈:
33. sayHello:29, DemoServiceImpl (com.alibaba.dubbo.demo.provider)
32. invokeMethod:-1, Wrapper1 (com.alibaba.dubbo.common.bytecode)
31. doInvoke:50, JavassistProxyFactory$1 (com.alibaba.dubbo.rpc.proxy.javassist)
30. invoke:86, AbstractProxyInvoker (com.alibaba.dubbo.rpc.proxy)
29. invoke:52, DelegateProviderMetaDataInvoker (com.alibaba.dubbo.config.invoker)
28. invoke:59, InvokerWrapper (com.alibaba.dubbo.rpc.protocol)
27. invoke:63, ExceptionFilter (com.alibaba.dubbo.rpc.filter)
26. invoke:93, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
25. invoke:75, MonitorFilter (com.alibaba.dubbo.monitor.support)
24. invoke:93, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
23. invoke:44, TimeoutFilter (com.alibaba.dubbo.rpc.filter)
22. invoke:93, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
21. invoke:103, TraceFilter (com.alibaba.dubbo.rpc.protocol.dubbo.filter)
20. invoke:93, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
19. invoke:79, ContextFilter (com.alibaba.dubbo.rpc.filter)
18. invoke:93, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
17. invoke:155, GenericFilter (com.alibaba.dubbo.rpc.filter)
16. invoke:93, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
15. invoke:41, ClassLoaderFilter (com.alibaba.dubbo.rpc.filter)
14. invoke:93, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
13. invoke:39, EchoFilter (com.alibaba.dubbo.rpc.filter)
12. invoke:93, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
11. reply:149, DubboProtocol$1 (com.alibaba.dubbo.rpc.protocol.dubbo)
10. handleRequest:96, HeaderExchangeHandler (com.alibaba.dubbo.remoting.exchange.support.header)
9. received:176, HeaderExchangeHandler (com.alibaba.dubbo.remoting.exchange.support.header)
8. received:55, DecodeHandler (com.alibaba.dubbo.remoting.transport)
7. run:57, ChannelEventRunnable (com.alibaba.dubbo.remoting.transport.dispatcher)
------线程切换
6. received:66, AllChannelHandler (com.alibaba.dubbo.remoting.transport.dispatcher.all)
5. received:101, HeartbeatHandler (com.alibaba.dubbo.remoting.exchange.support.header)
4. received:45, MultiMessageHandler (com.alibaba.dubbo.remoting.transport)
3. received:154, AbstractPeer (com.alibaba.dubbo.remoting.transport)
2. channelRead:116, NettyServerHandler (com.alibaba.dubbo.remoting.transport.netty4)
1. invokeChannelRead:292, AbstractChannelHandlerContext (io.netty.channel)
下面对堆栈进行分析:
1、 netty 底层接受网络消息逻辑,此时消息已经经过了解码和反序列化(默认,可以通过配置 decode.in.io 改变解码时机),使用 netty 的 ChannelHandler,具体在 NettyServer 的 doOpen 方法中设置的
2、 NettyServerHandler 将 netty 的 channel 转换为了 dubbo 的 Channel 并进行了缓存,然后将请求委托给了其装饰的 handler,从这里我们可以看出 dubbo 的 channelHandler处理链条是 NettyServerHandler -> NettyServer -> MultiMessageHandler -> HeartbeatHandler -> AllChannelHandler -> DecodeHandler -> HeaderExchangeHandler -> DubboProtocol中的匿名类requestHandler(ExchangeHandlerAdapter),他们通过装饰着模式组成了一个链表,层层依次调用
3、 NettyServer 继承自 AbstractPeer,这里调用到了父类的received方法,这里仅仅只判断了下 channel 是否close 就将请求转发给了下一层
4、 MultiMessageHandler 顾名思义其是将多个请求拆开循环调用后续的 ChannelHandler
5、 HeartbeatHandler 处理心跳的处理器,如果是 心跳请求则返回一个心跳相应,如果是心跳相应则什么也不做,其他的一律转发给下一层的 ChannelHandler
6、 AllChannelHandler 是默认的请求派发策略实现,即所有事件(connected/disconnected/Request/Response/异常处理)都提交给业务线程池处理
7、 由于 AllChannelHandler 进行了请求派发到业务线程池处理,这里进行了线程切换,将后续处理包装为 ChannelEventRunnable 提交给线程池
8、 DecodeHandler 对收到的消息进行解码,这里不一定是真的解码,主要看是否配置了参数 decode.in.io,如果为 false 的话会在这里进行解码,否则从步骤1就已解码完毕
9-10、 HeaderExchangeHandler 判断消息是请求还是相应(因为客户端也是会在这里处理),如果是请求则调用 handleRequest 拿到真实的调用结果然后返回
11、DubboProtocol$1 是 DubboProtocol 中的匿名内部类 requestHandler,在这里进行了根据请求找对对应的 Invoker 进行真实的业务处理过程
12-27、 这里执行了 Invoker 的过滤器逻辑,通过 ProtocolFilterWrapper.buildInvokerChain 逻辑将过滤器(Filter)组成了一个 Invoker 链表,最后执行到 InvokerDelegete
28、 InvokerWrapper 是 InvokerDelegete 的父类,这里其实是调用的 InvokerDelegete 的 invoke 方法
29、 DelegateProviderMetaDataInvoker 就是个 Invoker 的代理类,忽略就好
30-31、 JavassistProxyFactory$1 是 JavassistProxyFactory 的内部类,实现了 JavassistProxy Invoker,将请求代理到具体的业务实现类
32、 Wrapper1 是字节码生成的代理类,是 Wrapper 的子类,Wrapper 提供了一些接口声明,方便直接调用,生成的字节码需要有接口才能调用,否则只能用反射,用接口占位可以避免使用反射
33、 真实业务处理逻辑
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。