用過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策略),超時控制,監控中心等等,後面也都會逐步分析。

查看原文 >>
相關文章