三、soul源碼學習-http-divide插件學習

上一節(jié)我們學習了http項目本地啟動的整體流程睬关,并跑通http請求網(wǎng)關(guān)轉(zhuǎn)發(fā)到自己服務(wù)吆录,這節(jié)我們學習下divide插件

一窑滞、插件數(shù)據(jù)庫設(shè)計:

首先我們關(guān)注下soul的插件數(shù)據(jù)庫的設(shè)計,soul的插件是持久化在數(shù)據(jù)庫中的恢筝。

  1. 對應(yīng)關(guān)系:
    一個插件對應(yīng)多個選擇器哀卫,一個選擇器對應(yīng)多個規(guī)則
    一個選擇器和規(guī)則都對應(yīng)多個匹配條件
    每個規(guī)則在對應(yīng)插件下,不同的處理表現(xiàn)為handler字段
  2. 數(shù)據(jù)庫表UML(早期版本撬槽,現(xiàn)在可能有些出入)
image.png

二此改、什么是選擇器?什么是規(guī)則恢氯?

選擇器和規(guī)則是soul中最核心的東西

  1. 插件中有許多的選擇器带斑,一個選擇器有對應(yīng)多種規(guī)則
  2. 選擇器會對流量做第一次的篩選,規(guī)則在做最終的篩選
  3. 選擇器和規(guī)則要做的就是為了讓流量能夠在滿足特定的條件下勋拟,才取執(zhí)行我們的想要的

選擇器:

image.png

選擇器配置詳解:

  • 名稱: 選擇器的名稱

  • 類型:

    • cutom:自定義流量
    • full:全流量流量

    選擇full后勋磕,發(fā)現(xiàn)配置中匹配方式和條件都會隱藏掉,不再需要再配置匹配方式和條件了

