在使用spring gateway作為閘道器時,我們需要在經過閘道器的請求中新增一些需要傳遞給後續服務的公共引數,這個時候就可以用到spring gateway提供的自定義請求引數功能了。1、參考官方文件
2、探索gatewayfilte***ctory實現規律
3、從原始碼獲取實現原理
既然我們是要解決自定義請求引數封裝問題,那麼我們通過上面描述規律,可以很大膽的猜測addrequestparametegatewayfilte***ctory
就是我們要找的目標。那麼我們檢視一下他的原始碼,看看他是如何實現的。
從繼承關係來看,還是比較複雜,有點懵逼,那直接進入**看看他的實現。
@override
(namevalueconfig config)
}//獲取config中的key、value,然後拼接到uri請求引數後面
string value = serverwebexchangeutils.
expand
(exchange, config.
getvalue()
);// todo urlencode?
query.
(config.
getname()
);query.
('=');
query.
(value)
;//把請求引數重新拼接回去,並放入request中傳遞到過濾鏈的下乙個請求中去
trycatch
(runtimeexception ex)
}
那config
中的key:value又是如何傳遞進來的呢?4、filter的配置和引數傳遞
**實現**現了config
引數的封裝,那這個引數是如何獲得的呢?這時候我們就要去檢視這個filter是如何使用的了。可以看到,config類的實現就是乙個name
和value
,分別對應了配置檔案中的兩個引數。我們看到,spring利用同種方式,實現了各種filter。但如果這些都不能滿足我們的要求,那該怎麼辦???1、自定義引數慘景預設我們現在看到的引數資訊都是寫死在配置檔案中的,無法進行動態引數的傳遞。我們可以設想乙個很普通的場景: 我們需要把使用者的登入資訊封裝到請求引數中,供其他服務使用。那這又該如何實現呢???2、參考官方實現進行自定義其實如果我們只要模仿官方實現,在uri上拼接我們要傳遞的動態引數就可以了。具體實現如下:@override
public mono
filter
(serverwebexchange exchange, gatewayfilterchain chain)
} string value = serverwebexchangeutils.
expand
(exchange, config.
getvalue()
);// todo urlencode?
query.
(config.
getname()
);query.
('=');
query.
(value)
;//獲取redis中使用者的快取資訊,拼接到請求引數後面
string token = exchange.
getrequest()
.getheaders()
.getfirst
("token");
if(stringutils.
hastext
(token))}
}//以下與官方**一樣,省略...
}
網上看了很多人寫的自定義,其實和本文差不多。但是有點沒有提到,定義好了怎麼用啊???這裡用乙個簡易的配置,套用yml
配置的規律,直接在配置檔案中配置。因為我是全域性使用的,所以使用的是default-filters
:- accountrequestparameter=k, v
default-filters
進行配置至此,我們自定義請求引數封裝完成!!!
Spring gateway的動態路由
gateway官方文件 gateway是spring cloud中乙個用於替換zuul閘道器作用的子專案,基於webflux實現了非同步非阻塞處理。gateway工程首先需在啟動時注入route,在請求進來時,會根據route的predicate匹配路由規則,然後經過gatewayfilter以及g...
spring gateway閘道器的使用
1建立module檔案 2匯入依賴 org.springframework.cloudgroupid spring cloud starter gatewayartifactid dependency 3配置yml檔案 server port 9527 spring name cloud gatew...
spring gateway 處理 跨域 問題
問題一 spring name nb web cloud nacos discovery server addr localhost 8848 gateway globalcors corsconfigurations allowedheaders allowedorigins allowcrede...