欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Dubbo擴(kuò)展點(diǎn)SPI實(shí)踐示例解析

 更新時(shí)間:2022年10月19日 16:16:22   作者:UniJoy  
這篇文章主要為大家介紹了Dubbo擴(kuò)展點(diǎn)SPI實(shí)踐示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

Dubbo的擴(kuò)展點(diǎn)加載從JDK標(biāo)準(zhǔn)的SPI(Service Provider Interface)擴(kuò)展點(diǎn)發(fā)現(xiàn)機(jī)制加強(qiáng)而來(lái)。Dubbo改進(jìn)了JDK標(biāo)準(zhǔn)的SPI的以下問(wèn)題:

  • JDK標(biāo)準(zhǔn)的SPI會(huì)一次性實(shí)例化擴(kuò)展點(diǎn)所有實(shí)現(xiàn),如果有擴(kuò)展實(shí)現(xiàn)初始化很耗時(shí),但如果沒(méi)用上也加載,會(huì)很浪費(fèi)資源。如果擴(kuò)展點(diǎn)加載失敗,連擴(kuò)展點(diǎn)的名稱都拿不到了。
  • Dubbo增加了對(duì)擴(kuò)展點(diǎn)IoC和AOP的支持,一個(gè)擴(kuò)展點(diǎn)可以直接setter注入其它擴(kuò)展點(diǎn)。 比如:Filter是Dubbo的集合類擴(kuò)展點(diǎn)的一種,還有其他如InvokerListener, ExportListener, TelnetHandler, StatusChecker等擴(kuò)展,這個(gè)有時(shí)間可以都看看(搜索Dubbo開(kāi)發(fā)者指南:SPI參考手冊(cè))

擴(kuò)展點(diǎn)配置:

src\
 |-main\
    |-java\
        |-com\
            |-xxx\
                |-XxxFilter.java (實(shí)現(xiàn)Filter接口)\
    |-resources\
        |-META-INF\
            |-dubbo\
                |-com.alibaba.dubbo.rpc.Filter (純文本文件,內(nèi)容為:xxx=com.xxx.XxxFilter)

擴(kuò)展實(shí)現(xiàn)類:

