服务引用调用过程
上图是服务消费的主过程:
首先ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例(如上图中的红色部分),这是服务消费的关键。接下来把Invoker通过ProxyFactory代理工厂转换为客户端需要的接口(如:HelloWorld)。
案例介绍
先看一个简单的客户端引用服务的例子,还是之前HelloService,dubbo配置如下:
<dubbo:application name="consumer-of-helloService" />
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
<dubbo:reference id="helloService" interface="com.demo.dubbo.service.HelloService" />
- 使用zookeeper作为注册中心
- 引用远程的HelloService接口服务
根据之前的介绍,在Spring启动的时候,根据dubbo:reference配置会创建一个ReferenceBean,该bean又实现了Spring的FactoryBean接口,所以我们如下方式使用时:
@Autowired
private HelloService helloService;
使用的不是ReferenceBean对象,而是ReferenceBean的getObject()方法返回的对象,该对象通过代理实现了HelloService接口,所以要看服务引用的整个过程就需要从ReferenceBean.getObject()方法开始入手。
服务引用过程
将ReferenceConfig.init()中的内容拆成具体的步骤,如下
第一步:收集配置参数
methods=hello,
timestamp=1443695417847,
dubbo=2.5.3
application=consumer-of-helloService
side=consumer
pid=7748
interface=com.demo.dubbo.service.HelloService
第二步:从注册中心获取服务地址,返回Invoker对象
如果是单个注册中心,代码如下:
Protocol refprotocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
invoker =