Dubbo服务引用源码分析
duubo消费者初始化流程源码分析—
spring启动的时候利用dubbo的标签解析器将
标签解析为(“name:”baseEsOperationService””,”class”:”com.alibaba.dubbo.config.spring.RefrenceBean”…)
RefrenceBean该class结果如下:
继承于spring的工厂bean类FactoryBean
所以一般的@Autowried(通过类的class注入)是无法引入dubbo的service的,因为他经过spring的解析后,被定义为类的type为refrenceBean.class,需要通过@Resource(通过bean的名称引入)
在springboot启动的时候,会在afterProperties()方法中设置dubbo中该interface对应的配置。引入该dubboservice时,会调用refrenceBean的getObject()方法,进入方法内部进入到RefrenceConfig的init()方法:
首先会对该类的一些dubbo配置做校验等等一些代码,以及后面需要构造消费者的RegistryUrl的一些参数统一放在一个map中,这里不做说明了。进入到createProxy()方法:
第一个方法是加载注册中心url配置。
第二个方法是如果注册中心或者直接配置的服务提供者数量为1,则直接引入服务
在这个下面的else方法
主要是如果像下图这种情况
如果该service配置了多个注册中心,则需要将每个注册中心下服务提供者列表invokers合并。下面会讲
进入到refer方法,这里一般都是选择的registryProtocol
进入doRefer()方法
*directory.subscribe(…)这个方法最终会进入zookeeperRegistry的doSubscribe()方法
*在这个方法里就会进行消费者的注册,还有获取提供者列表,watch该接口树节点的变动,根据提供者的ip列表,构建<methodName,List
上面的directory.doSubscribe()方法会将<methodName,List
cluster.join(directory)就派上用场
Invoker invoker = cluster.join(directory):
一个注册中心可能有多个服务提供者,因此这里需要将多个服务提供者合并为一个MockClusterWrapper(FailoverCluster)(详情见另一篇)
将该注册中心中的所有服务提供者invoker合并为一个(directory包含一个Map<String,List<Invoker
最后会调用这个方法
这里面就有相关的降级,重试和负载均衡机制!
实际请求调用的时候是调用的failoverCluster(重试和负载均衡的逻辑),在这之前会调用mockClusterInvoker(dubbo的mock机制,是否降级机制),其是现在mockClusterWrapper类中,也是根据wrapper的代理实现的。(dubbo的spi机制,getExtension()方法中实现的,感兴趣的百度把。)
这里面就有相关的降级,重试和负载均衡机制!
dubbo自身是支持mock服务的,在reference标签里,有一个参数mock,该参数有四个值,false,default,true,或者Mock类的类名。分别代表如下含义:
false,不调用mock服务。
true,当服务调用失败时,使用mock服务。
default,当服务调用失败时,使用mock服务。
force,强制使用Mock服务(不管服务能否调用成功)。(使用xml配置不生效,使用ReferenceConfigAPI可以生效)
使用方法:
将mock参数启用,在dubbo:reference中添加参数项mock=true。
最后会使用jdk动态代理生成一个动态代理类来调用Invoker.invoke()
最后会使用jdk动态代理生成一个动态代理类来调用invoker.invoke()