當須要在http請求的處理流程中切入自定義的邏輯時,可經過fizz的插件機制實現。前端
插件:java
一、相似spring的WebFilter,是fizz內部的WebFilter,由fizz調度。 二、對不一樣的請求,可配置不一樣的上下文參數,經過manager完成。
三、如有多個插件,當前插件可獲取前面插件的執行結果。mysql
插件的開發和應用,包括gateway開發、manager配置兩部分,下面以一個例子介紹。git
在fizz中github
public abstract class PluginFilter {
public abstract Mono<Void> doFilter(ServerWebExchange exchange, Map<String, Object> config, String fixedConfig);
}
複製代碼
是插件的抽象,實現它即定義了一個插件。spring
好比定義一個測試插件,對請求id打印日誌,並保存於FIZZ-RSV頭中,傳給後端服務:sql
@Component(TestPluginFilter.TEST_PLUGIN_FILTER)
public class TestPluginFilter extends PluginFilter {
private static final Logger log = LoggerFactory.getLogger(TestPluginFilter.class);
public static final String TEST_PLUGIN_FILTER = "testPlugin";
@Override
public Mono<Void> doFilter(ServerWebExchange exchange, Map<String, Object> config, String fixedConfig) {
String rid = exchange.getRequest().getId();
Boolean logReqId = (Boolean) config.get("logReqId"); // 是否記錄請求id日誌,經過manager配置的,參下面第三章節
if (logReqId == null || logReqId) {
log.info(exchange.getRequest().getURI().toString() + " 的請求id: " + rid);
}
Boolean appendFizzRsv = (Boolean) config.get("appendFizzRsv");
if (appendFizzRsv == null || appendFizzRsv) {
WebUtils.appendHeader(exchange, "FIZZ-RSV", rid); // 把rid做爲FIZZ-RSV頭的值,傳給後端服務
}
return WebUtils.transmitSuccessFilterResultAndEmptyMono(exchange, TEST_PLUGIN_FILTER, null); // 保存插件執行結果,並返回
}
}
複製代碼
插件必須是一個spring Component(或子註解),有id,這個插件的id是testPlugin。json
可經過 WebUtils.getPrevFilterResult(exchange); 獲取上一個插件的執行結果,WebUtils.getFilterResult(exchange, "插件的id"); 獲取已執行的任意一個插件的執行結果。後端
一、定義插件api
INSERT INTO `tb_plugin` (`eng_name`, `chn_name`, `config`, `order`)
VALUES
(
'testPlugin',
'測試插件',
'[{\"field\":\"logReqId\",\"label\":\"打印請求id日誌\",\"component\":\"radio\",\"dataType\":\"boolean\",\"default\":false,\"options\":[{\"label\":\"是\",\"value\":true},{\"label\":\"否\",\"value\":false}]},{\"field\":\"appendFizzRsv\",\"label\":\"添加fizzRsv請求頭\",\"component\":\"radio\",\"dataType\":\"boolean\",\"default\":false,\"options\":[{\"label\":\"是\",\"value\":true},{\"label\":\"否\",\"value\":false}]}]',
250
);
複製代碼
eng_name爲插件的id(對應第二章節),chn_name爲插件中文名,order爲插件的執行順序(用於控制多個插件的前後順序),也是插件在界面上的顯示順序,
config:
[
{
"field":"logReqId",
"label":"打印請求id日誌",
"component":"radio",
"dataType":"boolean",
"default":false,
"options":[
{
"label":"是",
"value":true
},
{
"label":"否",
"value":false
}
]
},
{
"field":"appendFizzRsv",
"label":"添加fizzRsv請求頭",
"component":"radio",
"dataType":"boolean",
"default":false,
"options":[
{
"label":"是",
"value":true
},
{
"label":"否",
"value":false
}
]
}
]
複製代碼
前端據今生成插件的配置表單,用於路由的配置,具體參前端說明。
二、應用插件
對接口
應用插件:
上面配置的"打印請求id日誌"、"添加fizzRsv請求頭",對應
public Mono<Void> doFilter(ServerWebExchange exchange, Map<String, Object> config, String fixedConfig) 複製代碼
中config的logReqId和appendFizzRsv key。
做者:hongqiaowei Fizz Gateway開源地址:github.com/wehotel/fiz…
Fizz官方技術交流①羣(已滿) Fizz官方技術交流②羣(已滿) Fizz官方技術交流③羣:512164278