本文主要讲dubbo的server接受请求的处理过程。服务器接口声明和实现如下:publicinterfaceDemoService{StringsayHello(Stringname);}publicclassDemoServiceImplimplementsDemoService{@OverridepublicStringsayHello(Stringname){return"Hello"+name+",responsefromprovider:"+RpcContext.getContext().getLocalAddress();}}在真实业务处理的sayHello返回语句中打断点,得到如下调用栈: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,MonitorFilt呃(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.回复:149,DubboProtocol$1(com.alibaba.dubbo.rpc.protocol.dubbo)10.handleRequest:96,HeaderExchangeHandler(com.alibaba.dubbo.remoting.exchange.support.header)9.收到: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.收到:101、HeartbeatHandler(com.alibaba.dubbo.remoting.exchange.support.header)4.收到: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的doOpe2、n方法中设置的NettyServerHandler将netty通道转换为dubboChannel并缓存起来,然后将请求委托给它的decoratedhandler。从这里我们可以看出dubbochannelHandler处理链是DubboProtocol中的NettyServerHandler->NettyServer->MultiMessageHandler->HeartbeatHandler->AllChannelHandler->DecodeHandler->HeaderExchangeHandler->匿名类requestHandler(ExchangeHandlerAdapter),他们通过装饰pattern,并逐层调用它们第3层,NettyServer继承自AbstractPeer,这里调用的是父类的received方法,这里只判断下一个通道是否关闭,然后将请求转发给下第4层,MultiMessageHandler,作为顾名思义,就是将多个请求拆解,调用后续的ChannelHandler5、HeartbeatHandler来处理心跳,如果是心跳请求,则返回心跳响应。如果是心跳响应,什么都不做,其他的都转发给下一层的ChannelHandler6。AllChannelHandler是请求派发策略的默认实现,即所有事件(连接/断开/请求/响应/异常处理)都提交给业务线程池处理7.由于AllChannelHandler已经将请求派发给业务线程池对于处理,这里进行线程切换,后续处理打包成ChannelEventRunnable提交给线程池8.DecodeHandler处理接收到的消息Decoding,这里不一定是真解码,主要看参数decode.in.io配置好了,如果为false,会在这里解码,否则从步骤19-10已经解码,HeaderExchangeHandler判断消息是request还是对应的(因为client也会在这里处理),如果是一个请求,打电话给韩dleRequest获取到真正的调用结果,返回11。DubboProtocol$1是DubboProtocol中的匿名内部类requestHandler。这里根据请求为对应的Invoker找到真正的业务流程。12-27。这里,Invoker过滤器是执行逻辑,通过ProtocolFilterWrapper.buildInvokerChain逻辑,将过滤器(Filter)组成一个Invoker链表,最终执行到InvokerDelegete28,InvokerWrapper是InvokerDelegete的父类,这里其实就是InvokerDelegete的invoke方法称为29,DelegateProviderMetaDataInvoker是Invoker的代理类,忽略30-31即可。JavassistProxyFactory$1是JavassistProxyFactory的内部类。它实现了JavassistProxyInvoker,将请求委托给具体的业务实现类。32、Wrapper1是字节码生成的代理类,是Wrapper的子类。Wrapper提供了一些接口声明,方便直接调用。生成的字节码需要有接口才能调用,否则只能使用反射,使用接口空间可以避免使用反射33.真正的业务处理逻辑
