在之前说了一下dubbo的服务发布过程,其实严格意义上只说了一半吧,只把dubbo如何经过ProxyFactory的代理成一个Invoker,等待客户端调用的过程讲了一遍,而重要的Protocol.export方法略过去了,今天我将连带dubbo的comsumer客户端服务引用和Protocol机制来讲一讲。
dubbo服务引用
和上一篇文章一样,先来个demo
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="ifenqu-web" />
<dubbo:registry protocol="zookeeper" address="${dubbo.address}" />
<dubbo:protocol name="dubbo" port="${dubbo.port}"/>
<dubbo:consumer timeout="60000" check="false"/>
<dubbo:service interface="com.xxx.xxx.xxxService" ref="xxxService" timeout="5000"/>
</beans>
在上篇文章我们已经说了,对于service暴露方也就是provider方有对应的ServiceConfig,相应的Reference引用方也就是Consumer有对应的ReferenceConfig。ReferenceConfig中定义了每一个接口参数定义,这只是部分,还有一大堆参数在父类里就不列出来了。
// 接口类型
private String interfaceName;
private Class<?> interfaceClass;
// 客户端类型
private String client;
// 点对点直连服务提供地址
private String url;
// 方法配置
private List<MethodConfig> methods;//接口所有的方法配置
// 缺省配置
private ConsumerConfig consumer;//该参数对应的就是<dubbo:consumer timeout="60000" check="false"/>
private String protocol;//如果为空默认dubbo
参数设值分两步,第一步是对象创建的时候,第二步是调用了get方法后执行init()方法。这个get方法就是服务引用的入口:
public synchronized T get() {
if (destroyed){
throw new IllegalStateException("Already destroyed!");
}
//服务实例已经存在就直接返回,没有就进行初始化
if (ref == null) {
init();
}
return ref;
}
init()方法主要分为两个步骤,第一步:收集上下文,第二步:根据上下文创建服务实例
ref = createProxy(map);