准备
首先为了分析服务引用的过程, 需要在源码中修改注册中心的地址如下:
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对象。
总结
通过流程图将关键节点描述如下: