高階架構(gòu)師支招:Fizz的插件開發(fā)

一、概述

當(dāng)需要在http請求的處理流程中切入自定義的邏輯時,可通過fizz的插件機制實現(xiàn)。

插件:

1、類似spring的WebFilter,是fizz內(nèi)部的WebFilter,由fizz調(diào)度。
2、對不同的請求,可配置不同的上下文參數(shù),通過manager完成。
3、若有多個插件,當(dāng)前插件可獲取前面插件的執(zhí)行結(jié)果。

插件的開發(fā)和應(yīng)用,包括gateway開發(fā)、manager配置兩部分,下面以一個例子介紹。

二、gateway開發(fā)

在fizz中

    public abstract class PluginFilter {
        public abstract Mono<Void> doFilter(ServerWebExchange exchange, Map<String, Object> config, String fixedConfig);
    }

是插件的抽象,實現(xiàn)它即定義了一個插件。

比如定義一個測試插件,對請求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"); // 是否記錄請求id日志,通過manager配置的,參下面第三章節(jié)
            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頭的值,傳給后端服務(wù)
            }
            return WebUtils.transmitSuccessFilterResultAndEmptyMono(exchange, TEST_PLUGIN_FILTER, null); // 保存插件執(zhí)行結(jié)果,并返回
        }
    }

插件必須是一個spring Component(或子注解),有id,這個插件的id是testPlugin。

可通過 WebUtils.getPrevFilterResult(exchange); 獲取上一個插件的執(zhí)行結(jié)果,WebUtils.getFilterResult(exchange, "插件的id"); 獲取已執(zhí)行的任意一個插件的執(zhí)行結(jié)果。

三、manager配置

1、定義插件

    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(對應(yīng)第二章節(jié)),chn_name為插件中文名,order為插件的執(zhí)行順序(用于控制多個插件的先后順序),也是插件在界面上的顯示順序,

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
                }
            ]
        }
    ]

前端據(jù)此生成插件的配置表單,用于路由的配置,具體參前端說明。

2、應(yīng)用插件

對接口

xapi.png

應(yīng)用插件:

test-plugin.png

上面配置的"打印請求id日志"、"添加fizzRsv請求頭",對應(yīng)

public Mono<Void> doFilter(ServerWebExchange exchange, Map<String, Object> config, String fixedConfig) 

中config的logReqId和appendFizzRsv key。

介紹

作者:hongqiaowei
Fizz Gateway開源地址:https://github.com/wehotel/fizz-gateway-community

官方技術(shù)交流群

Fizz官方技術(shù)交流①群(已滿)
Fizz官方技術(shù)交流②群(已滿)
Fizz官方技術(shù)交流③群:512164278

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容