入口
这里的handler是NettyServer,调用receive方法,最终会调用到它的父类AbstractPeer.received
AbstractPeer.received
这里的handler是MultiMessageHandler,会交给它处理
MultiMessageHandler.received
判断接收到的数据是否是MultiMessage,如果是则获取MultiMessage中的单个Message,传递给HeartbeatHandler进行处理
HeartbeatHandler.received
判断是不是心跳消息,如果是不是则把Message传递给AllChannelHandler
AllChannelHandler.received
把接收到的Message封装为一个ChannelEventRunnable对象,扔给线程池进行处理
ChannelEventRunnable.run
在ChannelEventRunnable的run方法中会调用DecodeHandler处理Message
DecodeHandler.received
按Dubbo协议的数据格式,解析当前请求的path,versio,方法,方法参数等等,然后把解析好了的请求交给HeaderExchangeHandler
HeaderExchangeHandler.received
HeaderExchangeHandler.handleRequest
- 首先构造一个Response对象,
- 然后调用DubboProtocol
r
e
q
u
e
s
t
H
a
n
d
l
e
r
(
D
u
b
b
o
P
r
o
t
o
c
a
l
的内部类
)
,得到一个
C
o
m
p
l
e
t
i
o
n
S
t
a
g
e
f
u
t
u
r
e
,然后给
f
u
t
u
r
e
通过
w
h
e
n
C
o
m
p
l
e
t
e
绑定一个回调函数,当
f
u
t
u
r
e
执行完了之后,就可以从回调函数中得到
D
u
b
b
o
P
r
o
t
o
c
o
l
requestHandler(DubboProtocal的内部类),得到一个CompletionStage future,然后给future通过whenComplete绑定一个回调函数,当future执行完了之后,就可以从回调函数中得到DubboProtocol
requestHandler(DubboProtocal的内部类),得到一个CompletionStagefuture,然后给future通过whenComplete绑定一个回调函数,当future执行完了之后,就可以从回调函数中得到DubboProtocolrequestHandler的执行结果,并把执行结果设置给Response对象,通过channel发送出去。
DubboProtocol$requestHandler
getInvoker:
从本机已经导出的Exporter中根据当前Request所对应的服务key,去寻找Exporter对象,从Exporter中得到Invoker,然后执行invoke方法,此Invoker为ProtocolFilterWrapper$InvokerDelegate
invoker.invoke(inv)
这里的Invoker又是老朋友:ProtocolFilterWrapper,** 后面又是各种Filter操作了**
- EchoFilter.invoke:判断当前请求是不是一个回升测试,如果是,则不继续执行过滤器链了(服务实现者Invoker也不会调用了)
- ClassLoaderFilter:设置当前线程的classloader为当前要执行的服务接口所对应的classloader
- GenericFilter:把泛化调用发送过来的信息包装为RpcInvocation对象
- ContextFilter:设置RpcContext.getContext()的参数
- TraceFilter:先执行下一个invoker的invoke方法,调用成功后录调用信息
- TimeoutFilter:调用时没有特别处理,只是记录了一下当前时间,当整个filter链都执行完了之后回调TimeoutFilter的onResponse方法时,会判断本次调用是否超过了timeout
- MonitorFilter:记录当前服务的执行次数
- ExceptionFilter:调用时没有特别处理,在回调onResponse方法时,对不同的异常进行处理,详解Dubbo的异常处理
- 在调用链执行完之后,会最终调用到AbstractProxyInvoker.invoke,这个invoker就是在服务导出时,根据服务接口,服务实现类对象生成的,它的invoke方法就会执行服务实现类对象的方法,得到结果
总结:
最后把消费者和提供者放在一起看: