之前讲解了Dubbo服务的发布,下面我们来看看如何进行服务的引用。
在Spring启动的时候,根据dubbo:reference配置会创建一个ReferenceBean。ReferenceBean继承了ReferenceConfig,重点是看init()方法,前面做了很多工作收集配置参数,然后根据参数信息创建代理
|
|
|
|
获取invoker有3种情况,一种是指定url,做点对点;一种是本地暴露;还有一种是注册中心url。
|
|
无论是引用本地暴露还是远程暴露的url,都调用refprotocol.refer(),追踪发现refprotocol.refer() 先后经过修饰类 ProtocolFilterWrapper、ProtocolListenerWrapper 最后执行RegistryProtocol。
|
|
上面这段代码重点是消费方的注册和订阅动作
|
|
注册动作,其实调用的是FailbackRegistry的register()方法,和服务发布的注册调用同一个方法。
订阅动作,其实调用的是FailbackRegistry的subscribe()方法,和服务发布的注册调用同一个方法,不同是它订阅providers,routers,configurators。
最后最为重要的是创建代理,传入的参数是cluster.join(directory)返回的invoker,实现在StubProxyFactoryWrapper中。
|
|
这个代理生成之后,在消费者消费某个服务时候,就进入InvokerInvocationHandler的逻辑,参考这篇文章,这样消费者和提供者之间就架起了桥梁。