Soul閘道器(十六) 請求的攔截和重寫

2021-10-18 16:33:00 字數 3585 閱讀 6589

原始碼分析

waf 外掛程式總結

rewrite 外掛程式

原始碼分析

rewrite 外掛程式總結

waf 外掛程式是 soul 的前置外掛程式,主要用來攔截非法請求,或者異常請求,並且給與相關的拒絕策略,是 soul 閘道器的用來對流量實現防火牆功能的核心實現。

1)首先在 soul-admin 中開啟 waf 外掛程式

2)soul-bootstrap 的 pom 檔案中新增 waf 外掛程式starter 的依賴

>

>

org.dromaragroupid

>

>

soul-spring-boot-starter-plugin-wafartifactid

>

>

$version

>

dependency

>

3)然後在 soul-admin 的 waf 外掛程式中新增 過濾器 和 規則 對非法請求/異常請求進行拒絕

這裡將 url 為 /waf/test 的請求設定為拒絕,返回的狀態碼設定為 429:

請求 http://localhost:9195/waf/test 便會被直接拒絕:

waf 外掛程式關鍵原始碼解讀:
protected mono

doexecute

(final serverwebexchange exchange,

final soulpluginchain chain,

final selectordata selector,

final ruledata rule)

// 如果是混合模式,會返回 403

// 拿到匹配的規則,如:

string handle = rule.

gethandle()

;// 將規則轉換成 wafhandle 型別,如:wafhandle(permission=reject, statuscode=426)

wafhandle wafhandle = gsonutils.

getinstance()

.fromjson

(handle, wafhandle.

class);

if(objects.

isnull

(wafhandle)

|| stringutils.

isblank

(wafhandle.

getpermission()

))", handle)

;return chain.

execute

(exchange);}

// 如果當前規則配置的是:拒絕訪問

if(wafenum.reject.

getname()

.equals

(wafhandle.

getpermission()

))// 當前請求被允許,則放行請求

return chain.

execute

(exchange)

;}

總的來說,waf 外掛程式就相當於乙個全域性的請求***,當請求屬於黑名單的時候,會直接拒絕請求,反之,則放心請求到下乙個外掛程式。比較靈活的一點是:請求的黑白名單,可以在 soul-admin 中通過選擇器和規則進行方便的配置。

rewrite 外掛程式用來對請求 uri 進行重新定義。當匹配到請求之後,如果設定了自定義路徑,那麼自定義的路徑就會覆蓋之前的請求路徑。

1)首先在 soul-admin 中開啟 rewrite 外掛程式

2)soul-bootstrap 的 pom 檔案中新增 rewrite 外掛程式starter 的依賴

>

>

org.dromaragroupid

>

>

soul-spring-boot-starter-plugin-rewriteartifactid

>

>

$version

>

dependency

>

3) 然後在 soul-admin 的 rewrite 外掛程式中新增 過濾器 和 規則 對請求 uri 進行重寫rewrite 外掛程式關鍵原始碼解讀:
protected mono

doexecute

(final serverwebexchange exchange,

final soulpluginchain chain,

final selectordata selector,

final ruledata rule)

string handle = rule.

gethandle()

;// 轉換成 rewritehandle,如:rewritehandle(rewriteuri=/http/order/findbyid)

final rewritehandle rewritehandle = gsonutils.

getinstance()

.fromjson

(handle, rewritehandle.

class);

if(objects.

isnull

(rewritehandle)

|| stringutils.

isblank

(rewritehandle.

getrewriteuri()

))", handle)

;return chain.

execute

(exchange);}

// 設定 exchange 的 rewrite_uri 屬性,實現請求uri 的重寫

exchange.

getattributes()

.put

(constants.rewrite_uri, rewritehandle.

getrewriteuri()

);// 將新的 uri 放行到下乙個外掛程式

return chain.

execute

(exchange)

;}

總的來說,rewrite 外掛程式也相當於乙個全域性的請求***,當請求經過 rewrite 外掛程式時,如果匹配到了在 soul-admin 中配置的規則,那麼會通過設定 exchange 的 rewrite_uri 屬性,來實現對請求 uri 的重寫。

Soul閘道器原始碼探秘《九》 請求處理流程

前文探索外掛程式鏈時提到,當有接收到乙個請求的時候,會到達soulwebhandler的handle。本文會探索使用divideplugin外掛程式接收乙個請求到最終返回的全過程。在handle打上斷點,發起請求。可以通過左側呼叫棧來一點一點往前推處理的邏輯。首先是進入到defaultwebfilt...

Soul閘道器預設Divide外掛程式的使用

另外在divide外掛程式首頁我們可以看到,我們可以新增除了預設生成的規則之外的規則 最後實踐一下根據uri匹配的負載均衡,啟動多個客戶端程式,看看請求被 到那個服務上,可以看到不同負載策略的不同表現 同時我們在選擇器表單框內,可以看到隨著多個客戶端程式的使用,增加了配置的情況 另外,此處的weig...

Soul閘道器中的Http服務探活

服務探活機制是為了發現系統中上下游服務的的狀態。當有新的服務註冊時要通知其他系統,當有服務下線時也要告知其他系統。soul閘道器中有對http服務處理的探活,所有的服務物件儲存在soul admin的upstream map中,這裡面的服務物件有兩個 乙個來自於原有的資料庫,乙個來自於其他服務的註冊...