Dubbo服务引用流程
服务引用
-
前置工作还是先解析Dubbo标签;具体的解析过程可以参考另一偏博客,“Dubbo文件解析与暴露服务的过程” 其中将Dubbo的Reference标签解析为ReferenceBean;
-
ReferenceBean实现了FactoryBean接口,所以在引用流程中会调用这个工厂Bean的方法getObject(),这个方法中会 return get();
-
接下来就进入到ReferenceConfig中的get()中;首先判断如果ref (这个ref是一个Invoker代理对象)为空的话,就执行初始化init()方法;
-
init()方法中经过一系列检查属性设置属性之后就会执行一个
ref = createProxy(map);
的代码,就是创建一个代理,这个参数map里封装的就一些注册中心地址、调用方法、调用的接口等等信息;将这些信息给这个创建的代理; -
这个创建代理的过程中,也就是createProxy()这个方法中有这样一段代码:
refprotocol.refer(interfaceClass,urls.get(0));
大概的意思就是引用协议远程引用一个接口;而这段代码得到的结果就是一个invoker; -
refprotocol是一个Protocol对象, 所以这就涉及到了DubboProtocol和RegistryProtocol,这个protocol对象去调用refer()方法时首先会进入到RegistryProtocol的refer()方法;
-
RegistryProtocol的 refer() 方法首先会根据注册中心信息得到一个Registry对象,这个对象会在 doRefer() 方法中作为参数;而这个refer()方法最终返回的就是 doRefer() 即就是
return doRefer()
; -
doRefer()方法做的就是在注册中心中 订阅服务/subscribe;之后会去提供者和消费者的注册表中进行注册:
ProviderConsumerRegTable.registerConsumer()
; -
于此同时会去到 DubboProtocol() 中执行 refer() 方法;首先得到一个DubboInvoker对象invoker;
得到这个invoker对象的内部其实就是连接或者 获取客户端,并将最终信息都封装在invoker对象中;DubboProtocol()的 refer() 最终return invoker;
-
两个Protocol的refer()中得到的Invoker对象会一层一层的往上返回,返回到上述第五步createProxy()中的
refprotocol.refer(interfaceClass,urls.get(0));
然后createProxy()将代理对象创建出来 也就是哪个 ref ,然后 init()的工作就完成了,然后get()方法就会将这个ref 也就是 Invoker代理对象返回给getObject()方法;
至此引用就完成了;