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