前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >高阶架构师支招:Fizz的插件开发

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

原创
作者头像
openapplus
修改2020-10-30 14:15:39
5250
修改2020-10-30 14:15:39
举报
文章被收录于专栏:OpenApplusOpenApplus

一、概述

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

插件:

1、类似spring的WebFilter,是fizz内部的WebFilter,由fizz调度。

2、对不同的请求,可配置不同的上下文参数,通过manager完成。

3、若有多个插件,当前插件可获取前面插件的执行结果。

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

二、gateway开发

在fizz中

代码语言:txt
复制
    public abstract class PluginFilter {
        public abstract Mono<Void> doFilter(ServerWebExchange exchange, Map<String, Object> config, String fixedConfig);
    }

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

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

代码语言:txt
复制
    @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、定义插件

代码语言:txt
复制
    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:

代码语言:txt
复制
    [
        {
            "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
xapi.png

应用插件:

test-plugin.png
test-plugin.png

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

代码语言:txt
复制
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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、概述
  • 二、gateway开发
  • 三、manager配置
    • 介绍
    相关产品与服务
    API 网关
    腾讯云 API 网关(API Gateway)是腾讯云推出的一种 API 托管服务,能提供 API 的完整生命周期管理,包括创建、维护、发布、运行、下线等。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档