Dubbo消费者调用流程分析
消费者在发起一次调用的时候时序图如下
- 由于Dubbo调用是基于动态代理的方式,所以请求先进入 InvokerInvocationHandler#invoke()方法,进而调用到MockClusterInvoker#invoke()方法。
- MockClusterInvoker#invoke()中判断是否需要开启 Mock,如果开启 Mock 调用 doMockInvoke 执行,否则执行正常流程即调用MockClusterInvoker中包装的集群容错Invoker实例的invoke方法,默认的容错是FailoverClusterInvoker#invoke()。
- FailoverClusterInvoker#invoke会调用Directory组件实例(默认RegistryDirectory)来从注册中心获取支持本次调用的服务提供者列表。Directory 内部获取到所有服务提供者会通过 Router#route 来剔除不符合路由规则的服务提供者,随后将剩余的服务提供者返回给 FailoverClusterInvoker。
- FailoverClusterInvoker#invoke拿到服务提供者可用列表后初始化LoadBalance实例(默认是RandomLoadBalance)
- FailoverClusterInvoker把Directory返回的服务提供者列表和负载均衡策略实例后,调用自身的doInvoke() 方法,基于容错策略使用负载均衡策略从可用服务列表中选择一个提供者为本次调用提供服务。
- 执行调用前的一系列Filter链的invoke() 方法
- 进入本次调用服务实例DubboInvoker#invoke() 方法