spider RPC插件化體系

請訪問https://git.oschina.net/zhjh256/io-spider獲取最新更新。 

      爲了知足靈活擴展的須要,spider支持靈活的自定義插件擴展,從功能上來講,插件和過濾器的差異在於過濾器不會阻止請求的執行同時對於主程序不會有API上的影響(好比servlet 過濾器和監聽器)(最多改變後一步的執行路徑),而插件不只能夠改變請求後一步的執行路徑,還能夠徹底阻止請求日後繼續執行,在插件內部完成全部的處理,甚至可能會要求主程序不得不作出變更(好比j2ee 7中新增的websocket api),固然也能夠什麼都不作。git

        從本質上來講,插件的地位同等於目標服務器或者spider.localService,從執行流程上來講,請求找到路由目標或者spider.localService後,在本節點的處理就已經終止,可是插件能夠決定請求的下一處理者仍然是插件(本身除外),在插件中,甚至能夠和正常的spider客戶端同樣,調用遠程服務。web

 

        在配置了自定義插件的狀況下,插件、過濾器、本地處理器、路由的執行順序以下:api

        customPluginName1;customPluginName2;spider.beforeFilter; spider.localService;spider.channel;spider.afterFilter服務器

   customPluginName1;customPluginName2;爲插件配置的順序。websocket

        其中spider.filter、spider.localService、spider.channel爲內置約定的最佳順序。自定義插件順序可經過事先配置,也能夠在實現的doService()接口中經過不一樣的返回碼運行時改變插件執行順序或者跳過某些插件進入spider.localService或spider.channel、甚至直接終止請求。若是沒有在流水線中配置至少第一個應執行的插件,則全部相關插件均不會被執行;不然,插件實現可運行時指定下一個處理插件或者順序執行全部後續配置的插件。若是配置了超過一個自定義插件,則無論實際實現了幾個插件,最多隻會執行流水線中指定的插件。因此,建議要麼只配置第一個自定義插件,其它運行時指定;要麼,列出全部的自定義插件,運行時除非必要,不然按照配置的順序日後執行。架構

 

實現一個自定義插件包含兩個步驟:socket

實現com.ld.net.spider.plugin. SpiderPlugin接口。SpiderPlugin的簽名以下:ide

public interface SpiderPlugin {spa

    /**.net

     * 解析spider自定義插件

     * @param customPluginEle spider.xml中的customPlugin節點

     */

    public void doParse(Element customPluginEle);

   

    /**

     * 插件處理邏輯實現

     * @param packet spider請求包完整上下文,具體可查看SpiderPacketPluginReq定義

     * @return

     */

    public SpiderPacketPluginResp doService(SpiderPacketPluginReq packet);

}

 

一、 在spider.xml中配置該插件。建議全部的自定義插件都遵循以下的配置格式:

    <customPlugin name=」」 class=」」>

             <args>

                      <arg name=」factorType」></arg>

                      <arg name=」factors」></arg>

                      <arg name=」degree」></arg>

             </args>

    </customPlugin>

         其中,customPlugin爲固定名稱,標識該節點爲自定義插件,name屬性指定插件的名稱,class屬性指定插件的實現類。args以及其子節點arg爲插件自定義參數,開發者自行定義和擴展。

         爲了不潛在的業務不一致性,當插件加載失敗時,spider將停止啓動。

 

         注1:廣播請求不受自定義插件影響。

         注2:抓包在自定義組件以前。

內置插件

       spider內置了一些實用的插件,這裏作簡單的介紹。

並行執行插件

       爲了得到某些批處理場景下更低的響應時間,spider支持靈活的並行執行架構,在當前的版本中,系統支持如下兩種並行計算因子的指定:

一、客戶端枚舉指定;

二、調用功能號自動計算;

 

並行計算支持配置自定義維度,其經過配置在customPlugin元素的參數中,該插件沒有配置參數,以下所示:

<customPlugin name=」」 class=」」></customPlugin>

 

   客戶端能夠經過在可變報文頭中指定並行計算的相關參數,具體參見com.ld.net.spider.meta.SpiderBizHead。目前支持以下參數:

n  factorType:<!--1:客戶端枚舉指定;2: 調用功能號自動計算-->

n  factors:<!--並行因子,對於枚舉指定,以」,」分隔的字符串;對於調用功能號,則指定功能號(該功能號必須能從本節點路由到達)。

n  degree:<!—並行度,默認max(4, cpu數量/4)-->

n  factorDriver:<!—當factorType=2時,調用功能號的查詢條件。factorType=1時自動被忽略,可傳可不傳-->

n  condJsonPath:指定並行查詢的條件字段,用於計算出並行條件後插件會寫到請求參數,這樣能夠保證服務的設計與並行執行徹底弱相關。

   基於CNB/ANB做爲高速路由的考慮,並行執行插件僅在第一個NP節點纔開始進行並行化(在到達隨後的節點時,並行計算參數自動清除),節點的角色可經過配置文件中的role屬性進行設置。

 

因爲並行計算是一個fork and join的流程,所以爲了儘量地簡化應用層的特殊考慮,spider在BaseResp的基礎上擴展了一個ParallelBaseResp,用於並行計算。當用戶但願使用並行計算特性時,須要使用該類做爲基類,同時增長一個data字段做爲業務執行結果,data能夠是任何類型(字段名必須是data,放在其餘字段上的信息均會丟失),以下所示:

public class SpiderBaseResp {

    private String errorNo = SpiderErrorNoConstant.ERROR_NO_SUCCESS;

    private String errorInfo = SpiderErrorNoConstant.ERROR_INFO_SUCCESS;

}

 

public class ParallelBaseResp extends SpiderBaseResp {

    private String clusterName = "-1";

    private String ip = "-1";

    private int port = -1;

}

 

客戶端能夠獲得每一個並行執行子進程的執行結果以及業務返回值。

       因爲並行計算自己會引入額外的進程或線程間交互成本,所以建議僅在運行超過30秒以上的場景中使用並行執行特性。

       並行執行的具體使用可參考spider開發指南。

相關文章
相關標籤/搜索