@Activate
public class AuthorityFilter implements Filter {
    private static Logger logger = LoggerFactory.getLogger(AuthorityFilter.class);
    List<String> ipWhiteList = AuthorityUtils.getAccessListByKey("1");
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        [logger.info](http://logger.info/)("########go into filtersuccess !!########");
        String clientIp = RpcContext.getContext().getRemoteHost();
        String host = IpParseUtils.getHostByIp(clientIp);
        if (ipWhiteList.contains(host))
Unknown macro: {            [logger.info](http://logger.info/)("########白名單校驗(yàn)通過(guò)!########");            return invoker.invoke(invocation);        }
else
Unknown macro: {            [logger.info](http://logger.info/)("########白名單校驗(yàn)未通過(guò)!########");            return new RpcResult();        }
    }
}

攔截配置文件:

在擴(kuò)展類的jar包內(nèi),放置擴(kuò)展點(diǎn)配置文件:META-INF/dubbo/接口全限定名,內(nèi)容為:配置名=擴(kuò)展實(shí)現(xiàn)類全限定名,多個(gè)實(shí)現(xiàn)類用換行符分隔。(注意:這里的配置文件是放在你自己的jar包內(nèi),不是dubbo本身的jar包內(nèi),Dubbo會(huì)全ClassPath掃描所有jar包內(nèi)同名的這個(gè)文件,然后進(jìn)行合并)

注意這個(gè)xxx=左側(cè)的名字跟你擴(kuò)展類同名哦(這是個(gè)坑兒,別問(wèn)我怎么知道的)!

AuthorityFilter=your.extend.dubbo.async.provider.AuthorityFilter

調(diào)用攔截?cái)U(kuò)展:

<dubbo:provider filter="AuthorityFilter"></dubbo:provider>

攔截?cái)U(kuò)展說(shuō)明:

服務(wù)提供方和服務(wù)消費(fèi)方調(diào)用過(guò)程攔截,Dubbo本身的大多功能均基于此擴(kuò)展點(diǎn)實(shí)現(xiàn),每次遠(yuǎn)程方法執(zhí)行,該攔截都會(huì)被執(zhí)行,請(qǐng)注意對(duì)性能的影響。\

常用約定:

  • 用戶自定義filter默認(rèn)在內(nèi)置filter之后。
  • 特殊值default,表示缺省擴(kuò)展點(diǎn)插入的位置。 比如:filter="xxx,default,yyy",表示xxx在缺省filter之前,yyy在缺省filter之后。\
  • 特殊符號(hào)-,表示剔除。
    比如:filter="-foo1",剔除添加缺省擴(kuò)展點(diǎn)foo1。
    比如:filter="-default",剔除添加所有缺省擴(kuò)展點(diǎn)。\
  • provider和service同時(shí)配置的filter時(shí),累加所有filter,而不是覆蓋。
    比如:<dubbo:provider filter="xxx,yyy"/>和<dubbo:service filter="aaa,bbb" />,則xxx,yyy,aaa,bbb均會(huì)生效。
    如果要覆蓋,需配置:<dubbo:service filter="-xxx,-yyy,aaa,bbb" />\

實(shí)現(xiàn)細(xì)節(jié):

  • 解析服務(wù)

基于dubbo.jar內(nèi)的META-INF/spring.handlers配置,Spring在遇到dubbo名稱空間時(shí),會(huì)回調(diào)DubboNamespaceHandler。

所有dubbo的標(biāo)簽,都統(tǒng)一用DubboBeanDefinitionParser進(jìn)行解析,基于一對(duì)一屬性映射,將XML標(biāo)簽解析為Bean對(duì)象。

在ServiceConfig.export()或ReferenceConfig.get()初始化時(shí),將Bean對(duì)象轉(zhuǎn)換URL格式,所有Bean屬性轉(zhuǎn)成URL的參數(shù)。

然后將URL傳給Protocol擴(kuò)展點(diǎn),基于擴(kuò)展點(diǎn)的Adaptive機(jī)制,根據(jù)URL的協(xié)議頭,進(jìn)行不同協(xié)議的服務(wù)暴露或引用。

  • 攔截服務(wù)

基于擴(kuò)展點(diǎn)的Wrapper機(jī)制,所有的Protocol擴(kuò)展點(diǎn)都會(huì)自動(dòng)套上Wrapper類。

基于ProtocolFilterWrapper類,將所有Filter組裝成鏈,在鏈的最后一節(jié)調(diào)用真實(shí)的引用。

基于ProtocolListenerWrapper類,將所有InvokerListener和ExporterListener組裝集合,在暴露和引用前后,進(jìn)行回調(diào)。

包括監(jiān)控在內(nèi),所有附加功能,全部通過(guò)Filter攔截實(shí)現(xiàn)。

還有暴露服務(wù)和引用服務(wù),個(gè)人覺(jué)得看這上面這兩個(gè)對(duì)寫(xiě)程序相對(duì)更有用些!

擴(kuò)展點(diǎn)的幾個(gè)特點(diǎn):

擴(kuò)展點(diǎn)自動(dòng)包裝

自動(dòng)Wrap擴(kuò)展點(diǎn)的Wrapper類

ExtensionLoader會(huì)把加載擴(kuò)展點(diǎn)時(shí)(通過(guò)擴(kuò)展點(diǎn)配置文件中內(nèi)容),如果該實(shí)現(xiàn)有拷貝構(gòu)造函數(shù),則判定為擴(kuò)展點(diǎn)Wrapper類。Wrapper類同樣實(shí)現(xiàn)了擴(kuò)展點(diǎn)接口。

擴(kuò)展點(diǎn)自動(dòng)裝配

加載擴(kuò)展點(diǎn)時(shí),自動(dòng)注入依賴的擴(kuò)展點(diǎn)

加載擴(kuò)展點(diǎn)時(shí),擴(kuò)展點(diǎn)實(shí)現(xiàn)類的成員如果為其它擴(kuò)展點(diǎn)類型,ExtensionLoader在會(huì)自動(dòng)注入依賴的擴(kuò)展點(diǎn)。

ExtensionLoader通過(guò)掃描擴(kuò)展點(diǎn)實(shí)現(xiàn)類的所有set方法來(lái)判定其成員。即ExtensionLoader會(huì)執(zhí)行擴(kuò)展點(diǎn)的拼裝操作。

ExtensionLoader加載CarMaker的擴(kuò)展點(diǎn)實(shí)現(xiàn)RaceCar時(shí),setWheelMaker方法的WheelMaker也是擴(kuò)展點(diǎn)則會(huì)注入WheelMaker的實(shí)現(xiàn)。

擴(kuò)展點(diǎn)自適應(yīng)

擴(kuò)展點(diǎn)的Adaptive實(shí)例
ExtensionLoader注入的依賴擴(kuò)展點(diǎn)是一個(gè)Adaptive實(shí)例,直到擴(kuò)展點(diǎn)方法執(zhí)行時(shí)才決定調(diào)用是一個(gè)擴(kuò)展點(diǎn)實(shí)現(xiàn)。

  • Dubbo使用URL對(duì)象(包含了Key-Value)傳遞配置信息

擴(kuò)展點(diǎn)方法調(diào)用會(huì)有URL參數(shù)(或是參數(shù)有URL成員)

這樣依賴的擴(kuò)展點(diǎn)也可以從URL拿到配置信息,所有的擴(kuò)展點(diǎn)自己定好配置的Key后,配置信息從URL上從最外層傳入。URL在配置傳遞上即是一條總線。

示例:有兩個(gè)為擴(kuò)展點(diǎn)CarMaker(造車(chē)者)、wheelMaker(造輪者)

擴(kuò)展點(diǎn)自動(dòng)激活

對(duì)于集合類擴(kuò)展點(diǎn),比如:Filter, InvokerListener, ExportListener, TelnetHandler, StatusChecker等,可以同時(shí)加載多個(gè)實(shí)現(xiàn),此時(shí),可以用自動(dòng)激活來(lái)簡(jiǎn)化配置,如:

import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.rpc.Filter;
@Activate // 無(wú)條件自動(dòng)激活
public class XxxFilter implements Filter {
    // ...
}

以上就是Dubbo擴(kuò)展點(diǎn)SPI實(shí)踐示例解析的詳細(xì)內(nèi)容,更多關(guān)于Dubbo擴(kuò)展點(diǎn)SPI實(shí)踐的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解決Spring boot整合mybatis,xml資源文件放置及路徑配置問(wèn)題

    解決Spring boot整合mybatis,xml資源文件放置及路徑配置問(wèn)題

    這篇文章主要介紹了解決Spring boot整合mybatis,xml資源文件放置及路徑配置問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Java8新特性之新日期時(shí)間庫(kù)的使用教程

    Java8新特性之新日期時(shí)間庫(kù)的使用教程

    這篇文章主要給大家介紹了關(guān)于Java8新特性之新日期時(shí)間庫(kù)使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • SpringBoot thymeleaf eclipse熱部署方案操作步驟

    SpringBoot thymeleaf eclipse熱部署方案操作步驟

    今天小編就為大家分享一篇關(guān)于SpringBoot thymeleaf eclipse熱部署方案操作步驟,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • IDEA中沒(méi)有Mapper.xml模板選項(xiàng)的處理方法

    IDEA中沒(méi)有Mapper.xml模板選項(xiàng)的處理方法

    這篇文章主要介紹了IDEA中沒(méi)有Mapper.xml模板選項(xiàng)的處理方法,需其實(shí)解決方法很簡(jiǎn)單,只需要在idea中導(dǎo)入模板即可,本文圖文的形式給大家分享解決方法,需要的朋友可以參考下
    2021-04-04
  • Java實(shí)現(xiàn)的Base64加密算法示例

    Java實(shí)現(xiàn)的Base64加密算法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的Base64加密算法,結(jié)合實(shí)例形式分析了Java實(shí)現(xiàn)的base64編碼轉(zhuǎn)換相關(guān)使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2018-04-04
  • 消息隊(duì)列 RabbitMQ 與 Spring 整合使用的實(shí)例代碼

    消息隊(duì)列 RabbitMQ 與 Spring 整合使用的實(shí)例代碼

    本篇文章主要介紹了消息隊(duì)列 RabbitMQ 與 Spring 整合使用的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • netty中的IO、NIO、AIO使用詳解

    netty中的IO、NIO、AIO使用詳解

    這篇文章主要介紹了netty中的IO、NIO、AIO使用詳解,本文會(huì)說(shuō)明各種IO的特點(diǎn)、分別解決了什么樣的問(wèn)題做一個(gè)分析闡述,并結(jié)合Java代碼例子來(lái)輔助理解,像這些的歷史演進(jìn)和詳細(xì)的底層原理網(wǎng)上很多,所以我們只站在應(yīng)用層,使用者的角度去分析,需要的朋友可以參考下
    2023-12-12
  • Mybatis-Plus分頁(yè)的使用與注意事項(xiàng)

    Mybatis-Plus分頁(yè)的使用與注意事項(xiàng)

    分頁(yè)查詢每個(gè)人程序猿幾乎都使用過(guò),下面這篇文章主要給大家介紹了關(guān)于Mybatis-Plus分頁(yè)的使用與注意事項(xiàng)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Spring框架開(kāi)發(fā)scope作用域分析總結(jié)

    Spring框架開(kāi)發(fā)scope作用域分析總結(jié)

    這篇文章主要介紹了Spring框架開(kāi)發(fā)中scope作用域的分析總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-09-09
  • Java稀疏數(shù)組詳細(xì)圖文教程

    Java稀疏數(shù)組詳細(xì)圖文教程

    當(dāng)一個(gè)數(shù)組中的大部分元素為相同的值,可使用稀疏數(shù)組來(lái)保存該數(shù)組,可以將稀疏數(shù)組看做是普通數(shù)組的壓縮,這篇文章主要給大家介紹了關(guān)于Java稀疏數(shù)組的相關(guān)資料,需要的朋友可以參考下
    2023-09-09

最新評(píng)論