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

Java?Dubbo服務(wù)調(diào)用擴(kuò)展點(diǎn)Filter使用教程

 更新時(shí)間:2022年12月09日 11:10:52   作者:天使中的魔鬼M  
Dubbo是阿里巴巴公司開源的一個(gè)高性能優(yōu)秀的服務(wù)框架,使得應(yīng)用可通過高性能的RPC實(shí)現(xiàn)服務(wù)的輸出和輸入功能,可以和Spring框架無縫集成

擴(kuò)展點(diǎn)介紹

如上圖所示,從服務(wù)調(diào)用的角度來看,Dubbo 在鏈路中提供了豐富的擴(kuò)展點(diǎn),覆蓋了負(fù)載均衡方式、選址前后的攔截器、服務(wù)端處理攔截器等。 簡(jiǎn)單來說 Dubbo 發(fā)起遠(yuǎn)程調(diào)用的時(shí)候,主要工作流程可以分為消費(fèi)端和服務(wù)端兩個(gè)部分。

消費(fèi)端的工作流程如下:

通過 Stub 接收來自用戶的請(qǐng)求,并且封裝在 Invocation 對(duì)象中

將 Invocation 對(duì)象傳遞給 ClusterFilter(擴(kuò)展點(diǎn))做選址前的請(qǐng)求預(yù)處理,如請(qǐng)求參數(shù)的轉(zhuǎn)換、請(qǐng)求日志記錄、限流等操作都是在此階段進(jìn)行的

將 Invocation 對(duì)象傳遞給 Cluster(擴(kuò)展點(diǎn))進(jìn)行集群調(diào)用邏輯的決策,如快速失敗模式、安全失敗模式等決策都是在此階段進(jìn)行的

  • Cluster 調(diào)用 Directory 獲取所有可用的服務(wù)端地址信息
  • Directory 調(diào)用 StateRouter(擴(kuò)展點(diǎn),推薦使用) 和 Router(擴(kuò)展點(diǎn)) 對(duì)服務(wù)端的地址信息進(jìn)行路由篩選,此階段主要是從全量的地址信息中篩選出本次調(diào)用允許調(diào)用到的目標(biāo),如基于打標(biāo)的流量路由就是在此階段進(jìn)行的
  • Cluster 獲得從 Directory 提供的可用服務(wù)端信息后,會(huì)調(diào)用 LoadBalance (擴(kuò)展點(diǎn))從多個(gè)地址中選擇出一個(gè)本次調(diào)用的目標(biāo),如隨機(jī)調(diào)用、輪詢調(diào)用、一致性哈希等策略都是在此階段進(jìn)行的
  • Cluster 獲得目標(biāo)的 Invoker 以后將 Invocation 傳遞給對(duì)應(yīng)的 Invoker,并等待返回結(jié)果,如果出現(xiàn)報(bào)錯(cuò)則執(zhí)行對(duì)應(yīng)的決策(如快速失敗、安全失敗等)

經(jīng)過上面的處理,得到了帶有目標(biāo)地址信息的 Invoker,會(huì)再調(diào)用 Filter(擴(kuò)展點(diǎn))進(jìn)行選址后的請(qǐng)求處理(由于在消費(fèi)端側(cè)創(chuàng)建的 Filter 數(shù)量級(jí)和服務(wù)端地址量級(jí)一致,如無特殊需要建議使用 ClusterFilter 進(jìn)行擴(kuò)展攔截,以提高性能)

最后 Invocation 會(huì)被通過網(wǎng)絡(luò)發(fā)送給服務(wù)端

服務(wù)端的工作流程如下:

服務(wù)端通信層收到請(qǐng)求以后,會(huì)將請(qǐng)求傳遞給協(xié)議層構(gòu)建出 Invocation

將 Invocation 對(duì)象傳遞給 Filter (擴(kuò)展點(diǎn))做服務(wù)端請(qǐng)求的預(yù)處理,如服務(wù)端鑒權(quán)、日志記錄、限流等操作都是在此階段進(jìn)行的

將 Invocation 對(duì)象傳遞給動(dòng)態(tài)代理做真實(shí)的服務(wù)端調(diào)用

