Dubbo调用过程

服务消费方发起请求

demoService实例其实是代理工厂生产的代理对象(大家可以参考代理那部分生成的伪代码),在代码中调用demoService.sayHello(“world!”)时,

1.    将方法名方法参数传入InvokerInvocationHandler的invoke方法中,对于Object中的方法toString, hashCode, equals直接调用invoker的对应方法(远程调用层是以Invocation, Result为中心, 这里根据要调用的方法以及传入的参数构建RpcInvocation对象,作为Invoker的入参)。

2.    然后进入MockClusterInvoker.invoke()方法中,MockClusterInvoker根据参数提供了三种调用策略:

    (1)不需要mock, 直接调用FailoverClusterInvoker

    (2)强制mock,调用mock

    (3)先调FailoverClusterInvoker,调用失败在mock

3.    FailoverClusterInvoker默认调用策略

    (1)通过目录服务查找到所有订阅的服务提供者的Invoker对象

    (2)路由服务根据策略(比如:容错策略)来过滤选择调用的Invokers

    (3)通过负载均衡策略LoadBalance来选择一个Invoker

4.    执行选择的Invoker.inoker(invocation)

    (1)经过监听器链,默认没有

    (2)经过过滤器链,内置实现了很多

    (3)执行到远程调用的DubboInvoker

5.    DubboInvoker

    (1)根据url 也就是根据服务提供者的长连接,这里封装成交互层对象ExchangeClient供这里调用

    (2)判断远程调用类型同步,异步还是oneway模式

    (3)ExchangeClient发起远程调用,底层remoting不在这里描述了


    获取调用结果:

    (1)Oneway返回空RpcResult

    (2)异步,直接返回空RpcResult, ResponseFuture回调

    (3)同步, ResponseFuture模式同步转异步,等待响应返回

    


服务提供方接收调用请求

同样我们也是rpc调用层DubboProtocol层开始分析,对于通信层remoting的数据接收反序列等等过程不做分析。

DubboProtocol的requestHandler是ExchangeHandler的实现,是remoting层接收数据后的回调。

requestHandler.replay方法接收请求消息,这里只处理远程调用消息Invocation。

其中,DecodeableRpcInvocation.decode()方法实现反序列化解析(传输过程中服务消费方先encode,所以这里需要decode)。


1.    通过Invocation获取服务名和端口组成serviceKey=com.alibaba.dubbo.demo.DemoService:20880, 从DubboProtocol的exproterMap中获取暴露服务的DubboExporter, 在从dubboExporter 获取invoker返回。

2.    经过过滤器链。

3.    经过监听器链。

4.    到达执行真正调用的invoker, 这个invoker由代理工厂ProxyFactory.getInvoker(demoService, DemoService.class, registryUrl)创建,具体请看代理那部分介绍。


调用demoService实例方法,将结果封装成RpcResult返回。

5.    交换层构建Response,通过Remoting层编码传输将结果响应给调用方。



服务消费方发起远程调用的底层通信



服务提供方接收请求并响应的底层通信



本文为参考网上资料整理,是为了以后学习用,请勿喷。



猜你喜欢

转载自blog.csdn.net/IT_Lynn/article/details/80055467