Dubbo擴展點應用之一filter及@Activate自激活使用


  與很多框架一樣,Dubbo也存在攔截(過濾)機制,可以通過該機制在執行目標程序前后執行我們指定的代碼。Dubbo中Filter只是Dubbo提供的可自定義擴展的擴展點之一。通過該擴展點地理解,可以觸類旁通地理解其他類似自激活的擴展點。

  那么什么是自激活?如果一個擴展點有多個實現,那么最后究竟使用哪個實現呢?根據不同的條件參數來動態選擇可以使用的擴展時(可能需要同時使用多個擴展),就會使用到自激活擴展了。這個就是自激活。

  Dubbo的Filter機制是專門為服務提供方和服務消費方調用過程進行攔截設計的,每次遠程方法執行該攔截都會被執行。這樣就為開發者提供了非常方便的擴展性,比如為dubbo接口實現監控功能、日志功能等。

  從Dubbo已實現的Filter中看具體如何實現:就用id為trace的filter

    

  該Filter的類圖如下:

    

  對於@SPI之前注解前面已經闡述了,這里重點闡述@Activate和Filter接口中的invoke方法。

    

  首先看Filter接口:

    

     通過接口注釋可以看到整個Filter中invoke方法的執行順序:invoker.invoke(invocation)必須執行一個filter的實現類才會有效工作。

  再看@Activate注解:

    這個注解中仍有效的group等如何賦值是一個需要關注的問題。根據該注解中的注釋:

      

    可知SPI的框架定義了有效的group值,value值由URL判斷是否有效。即group和value代表激活的條件,group代表URL中的分組,value代表URL中的key。如果匹配條件,則會激活擴展;order指定了擴展使用的順序,值越小越早。

  關於URL與注解中值的關系在SPI自適應中已經有體現(參考Dubbo SPI機制之三Adaptive自適應功能 - 池塘里洗澡的鴨子 - 博客園 (cnblogs.com)),那么group的值有哪些呢?在Dubbo的SPI框架中提供了哪些可選的group的值?

  通過TraceFilter上的注解,可以明確group的訪問在接口CommonConstants中,那哪些是group的可選值?參考dubbo官方文檔,可知  

    

  對於Filter與@Active具體使用范例,如下:

    

  下面自定義一個Filter,記錄消費端每次調用耗時進行上述范例的具體實踐。並利用該統計,計算調用方法的TP90和TP99。

  1、自定義一個Filter,僅被消費端使用:

    1)自定義一個TPMonitorFilter類implements Filter

      

    2)META-INF.dubbo 中新建 org.apache.dubbo.rpc.Filter 文件,並將當前類的全名寫入timerFilter=包名.過濾器的名字

      

   2、消費端引用上述Filter所屬依賴,並調用。

    1)引用該依賴

      

    2)調用

      

   3、主程序中執行打印TP90及TP99:

    

    結果:

    

   補充:之前闡述過自適應,那么自激活與自適應的區別在哪里,都是一個擴展點有多個實現?

    區別在於自激活具體使用哪些實現類體現在配置或代碼中的;而自適應是在運行時,通過URL參數來動態確定運行某一個實現。即自激活可以同時加載一個擴展點的一個或多個實現(個人理解為類似AOP,不知道實現是否使用AOP,待驗證),而自適應僅能加載一個實現。

    

 

 

 

 

 

    

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM