当须要在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