介紹完擴(kuò)展點(diǎn)后,下面以攔截?cái)U(kuò)展點(diǎn)為例介紹具體使用

攔截點(diǎn)

官方接口: org.apache.dubbo.rpc.Filter

@SPI(scope = ExtensionScope.MODULE)
public interface Filter extends BaseFilter {
}

在項(xiàng)目中實(shí)現(xiàn)該接口,自定義邏輯:

@Slf4j
@Activate(group = CommonConstants.CONSUMER)
public class ParamFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
		// 這里可以獲取到消費(fèi)者請(qǐng)求的相關(guān)信息,如服務(wù)名、請(qǐng)求的方法名、以及請(qǐng)求的參數(shù)
		// 實(shí)際應(yīng)用:做一些參數(shù)檢查以及轉(zhuǎn)換等等操作
        log.info("Service-Name: " + invocation.getServiceName() + " Method: " + invocation.getMethodName() + " Parameter: " + Arrays.toString(invocation.getArguments()));
        // 將請(qǐng)求發(fā)送給服務(wù)端
        return invoker.invoke(invocation);
    }
}

編寫Filter的配置文件:

文件名:org.apache.dubbo.rpc.Filter

內(nèi)容:

MyFilter=com.mxf.filter.ParamFilter

MyFilter: 是自定義Filter的一個(gè)別名,可以自定義

在application.yaml中配置該接口:

dubbo:
  application:
    name: shop-service-consumer
  protocol:
    name: dubbo
    port: -1
  registry:
    id: nacos-registry
    address: nacos://192.168.11.233:8848
  config-center:
    address: nacos://192.168.11.233:8848
  metadata-report:
    address: nacos://192.168.11.233:8848
  consumer:			  #在消費(fèi)端的攔截?cái)U(kuò)展點(diǎn)
    filter: MyFilter  # 注意名稱要和簽名定義的一致

重啟項(xiàng)目演示

可以使用Postman請(qǐng)求相關(guān)接口,就可以看到輸出日志:

2022-11-23 11:39:36.463  INFO 8988 --- [nio-8082-exec-1] com.mxf.filter.ParamFilter               : Service-Name: com.mxf.service.ShopService Method: queryByName Parameter: [xiao]

可以看到在消費(fèi)端自定義的攔截?cái)U(kuò)展點(diǎn)已經(jīng)生效,可以獲取到相關(guān)信息

Dubbo實(shí)現(xiàn)負(fù)載均衡的擴(kuò)展

官方提供的接口:

RandomLoadBalance:隨機(jī)策略的LB

RoundRobinLoadBalance:輪詢策略的LB

LeastActiveLoadBalance:最少活躍調(diào)用數(shù)策略的LB:舉例有兩臺(tái)服務(wù)器,一臺(tái)正在處理的任務(wù)數(shù)很多也就是負(fù)載高,那么當(dāng)前負(fù)載策略就會(huì)盡量少的給這臺(tái)服務(wù)器分配任務(wù);反之,如果一臺(tái)服務(wù)器處理的任務(wù)數(shù)少,就盡量?jī)?yōu)先給它分配任務(wù)。

ConsistentHashLoadBalance:一致性Hash策略的LB:。一致性Hash,相同參數(shù)的請(qǐng)求總是發(fā)到同一提供者,當(dāng)某一臺(tái)提供者掛時(shí),原本發(fā)往該提供者的請(qǐng)求,基于虛擬節(jié)點(diǎn),平攤到其它提供者,不會(huì)引起劇烈變動(dòng)。

ShortestResponseLoadBalance:最短響應(yīng)優(yōu)先策略的LB

除了以上Dubbo提供的五種默認(rèn)實(shí)現(xiàn)的負(fù)載均衡策略,也可以自定義負(fù)載均衡策略,只要實(shí)現(xiàn)Dubbo提供的LoadBalance接口,自定義實(shí)現(xiàn)select即可:

@SPI(RandomLoadBalance.NAME)
public interface LoadBalance {
    /**
     * select one invoker in list.
     *
     * @param invokers   invokers.
     * @param url        refer url
     * @param invocation invocation.
     * @return selected invoker.
     */
    @Adaptive("loadbalance")
    <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException;
}

