用过Dubbo的同学,可能都知道Dubbo是支持Spring的,dubbo扩展了Spring的xml描述,同时可以通过注解的方式来注入。那么小编提出几个问题,如果你都知道,那么就不用看下文了,如果不知道,我们一起来讨论讨论。(本篇比较杂,知识点比较多,知识点很深,但是讲的不深,大神勿喷,一起交流学习)

FactoryBean是干什么用的?Spring是如何从远程获取到服务并生成本地代理的?

FactoryBean是干什么用的?

首先回答第一个问题,有同学看到第一个问题,会想到BeanFactory是不是和FactoryBean一样的,其实完全不一样,BeanFactory是负责生成任何类型Bean的工厂. 而FactoryBean则是具体生成某一个Bean的工厂。可以看到他是一个带有泛型的类,当通过BeanFactory去获取Bean的时候(假如Bean叫A),那么会首先去找IOC容器中看是否有带这个泛型A的FactoryBean,如果有那么就直接调用FactoryBean中的getObject()接口,就直接返回。

这个知识点,小编之前就讲说过了,就不细说了,还不懂的同学,可以看看往期的文章。

Spring是如何从远程获取到服务并生成本地代理的?

这个问题是比较复杂的,不过小编在此将流程给大家说一下,具体代码,后面小编有时间在发。

其实就是利用FactoryBean去实现的。

我们以配置文件为例子。

我们知道原生Spring是不带dubbo标签的,标签是Dubbo扩展的。我们可以看这个类。顺便提一下所有用户扩展的标签都要继承Spring中NamespaceHandlerSupport类并实现init方法

如果找到reference就把这个配置解析成ReferenceBean。而他就继承FactoryBean,当调用getObject方法,就到zookeeper中心去查找生产者的服务器地址。最终生成Invoker对象

我们看下他的调用流程图。

Invoker是比较复杂的,这里不详细介绍,就大概描述下。Invoker其实就是封装了Netty请求,而生成的代理类,就是对Invoker的调用,如下图

我们再来看看Invoker对象,Dubbo的Invoker对象比较复杂,这里小编以自己写的RPC框架爱Dubboz中的Invoker来说明。(可以看到执行体中就是通过Netty发送请求参数等待远程服务响应)

大概流程就是这样,Dubbo的核心就是这些,不过涉及的知识点更多,包括负载均衡(算法),服务发现(zookeeper),失败转移(fail策略),超时控制,监控中心等等,后面也都会逐步分析。

查看原文 >>
相关文章