溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java中dubbo的spi 思想是什么

發(fā)布時(shí)間:2021-06-23 10:31:22 來源:億速云 閱讀:163 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“java中dubbo的spi 思想是什么”,在日常操作中,相信很多人在java中dubbo的spi 思想是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”java中dubbo的spi 思想是什么”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

面試題

dubbo 的 spi 思想是什么?

面試官心理分析

繼續(xù)深入問唄,前面一些基礎(chǔ)性的東西問完了,確定你應(yīng)該都 ok,了解 dubbo 的一些基本東西,那么問個(gè)稍微難一點(diǎn)點(diǎn)的問題,就是 spi,先問問你 spi 是啥?然后問問你 dubbo 的 spi 是怎么實(shí)現(xiàn)的?

其實(shí)就是看看你對(duì) dubbo 的掌握如何。

面試題剖析

spi 是啥?

spi,簡單來說,就是 service provider interface,說白了是什么意思呢,比如你有個(gè)接口,現(xiàn)在這個(gè)接口有 3 個(gè)實(shí)現(xiàn)類,那么在系統(tǒng)運(yùn)行的時(shí)候?qū)@個(gè)接口到底選擇哪個(gè)實(shí)現(xiàn)類呢?這就需要 spi 了,需要根據(jù)指定的配置或者是默認(rèn)的配置,去找到對(duì)應(yīng)的實(shí)現(xiàn)類加載進(jìn)來,然后用這個(gè)實(shí)現(xiàn)類的實(shí)例對(duì)象。

舉個(gè)栗子。

你有一個(gè)接口 A。A1/A2/A3 分別是接口A的不同實(shí)現(xiàn)。你通過配置 接口 A = 實(shí)現(xiàn) A2,那么在系統(tǒng)實(shí)際運(yùn)行的時(shí)候,會(huì)加載你的配置,用實(shí)現(xiàn) A2 實(shí)例化一個(gè)對(duì)象來提供服務(wù)。

spi 機(jī)制一般用在哪兒?插件擴(kuò)展的場(chǎng)景,比如說你開發(fā)了一個(gè)給別人使用的開源框架,如果你想讓別人自己寫個(gè)插件,插到你的開源框架里面,從而擴(kuò)展某個(gè)功能,這個(gè)時(shí)候 spi 思想就用上了。

Java spi 思想的體現(xiàn)

spi 經(jīng)典的思想體現(xiàn),大家平時(shí)都在用,比如說 jdbc。

Java 定義了一套 jdbc 的接口,但是 Java 并沒有提供 jdbc 的實(shí)現(xiàn)類。

但是實(shí)際上項(xiàng)目跑的時(shí)候,要使用 jdbc 接口的哪些實(shí)現(xiàn)類呢?一般來說,我們要根據(jù)自己使用的數(shù)據(jù)庫,比如 mysql,你就將 mysql-jdbc-connector.jar 引入進(jìn)來;oracle,你就將 oracle-jdbc-connector.jar 引入進(jìn)來。

在系統(tǒng)跑的時(shí)候,碰到你使用 jdbc 的接口,他會(huì)在底層使用你引入的那個(gè) jar 中提供的實(shí)現(xiàn)類。

dubbo 的 spi 思想

dubbo 也用了 spi 思想,不過沒有用 jdk 的 spi 機(jī)制,是自己實(shí)現(xiàn)的一套 spi 機(jī)制。

Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();

Protocol 接口,在系統(tǒng)運(yùn)行的時(shí)候,,dubbo 會(huì)判斷一下應(yīng)該選用這個(gè) Protocol 接口的哪個(gè)實(shí)現(xiàn)類來實(shí)例化對(duì)象來使用。

它會(huì)去找一個(gè)你配置的 Protocol,將你配置的 Protocol 實(shí)現(xiàn)類,加載到 jvm 中來,然后實(shí)例化對(duì)象,就用你的那個(gè) Protocol 實(shí)現(xiàn)類就可以了。

上面那行代碼就是 dubbo 里大量使用的,就是對(duì)很多組件,都是保留一個(gè)接口和多個(gè)實(shí)現(xiàn),然后在系統(tǒng)運(yùn)行的時(shí)候動(dòng)態(tài)根據(jù)配置去找到對(duì)應(yīng)的實(shí)現(xiàn)類。如果你沒配置,那就走默認(rèn)的實(shí)現(xiàn)好了,沒問題。

@SPI("dubbo")  
public interface Protocol {  
      
    int getDefaultPort();  
  
    @Adaptive  
    <T> Exporter<T> export(Invoker<T> invoker) throws RpcException;  
  
    @Adaptive  
    <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException;  

    void destroy();  
  
}

在 dubbo 自己的 jar 里,在/META_INF/dubbo/internal/com.alibaba.dubbo.rpc.Protocol文件中:

dubbo=com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol
http=com.alibaba.dubbo.rpc.protocol.http.HttpProtocol
hessian=com.alibaba.dubbo.rpc.protocol.hessian.HessianProtocol

所以說,這就看到了 dubbo 的 spi 機(jī)制默認(rèn)是怎么玩兒的了,其實(shí)就是 Protocol 接口,@SPI("dubbo") 說的是,通過 SPI 機(jī)制來提供實(shí)現(xiàn)類,實(shí)現(xiàn)類是通過 dubbo 作為默認(rèn) key 去配置文件里找到的,配置文件名稱與接口全限定名一樣的,通過 dubbo 作為 key 可以找到默認(rèn)的實(shí)現(xiàn)類就是 com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol

如果想要?jiǎng)討B(tài)替換掉默認(rèn)的實(shí)現(xiàn)類,需要使用 @Adaptive 接口,Protocol 接口中,有兩個(gè)方法加了 @Adaptive 注解,就是說那倆接口會(huì)被代理實(shí)現(xiàn)。

啥意思呢?

比如這個(gè) Protocol 接口搞了倆 @Adaptive 注解標(biāo)注了方法,在運(yùn)行的時(shí)候會(huì)針對(duì) Protocol 生成代理類,這個(gè)代理類的那倆方法里面會(huì)有代理代碼,代理代碼會(huì)在運(yùn)行的時(shí)候動(dòng)態(tài)根據(jù) url 中的 protocol 來獲取那個(gè) key,默認(rèn)是 dubbo,你也可以自己指定,你如果指定了別的 key,那么就會(huì)獲取別的實(shí)現(xiàn)類的實(shí)例了。

如何自己擴(kuò)展 dubbo 中的組件

下面來說說怎么來自己擴(kuò)展 dubbo 中的組件。

自己寫個(gè)工程,要是那種可以打成 jar 包的,里面的 src/main/resources 目錄下,搞一個(gè) META-INF/services,里面放個(gè)文件叫:com.alibaba.dubbo.rpc.Protocol,文件里搞一個(gè)my=com.bingo.MyProtocol。自己把 jar 弄到 nexus 私服里去。

然后自己搞一個(gè) dubbo provider 工程,在這個(gè)工程里面依賴你自己搞的那個(gè) jar,然后在 spring 配置文件里給個(gè)配置:

<dubbo:protocol name=”my” port=”20000” />

provider 啟動(dòng)的時(shí)候,就會(huì)加載到我們 jar 包里的my=com.bingo.MyProtocol 這行配置里,接著會(huì)根據(jù)你的配置使用你定義好的 MyProtocol 了,這個(gè)就是簡單說明一下,你通過上述方式,可以替換掉大量的 dubbo 內(nèi)部的組件,就是扔個(gè)你自己的 jar 包,然后配置一下即可。

到此,關(guān)于“java中dubbo的spi 思想是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI