dubbo系列之集群容错-directory目录
简介
Directory接口
目录服务
StaticDirectory:静态目录服务,他的Invoker是固定的。
RegistryDirectory:注册目录服务,他的Invoker集合数据来源于zk注册中心的。
StaticDirectory用的比较少,主要用在服务对多注册中心的引用,这篇博客我们重点就是来说一下RegistryDirectory。
源码构成
哒哒哒,老样子,先启动zk,再启动DemoProvider类服务端,最后debug模式启动DemoCousumer类。
demoService.sayHello(“world” + i)
–>InvokerInvocationHandler.invoke
1 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { |
MockClusterInvoker.invoke //1.进入集群
–>invoker.invoke(invocation)
-->AbstractClusterInvoker.invoke
-->list(invocation)
–>directory.list//2.进入目录查找 从this.methodInvokerMap里面查找一个Invoker
–>AbstractDirectory.list
–>doList(invocation)
–>RegistryDirectory.doList// 从this.methodInvokerMap里面查找一个Invoker
这样就进入了主角RegistryDirectory类。
RegistryDirectory类
先来看一张这个类的继承体系图
可以看到RegistryDirectory类实现了NotifyListener接口,并且实现回调notify(List
dolist()
1 | public List<Invoker<T>> doList(Invocation invocation) { |
dolist()这个方法就是从methodInvokerMap这个map里面获取数据
那methodInvokerMap这个map读是在dolist()里面做的,那又是什么时候将数据写进去的呢?是不是觉得这个话题很熟悉?在dubbo系列之服务引用-原理这篇博客里面我们有提到,在服务引用的订阅节点时,我们有进入到过RegistryDirectory.notify中的refreshInvoker这个方法,也就是在注册中心有变更的情况下,就会调用RegistryDirectory.notify 的refreshInvoker
1 | /** |
也就是在refreshInvoker方法中,刷新methodInvokerMap对象。