一辉巡、概述
當(dāng)需要在http請(qǐng)求的處理流程中切入自定義的邏輯時(shí)套蒂,可通過(guò)fizz的插件機(jī)制實(shí)現(xiàn)。
插件:
1吟榴、類似spring的WebFilter魁蒜,是fizz內(nèi)部的WebFilter,由fizz調(diào)度吩翻。
2兜看、對(duì)不同的請(qǐng)求,可配置不同的上下文參數(shù)狭瞎,通過(guò)manager完成细移。
3、若有多個(gè)插件熊锭,當(dāng)前插件可獲取前面插件的執(zhí)行結(jié)果弧轧。
插件的開(kāi)發(fā)和應(yīng)用,包括gateway開(kāi)發(fā)碗殷、manager配置兩部分精绎,下面以一個(gè)例子介紹。
二锌妻、gateway開(kāi)發(fā)
在fizz中
public abstract class PluginFilter {
public abstract Mono<Void> doFilter(ServerWebExchange exchange, Map<String, Object> config, String fixedConfig);
}
是插件的抽象代乃,實(shí)現(xiàn)它即定義了一個(gè)插件。
比如定義一個(gè)測(cè)試插件仿粹,對(duì)請(qǐng)求id打印日志搁吓,并保存于FIZZ-RSV頭中,傳給后端服務(wù):
@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"); // 是否記錄請(qǐng)求id日志牍陌,通過(guò)manager配置的擎浴,參下面第三章節(jié)
if (logReqId == null || logReqId) {
log.info(exchange.getRequest().getURI().toString() + " 的請(qǐng)求id: " + rid);
}
Boolean appendFizzRsv = (Boolean) config.get("appendFizzRsv");
if (appendFizzRsv == null || appendFizzRsv) {
WebUtils.appendHeader(exchange, "FIZZ-RSV", rid); // 把rid作為FIZZ-RSV頭的值,傳給后端服務(wù)
}
return WebUtils.transmitSuccessFilterResultAndEmptyMono(exchange, TEST_PLUGIN_FILTER, null); // 保存插件執(zhí)行結(jié)果毒涧,并返回
}
}
插件必須是一個(gè)spring Component(或子注解)贮预,有id,這個(gè)插件的id是testPlugin契讲。
可通過(guò) WebUtils.getPrevFilterResult(exchange); 獲取上一個(gè)插件的執(zhí)行結(jié)果仿吞,WebUtils.getFilterResult(exchange, "插件的id"); 獲取已執(zhí)行的任意一個(gè)插件的執(zhí)行結(jié)果。
三捡偏、manager配置
1唤冈、定義插件
INSERT INTO `tb_plugin` (`eng_name`, `chn_name`, `config`, `order`)
VALUES
(
'testPlugin',
'測(cè)試插件',
'[{\"field\":\"logReqId\",\"label\":\"打印請(qǐng)求id日志\",\"component\":\"radio\",\"dataType\":\"boolean\",\"default\":false,\"options\":[{\"label\":\"是\",\"value\":true},{\"label\":\"否\",\"value\":false}]},{\"field\":\"appendFizzRsv\",\"label\":\"添加fizzRsv請(qǐng)求頭\",\"component\":\"radio\",\"dataType\":\"boolean\",\"default\":false,\"options\":[{\"label\":\"是\",\"value\":true},{\"label\":\"否\",\"value\":false}]}]',
250
);
eng_name為插件的id(對(duì)應(yīng)第二章節(jié)),chn_name為插件中文名银伟,order為插件的執(zhí)行順序(用于控制多個(gè)插件的先后順序)你虹,也是插件在界面上的顯示順序绘搞,
config:
[
{
"field":"logReqId",
"label":"打印請(qǐng)求id日志",
"component":"radio",
"dataType":"boolean",
"default":false,
"options":[
{
"label":"是",
"value":true
},
{
"label":"否",
"value":false
}
]
},
{
"field":"appendFizzRsv",
"label":"添加fizzRsv請(qǐng)求頭",
"component":"radio",
"dataType":"boolean",
"default":false,
"options":[
{
"label":"是",
"value":true
},
{
"label":"否",
"value":false
}
]
}
]
前端據(jù)此生成插件的配置表單,用于路由的配置傅物,具體參前端說(shuō)明夯辖。
2、應(yīng)用插件
對(duì)接口
應(yīng)用插件:
上面配置的"打印請(qǐng)求id日志"董饰、"添加fizzRsv請(qǐng)求頭"蒿褂,對(duì)應(yīng)
public Mono<Void> doFilter(ServerWebExchange exchange, Map<String, Object> config, String fixedConfig)
中config的logReqId和appendFizzRsv key。
介紹
作者:hongqiaowei
Fizz Gateway開(kāi)源地址:https://github.com/wehotel/fizz-gateway-community
官方技術(shù)交流群
Fizz官方技術(shù)交流①群(已滿)
Fizz官方技術(shù)交流②群(已滿)
Fizz官方技術(shù)交流③群:512164278