(原创)Dubbo源码之提供者接受参数

服务端:

NettyHandler类:
messageReceived方法:
获取消息,ChannelHandler类中received获取消息

MultiMessageHandler类:
received方法:

HeartbeatHandler类:
received方法:

DecodeHandler类
received方法:

HeaderExchangeHandler类:
handleRequest方法:
参数:RpcInvocation
[world]
{path=com.alibaba.dubbo.demo.DemoService, input=217, dubbo=2.0.0, interface=com.alibaba.dubbo.demo.DemoService, version=0.0.0, timeout=5000000}
NettyChannel [channel=[id: 0x4c18ae45, /192.168.1.102:60779 => /192.168.1.103:20880]]
true
com.alibaba.dubbo.remoting.buffer.ChannelBufferInputStream@41e95aee
null
sayHello
[class java.lang.String]
Request [id=0, version=2.0.0, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=sayHello, parameterTypes=[class java.lang.String], arguments=[world], attachments={path=com.alibaba.dubbo.demo.DemoService, input=217, dubbo=2.0.0, interface=com.alibaba.dubbo.demo.DemoService, version=0.0.0, timeout=5000000}]]
2
执行 handler变量的reply(), handler变量为DubboProtocol类,执行DubboProtocol类中私有变量中ExchangeHandlerAdapter的reply方法。

DubboProtocol类:
私有变量:ExchangeHandler的reply方法:
将传来的消息转换为Invocation,执行getInvoker方法,将Invocation转换为Invoker。

getInvoker方法:
将nettyChanle中的port以及其他参数取出,转换为serviceKey,获取到的key为com.alibaba.dubbo.demo.DemoService:20880
从服务端exporterMap缓存中取出对应的exporter,exporter中有当时service暴露创建的invorker以及向注册中心注册的地址等信息,而invoker存储有service真正执行的实体类。
将exporter中的invoker提取。回到私有变量:ExchangeHandler的reply方法去。将请求参数封装的RpcInvocation传给invoker.invoke方法中。
通过层层fitler,进入AbstractProxyInvoker中的invoke方法。

AbstractProxyInvoker类:
invoke方法:
创建执行结果RpcResult对象,进行doInvoke方法,通过JavassistProxyFactory执行真正实体类的方法,将结果RpcResult对象进行返回,返回HeaderExchangeHandler类中的handleRequest方法中。
返回received方法,将结果封装为Response,通过NettyChannel.send方法,最终执行NettyHandler类的writeRequested方法

猜你喜欢

转载自287746074.iteye.com/blog/2421829