Soul(shenyu)網關很大的一個特色便是插件化思想,soul網關支持很多個插件,這些插件按照給定的順序依次執行。
Soul所有的插件都實現SoulPlugin接口,插件鏈,也是執行一個個的SoulPlugin的實現類
插件鏈的執行在SoulWebHandler當中,進行代碼分析
SoulConfiguration
初始化了SoulWebHandler,將所有plugin按照order排序,調用SoulWebHandler的構造器
SoulWebHandler
構造器
初始化插件集合,工作線程池
handle方法
攔截所有請求,請求都會進入handle方法,調用了靜態內部類DefaultSoulPluginChain中的方法
DefaultSoulPluginChain
請求進來會執行DefaultSoulPluginChain的execute方法,請求上下文為參數,
方法中設置游標index,大小為插件的個數,每次執行方法后,游標加一,並且可以判斷是否跳過插件。
execute是一個遞歸方法,在進入plugin.execute方法之后,傳入了當前DefaultSoulPluginChain對象
例如,進入divide插件中:
如果不符合條件,則返回其他內容,如果符合條件,繼續調用chain.execute方法
假設divide插件為第一個插件,在進入這個插件之后,如果不滿足條件,返回其他內容,則execute方法直接的到結果返回,否則,在divide插件中調用execute方法,此時index為0++之后的結果,即1,那么就獲取到了下一個插件,一直遞歸下去,知道沒有執行execute或者index等於plugins.size為止。
遞歸滿足的是不斷調用自身,且含有終點條件,execute方法是可以一直使用DefaultSoulPluginChain對象,一直調用execute方法下去,而終點條件便是index或者某個插件直接返回了內容。
soul的插件鏈,使用SoulWebHandler實現WebHandler,攔截所有到達soulbootstrap的請求,並遞歸執行DefaultSoulPluginChain的execute方法,知道達到終點條件為止。