美文网首页
高阶架构师支招:Fizz的插件开发

高阶架构师支招:Fizz的插件开发

作者: linwaiwai | 来源:发表于2020-10-30 10:49 被阅读0次

    一、概述

    当需要在http请求的处理流程中切入自定义的逻辑时,可通过fizz的插件机制实现。

    插件:

    1、类似spring的WebFilter,是fizz内部的WebFilter,由fizz调度。
    2、对不同的请求,可配置不同的上下文参数,通过manager完成。
    3、若有多个插件,当前插件可获取前面插件的执行结果。

    插件的开发和应用,包括gateway开发、manager配置两部分,下面以一个例子介绍。

    二、gateway开发

    在fizz中

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

    是插件的抽象,实现它即定义了一个插件。

    比如定义一个测试插件,对请求id打印日志,并保存于FIZZ-RSV头中,传给后端服务:

        @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。

    可通过 WebUtils.getPrevFilterResult(exchange); 获取上一个插件的执行结果,WebUtils.getFilterResult(exchange, "插件的id"); 获取已执行的任意一个插件的执行结果。

    三、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(对应第二章节),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
                    }
                ]
            }
        ]
    

    前端据此生成插件的配置表单,用于路由的配置,具体参前端说明。

    2、应用插件

    对接口

    xapi.png

    应用插件:

    test-plugin.png

    上面配置的"打印请求id日志"、"添加fizzRsv请求头",对应

    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

    官方技术交流群

    Fizz官方技术交流①群(已满)
    Fizz官方技术交流②群(已满)
    Fizz官方技术交流③群:512164278

    相关文章

      网友评论

          本文标题:高阶架构师支招:Fizz的插件开发

          本文链接:https://www.haomeiwen.com/subject/vlorvktx.html