image.png
image.png
  • 匹配方式:and 或者or 是指下面多個條件是按照and 還是or的方式來組合

  • 條件:

    • uri:是指你根據(jù)uri的方式來篩選流量敢靡,match的方式支持模糊匹配(/**)
    • header:是指根據(jù)請求頭里面的字段來篩選流量挂滓。
    • query:是指根據(jù)uri的查詢條件來進行篩選流量。
    • ip:是指根據(jù)你請求的真實ip啸胧,來篩選流量赶站。
    • host:是指根據(jù)你請求的真實host,來篩選流量纺念。
    • post:建議不要使用贝椿。
    • 條件匹配:
      • match:模糊匹配,建議和uri條件搭配陷谱,支持 restful風格的匹配烙博。(/test/**)
      • =:前后值相等瑟蜈,才能匹配。
      • regEx:正則匹配渣窜,表示前面一個值去匹配后面的正則表達式铺根。
      • like:字符串模糊匹配。
  • 是否開啟:打開才會生效

  • 打印日志:打開的時候乔宿,當匹配上的時候位迂,會打印匹配日志。

  • 執(zhí)行順序:當多個選擇器的時候详瑞,執(zhí)行順序小的優(yōu)先執(zhí)行掂林。

  • 選擇器建議:可以uri 條件, match 前綴 (/contextPath)蛤虐,進行第一道流量篩選党饮。

規(guī)則:

image.png

當流量經(jīng)過選擇器匹配成功之后,會進入規(guī)則來進行最終的流量匹配驳庭。

規(guī)則詳解:

  • 名稱:規(guī)則的名稱

  • 匹配方式:and 或者or 是指下面多個條件是按照and 還是or的方式來組合

  • 條件:

    • uri:是指你根據(jù)uri的方式來篩選流量刑顺,match的方式支持模糊匹配(/**)
    • header:是指根據(jù)請求頭里面的字段來篩選流量也颤。
    • query:是指根據(jù)uri的查詢條件來進行篩選流量蜈漓。
    • ip:是指根據(jù)你請求的真實ip,來篩選流量或详。
    • host:是指根據(jù)你請求的真實host贝淤,來篩選流量柒竞。
    • post:建議不要使用。
    • 條件匹配:
      • match:模糊匹配播聪,建議和uri條件搭配朽基,支持 restful風格的匹配。(/test/**)
      • =:前后值相等离陶,才能匹配稼虎。
      • regEx:正則匹配,表示前面一個值去匹配后面的正則表達式招刨。
      • like:字符串模糊匹配霎俩。
  • 是否開啟:打開才會生效

  • 打印日志:打開的時候,當匹配上的時候沉眶,會打印匹配日志打却。

  • 執(zhí)行順序:當多個規(guī)則的時候,執(zhí)行順序小的優(yōu)先執(zhí)行谎倔。

  • 規(guī)則建議:可以uri 條件柳击, match 最真實的uri路徑,進行流量的最終篩選 片习。

條件詳解:

  • uri 匹配 (推薦)
    • uri匹配是根據(jù)你請求路徑中的uri來進行匹配腻暮,在接入網(wǎng)關(guān)的時候彤守,前端幾乎不用做任何更改。
    • 當使用 match 方式匹配時候哭靖,同 springmvc 模糊匹配原理相同。
    • 在選擇器中侈离,推薦使用uri中的前綴來進行匹配试幽,而在規(guī)則中,則使用具體路徑來進行匹配卦碾。
    • 該匹配方式的時候铺坞,在匹配字段名稱可以任意填寫,匹配字段值需要正確填寫洲胖。
  • header 匹配
    • header是根據(jù)你的http 請求頭中的字段值來匹配济榨。
  • query 匹配
    • 這個是根據(jù)你的uri中的查詢參數(shù)來進行匹配,比如 /test?a=1&&b=2 绿映,那么可以選擇該匹配方式擒滑。
    • 上述就可以新增一個條件,選取 query方式 , a = 1 叉弦。
  • ip匹配
    • 這個是根據(jù) http調(diào)用方的 ip來進行匹配丐一。
    • 尤其是在waf插件里面,如果發(fā)現(xiàn)一個ip地址有攻擊淹冰,可以新增一條匹配條件库车,填上該ip,拒絕該ip的訪問樱拴。
    • 如果在soul前面使用了nginx代理柠衍,為了獲取正確的ip,你可能要參考 dev-iphost
  • host匹配
    • 這個是根據(jù) http調(diào)用方的host來進行匹配晶乔。
    • 尤其是在waf插件里面珍坊,如果發(fā)現(xiàn)一個host地址有攻擊,可以新增一條匹配條件瘪弓,填上該host垫蛆,拒絕該host的訪問。
    • 如果在soul前面使用了nginx代理腺怯,為了獲取正確的host袱饭,你可能要參考 dev-iphost
  • post匹配
    • 不推薦使用。

二呛占、divide插件

divide插件是網(wǎng)關(guān)處理http協(xié)議請求的核心處理插件

插件設(shè)置虑乖,訪問http://127.0.0.1:9095/#/system/plugin,保證divide插件是開啟狀態(tài)晾虑。(默認開啟)

image.png

網(wǎng)關(guān)如果想支持divide插件疹味,需要在我們的網(wǎng)關(guān)項目soul-bootstrap中引入如下依賴:

  <!--if you use http proxy start this-->
   <dependency>
       <groupId>org.dromara</groupId>
       <artifactId>soul-spring-boot-starter-plugin-divide</artifactId>
       <version>${last.version}</version>
   </dependency>

   <dependency>
       <groupId>org.dromara</groupId>
       <artifactId>soul-spring-boot-starter-plugin-httpclient</artifactId>
       <version>${last.version}</version>
   </dependency>

插件詳解:

divide插件是進行http正向代理的插件仅叫,所有的http類型的請求,都是由該插件進行負載均衡調(diào)用的

想要了解什么是正向代理和反向代理糙捺,可以看這篇文章:https://cloud.tencent.com/developer/article/1418457

image.png

http配置诫咱,是網(wǎng)關(guān)匹配到流量以后,真實調(diào)用的http配置洪灯,可以配置多個坎缭,設(shè)置負載均衡權(quán)重,具體的負載均衡策略签钩,在規(guī)則中指定

配置詳解:

  • 第一個框:hostName掏呼,一般填寫 localhost,該字段暫時沒使用铅檩。
  • 第二個框:http協(xié)議憎夷,一般填寫 http:// 或者 https:// ,不填寫默認為:http://
  • 第三個框:ip與端口昧旨,這里填寫你真實服務(wù)的 ip + 端口拾给。
  • 第四個框:負載均衡權(quán)重。

ip + port 檢測:

在soul-admin 會有一個定時任務(wù)來掃描 配置的ip端口臼予,如果發(fā)現(xiàn)下線鸣戴,則會除該 ip + port

可以進行如下配置 :

soul.upstream.check:true  默認為 ture,設(shè)置為false粘拾,不檢測
soul.upstream.scheduledTime:10  定時檢測時間間隔窄锅,默認10秒
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缰雇,隨后出現(xiàn)的幾起案子入偷,更是在濱河造成了極大的恐慌,老刑警劉巖械哟,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疏之,死亡現(xiàn)場離奇詭異,居然都是意外死亡暇咆,警方通過查閱死者的電腦和手機锋爪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爸业,“玉大人其骄,你說我怎么就攤上這事〕犊酰” “怎么了拯爽?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钧忽。 經(jīng)常有香客問我毯炮,道長逼肯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任桃煎,我火速辦了婚禮篮幢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘为迈。我一直安慰自己洲拇,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布曲尸。 她就那樣靜靜地躺著,像睡著了一般男翰。 火紅的嫁衣襯著肌膚如雪另患。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天蛾绎,我揣著相機與錄音昆箕,去河邊找鬼。 笑死租冠,一個胖子當著我的面吹牛鹏倘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播顽爹,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼纤泵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了镜粤?” 一聲冷哼從身側(cè)響起捏题,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肉渴,沒想到半個月后公荧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡同规,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年循狰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片券勺。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绪钥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朱灿,到底是詐尸還是另有隱情昧识,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布盗扒,位于F島的核電站跪楞,受9級特大地震影響缀去,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甸祭,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一缕碎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧池户,春花似錦咏雌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寨典,卻和暖如春氛雪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耸成。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工报亩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人井氢。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓弦追,卻偏偏與公主長得像,于是被迫代替她去往敵國和親花竞。 傳聞我的和親對象是個殘疾皇子劲件,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容