上一節(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ù)庫中的恢筝。
- 對應(yīng)關(guān)系:
一個插件對應(yīng)多個選擇器哀卫,一個選擇器對應(yīng)多個規(guī)則
一個選擇器和規(guī)則都對應(yīng)多個匹配條件
每個規(guī)則在對應(yīng)插件下,不同的處理表現(xiàn)為handler字段 - 數(shù)據(jù)庫表UML(早期版本撬槽,現(xiàn)在可能有些出入)
二此改、什么是選擇器?什么是規(guī)則恢氯?
選擇器和規(guī)則是soul中最核心的東西
- 插件中有許多的選擇器带斑,一個選擇器有對應(yīng)多種規(guī)則
- 選擇器會對流量做第一次的篩選,規(guī)則在做最終的篩選
- 選擇器和規(guī)則要做的就是為了讓流量能夠在滿足特定的條件下勋拟,才取執(zhí)行我們的想要的
選擇器:
選擇器配置詳解:
名稱: 選擇器的名稱
-
類型:
- cutom:自定義流量
- full:全流量流量
選擇full后勋磕,發(fā)現(xiàn)配置中匹配方式和條件都會隱藏掉,不再需要再配置匹配方式和條件了
匹配方式: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ī)則:
當流量經(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
請求頭中的字段值來匹配济榨。
- header是根據(jù)你的
- 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)晾虑。(默認開啟)
網(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
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秒