Dubbo源码五:全网最细的Dubbo服务调用【provider端】

入口

image.png
这里的handler是NettyServer,调用receive方法,最终会调用到它的父类AbstractPeer.received

AbstractPeer.received

image.png
这里的handler是MultiMessageHandler,会交给它处理

MultiMessageHandler.received

image.png
判断接收到的数据是否是MultiMessage,如果是则获取MultiMessage中的单个Message,传递给HeartbeatHandler进行处理

HeartbeatHandler.received

判断是不是心跳消息,如果是不是则把Message传递给AllChannelHandler
image.png

AllChannelHandler.received

把接收到的Message封装为一个ChannelEventRunnable对象,扔给线程池进行处理
image.png

ChannelEventRunnable.run

image.png
在ChannelEventRunnable的run方法中会调用DecodeHandler处理Message

DecodeHandler.received

image.png
按Dubbo协议的数据格式,解析当前请求的path,versio,方法,方法参数等等,然后把解析好了的请求交给HeaderExchangeHandler

HeaderExchangeHandler.received

image.png

HeaderExchangeHandler.handleRequest

image.png

  1. 首先构造一个Response对象,
  2. 然后调用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

image.png

getInvoker:

image.png
从本机已经导出的Exporter中根据当前Request所对应的服务key,去寻找Exporter对象,从Exporter中得到Invoker,然后执行invoke方法,此Invoker为ProtocolFilterWrapper$InvokerDelegate
image.png

invoker.invoke(inv)

这里的Invoker又是老朋友:ProtocolFilterWrapper,** 后面又是各种Filter操作了**
image.png

  1. EchoFilter.invoke:判断当前请求是不是一个回升测试,如果是,则不继续执行过滤器链了(服务实现者Invoker也不会调用了)

image.png

  1. ClassLoaderFilter:设置当前线程的classloader为当前要执行的服务接口所对应的classloader

image.png

  1. GenericFilter:把泛化调用发送过来的信息包装为RpcInvocation对象

image.png

  1. ContextFilter:设置RpcContext.getContext()的参数

image.png

  1. TraceFilter:先执行下一个invoker的invoke方法,调用成功后录调用信息

image.png

  1. TimeoutFilter:调用时没有特别处理,只是记录了一下当前时间,当整个filter链都执行完了之后回调TimeoutFilter的onResponse方法时,会判断本次调用是否超过了timeout

image.png

  1. MonitorFilter:记录当前服务的执行次数

image.png

  1. ExceptionFilter:调用时没有特别处理,在回调onResponse方法时,对不同的异常进行处理,详解Dubbo的异常处理

image.png

  1. 在调用链执行完之后,会最终调用到AbstractProxyInvoker.invoke,这个invoker就是在服务导出时,根据服务接口,服务实现类对象生成的,它的invoke方法就会执行服务实现类对象的方法,得到结果

image.png

总结:

最后把消费者和提供者放在一起看:
在这里插入图片描述

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值