最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Dubbo擴(kuò)展點SPI實踐示例解析

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

正文

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

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

擴(kuò)展點配置:

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

擴(kuò)展實現(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/)("########白名單校驗通過!########");            return invoker.invoke(invocation);        }
else
Unknown macro: {            [logger.info](http://logger.info/)("########白名單校驗未通過!########");            return new RpcResult();        }
    }
}

攔截配置文件:

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

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

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

調(diào)用攔截擴(kuò)展:

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

攔截擴(kuò)展說明:

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

常用約定:

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

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

  • 解析服務(wù)

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

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

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

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

  • 攔截服務(wù)

基于擴(kuò)展點的Wrapper機(jī)制,所有的Protocol擴(kuò)展點都會自動套上Wrapper類。

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

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

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

還有暴露服務(wù)和引用服務(wù),個人覺得看這上面這兩個對寫程序相對更有用些!

擴(kuò)展點的幾個特點:

擴(kuò)展點自動包裝

自動Wrap擴(kuò)展點的Wrapper類

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

擴(kuò)展點自動裝配

加載擴(kuò)展點時,自動注入依賴的擴(kuò)展點

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

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

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

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

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

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

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

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

示例:有兩個為擴(kuò)展點CarMaker(造車者)、wheelMaker(造輪者)

擴(kuò)展點自動激活

對于集合類擴(kuò)展點,比如:Filter, InvokerListener, ExportListener, TelnetHandler, StatusChecker等,可以同時加載多個實現(xiàn),此時,可以用自動激活來簡化配置,如:

import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.rpc.Filter;
@Activate // 無條件自動激活
public class XxxFilter implements Filter {
    // ...
}

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

相關(guān)文章

  • Spring注解@Configuration與@Bean注冊組件的使用詳解

    Spring注解@Configuration與@Bean注冊組件的使用詳解

    這篇文章主要介紹了SpringBoot中的注解@Configuration與@Bean注冊組件的使用,具有很好的參考價值,希望對大家有所幫助
    2022-06-06
  • 攔截器獲取request的值之后,Controller拿不到值的解決

    攔截器獲取request的值之后,Controller拿不到值的解決

    這篇文章主要介紹了攔截器獲取request的值之后,Controller拿不到值的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java Apollo環(huán)境搭建以及集成SpringBoot案例詳解

    Java Apollo環(huán)境搭建以及集成SpringBoot案例詳解

    這篇文章主要介紹了Java Apollo環(huán)境搭建以及集成SpringBoot案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • RabbitMQ 如何解決消息冪等性的問題

    RabbitMQ 如何解決消息冪等性的問題

    這篇文章主要介紹了RabbitMQ 如何解決消息冪等性的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring框架AOP基礎(chǔ)之代理模式詳解

    Spring框架AOP基礎(chǔ)之代理模式詳解

    代理模式(Proxy Parttern)為一個對象提供一個替身,來控制這個對象的訪問,即通過代理對象來訪問目標(biāo)對象。本文將通過示例詳細(xì)講解一下這個模式,需要的可以參考一下
    2022-11-11
  • java8?時間日期的使用與格式化示例代碼詳解

    java8?時間日期的使用與格式化示例代碼詳解

    這篇文章主要介紹了java8?時間日期的使用與格式化,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Spring中的ConversionService源碼解析

    Spring中的ConversionService源碼解析

    這篇文章主要介紹了Spring中的ConversionService源碼解析,ConversionService是類型轉(zhuǎn)換服務(wù)的接口,從名字就可以看出ConverterRegistry是要實現(xiàn)轉(zhuǎn)換器注冊表的接口,添加和移除Converter和GenericConverter,需要的朋友可以參考下
    2023-11-11
  • JAVA發(fā)送HTTP請求的四種方式總結(jié)

    JAVA發(fā)送HTTP請求的四種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于JAVA發(fā)送HTTP請求的多種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • mybatis 無參構(gòu)造器的使用

    mybatis 無參構(gòu)造器的使用

    本文主要介紹了MyBatis中無參構(gòu)造器的重要性和應(yīng)用,無參構(gòu)造器在Java類中具有特殊的意義,它確保了即使在沒有提供任何參數(shù)的情況下,也能夠創(chuàng)建對象并對其進(jìn)行初始化,下面就來介紹一下
    2024-10-10
  • SpringBoot部署xxl-job方法詳細(xì)講解

    SpringBoot部署xxl-job方法詳細(xì)講解

    XXL-JOB是一個分布式任務(wù)調(diào)度平臺,其核心設(shè)計目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡單、輕量級、易擴(kuò)展,這篇文章主要介紹了springboot整合xxl-job流程,需要的朋友可以參考下
    2023-01-01

最新評論

舒城县| 吴川市| 石楼县| 巧家县| 信宜市| 日喀则市| 炉霍县| 泰来县| 岗巴县| 皮山县| 绩溪县| 措勤县| 丘北县| 通化县| 简阳市| 澎湖县| 泰宁县| 阿拉善盟| 项城市| 吴旗县| 大新县| 云安县| 佛坪县| 岳阳市| 洱源县| 新宁县| 永康市| 龙南县| 台南市| 新昌县| 定远县| 磐安县| 府谷县| 屏南县| 长顺县| 丹巴县| 台安县| 清水县| 阜宁县| 贡嘎县| 阆中市|