Dubbo源码分析(八)------Directory抽象的分析

695 阅读2分钟

Dubbo版本2.7.3.Release版本 Dubbo处理Cluster调用流程,第一步是走的Directory这一层.今天就讲的就是这个实现.

Directory是Invoker的抽象,首先看下Directory的类的继承图,子类是StaticDirectory和RegistryDirectory.一个静态和动态的的实现.StaticDirectory是作用于静态的Invoker,
RegistryDirectory是对于实现的是将注册中心服务发现的提供者的URl转换成Invoker的
RegistryDirectory的doRefer方法,主要是用Cluster的join方法将RegistryDirectory转换成Invoker对象,这里默认是FailoverClusterInvoker对象.也就是默认是实现FailOver的集群容错(这个上一篇中分析过).

ReferenceBean中createProxy中部分,如果是多注册中心,则取最后一个注册中作为注册的URL, URL设置ClusterKey为RegistryAwareCluster,接着Cluster的适配类会创建RegistryAwareCluster类,调用join方法传入构造StaticDirectory,并传入URL和Protocol.refery引用的Invoker,注意:其实这里Invoker就是RegistryDirectory的doRefer返回Invoker,其实际类型是FailoverClusterInvoker),
ClusterKey为RegistryAwareCluster类的join方法实现就是直接返回了RegistryAwareClusterInvoker并传入Directory抽象,从上一个图可以看出这个地方是传入是StaticDirectory这个类,传入注册中心的URL和协议引用后的Invoker(真实对象是FailoverClusterInvoker),
AbstractClusterInvoker是invoke方法通过Directory的list方法,
这里实际StaticDirectory的list方法,主要是执行RouterChain路由的拦截器链的route方法执行路由的拦截理链得到过滤后Invoker.
RegistryAwareClusterInvoker的doInvoke方法,如果服务可用并且URL含有default的key则直接调用默认的,如果没有defaultKey则判断Invokers中第一个可用的则调用invoke返回,其实 这其中的隐含的包转关系:RegistryAwareClusterInvoker---->FailoverClusterInvoker--->Invoker,这就是实际的调用关系.

总结、 今天主要是对于Dubbo中Directory作为Cluster转换Invoker的过程分析,下一节主要对RouteChain着重进行分析.