用法:以輪詢策略為例

第一步編寫配置文件:

文件名:org.apache.dubbo.rpc.cluster.LoadBalance

RRLB=org.apache.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance

RRLB是自定義的負(fù)載均衡名稱

在application.yaml中配置LB:

dubbo:
  consumer:	# 在消費(fèi)端的LB
    loadbalance: RRLB

OK,到此配置完成,當(dāng)啟動(dòng)多個(gè)服務(wù)提供者,用一個(gè)消費(fèi)者去調(diào)用,就是采取輪詢的策略均勻請(qǐng)求到服務(wù)提供者上

其余四種實(shí)現(xiàn)方式一樣。

到此這篇關(guān)于Java Dubbo服務(wù)調(diào)用擴(kuò)展點(diǎn)Filter使用教程的文章就介紹到這了,更多相關(guān)Java Filter內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?JDBC使用入門講解

    Java?JDBC使用入門講解

    JDBC是指Java數(shù)據(jù)庫連接,是一種標(biāo)準(zhǔn)Java應(yīng)用編程接口(?JAVA?API),用來連接?Java?編程語言和廣泛的數(shù)據(jù)庫。從根本上來說,JDBC?是一種規(guī)范,它提供了一套完整的接口,允許便攜式訪問到底層數(shù)據(jù)庫,本篇文章我們來了解MySQL連接JDBC的流程方法
    2022-12-12
  • request如何獲取完整url(包括域名、端口、參數(shù))

    request如何獲取完整url(包括域名、端口、參數(shù))

    這篇文章主要介紹了request如何獲取完整url(包括域名、端口、參數(shù))問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Mybatis基于注解形式的sql語句生成實(shí)例代碼

    Mybatis基于注解形式的sql語句生成實(shí)例代碼

    這篇文章主要介紹了 Mybatis基于注解形式的sql語句生成實(shí)例代碼,需要的朋友可以參考下
    2017-09-09
  • MyBatis的通俗理解:SqlSession.getMapper()源碼解讀

    MyBatis的通俗理解:SqlSession.getMapper()源碼解讀

    這篇文章主要介紹了MyBatis的通俗理解:SqlSession.getMapper()源碼解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 詳解Java異常處理最佳實(shí)踐及陷阱防范

    詳解Java異常處理最佳實(shí)踐及陷阱防范

    這篇文章主要介紹了Java異常處理最佳實(shí)踐及陷阱防范,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • iOS socket網(wǎng)絡(luò)編程實(shí)例詳解

    iOS socket網(wǎng)絡(luò)編程實(shí)例詳解

    socket是一個(gè)針對(duì)TCP和UDP編程的接口,你可以借助它建立TCP連接等。這篇文章主要介紹了iOS socket網(wǎng)絡(luò)編程 ,需要的朋友可以參考下
    2017-03-03
  • Java多線程Condition接口原理介紹

    Java多線程Condition接口原理介紹

    這篇文章主要介紹了Java多線程Condition接口原理介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java適配器模式定義與用法示例

    Java適配器模式定義與用法示例

    這篇文章主要介紹了Java適配器模式定義與用法,結(jié)合具體實(shí)例形式分析了java適配器模式的功能、組成、定義、使用方法及適配程度等,需要的朋友可以參考下
    2017-06-06
  • 深入理解java中的重載和覆蓋

    深入理解java中的重載和覆蓋

    下面小編就為大家?guī)硪黄钊肜斫鈐ava中的重載和覆蓋。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • Java虛擬機(jī)內(nèi)存分配與回收策略問題精細(xì)解讀

    Java虛擬機(jī)內(nèi)存分配與回收策略問題精細(xì)解讀

    Java技術(shù)體系中所提倡的自動(dòng)內(nèi)存管理最終可以歸結(jié)為自動(dòng)化地解決了兩個(gè)問題:給對(duì)象分配內(nèi)存以及回收分配給對(duì)象的內(nèi)存,本文讓我們來詳細(xì)了解
    2021-11-11

最新評(píng)論