准备
首先为了分析服务引用的过程, 需要在源码中修改注册中心的地址如下:
dubbo-demo项目的dubbo-demo-consumer/src/test/resources/dubbo.properties
| 1 | #dubbo.registry.address=multicast://224.5.6.7:1234 | 
dubbo-demo项目的dubbo-demo-consumer/src/main/resources/META-INF/spring/dubbo-demo-consumer.xml
| 1 | <!-- 使用multicast广播注册中心暴露发现服务地址 --> | 
使用两个Idea,分别运行producer和consumer。其中consumer用来断点跟踪。
消费者代码入口代码为:
| 1 | public class DemoConsumer { | 
根据dubbo-demo-consumer.xml
| 1 | <!-- 生成远程服务代理,可以和本地bean一样使用demoService --> | 
reference标签定义的名称空间代码:
| 1 | public class DubboNamespaceHandler extends NamespaceHandlerSupport { | 
可以看到具体实现为ReferenceBean.java
| 1 | public class ReferenceBean<T> extends ReferenceConfig<T> implements FactoryBean, ApplicationContextAware, InitializingBean, DisposableBean { | 
ReferenceBean继承自ReferenceConfig,同时实现了InitializingBean。
| 1 | public interface InitializingBean { | 
那么Spring初始化会调用到ReferenceBean类的afterPropertiesSet(),在该方法中调用getObject():
| 1 | public Object getObject() throws Exception { | 
接着调用到ReferenceConfig:
| 1 | public synchronized T get() { | 
Dubbo的引用流程:
| 1 | ReferenceBean.getObject() | 
服务引用的代码中,对于连接注册与订阅zk的流程和服务发布是一致的。
| 1 | public class DemoAction { | 
Spring框架最终将invoker转换为demoService对象。
总结
通过流程图将关键节点描述如下: