Files
fizz-gateway-node/fizz-plugin/plugin-core.md
2021-12-08 19:09:40 +08:00

4.8 KiB
Executable File
Raw Blame History

home, title
home title
false plugin core

主要封装说明

  • 1、引入核心包后不影响以前编写的插件只是提供更加便捷的开发方式
  • 2、插件名字编写规范。在保留原有编写方式的前提下强制实现 pluginName() 方法,对开发更加友好,减少失误;
  • 3、配置获取更加容易。配置主要有3个路由配置、插件全局配置、插件在路由里的个性配置。现在都可以直接获取相应的配置实体对象而不是默认提供的 Map 或者 String

使用说明

核心包是用于开发插件的基础包。主要是简化操作,方便开发,使开发人员更专注于业务代码对编写。

1、编写2个配置实体类插件在路由里的个性配置、插件全局配置并添加注解 @FizzConfig

@FizzConfig 参数说明:

contentParser :配置内容解析器。选填,默认是 json 解析器 JsonParser 。也可以自定义解析器,只需实现 we.plugin.core.filter.config.ContentParser 接口

注意:默认解析器 JsonParser 的 parseRouterCfg 方法只对第一层的 json string 做了增强,但这也足够用了。如(注意 varJson 是个 json 字符串,并不是 json 对象):

void parseRouterCfg() {
        String varJson = "{\n" +
                "  \"var1\": \"var1\",\n" +
                "  \"var2\": \"var2\",\n" +
                "  \"var3\": \"var3\"\n" +
                "}";
//        String varJson = "";
//        String varJson = null;
        Map<String, String> config = Maps.newHashMap();
        config.put("codeSource", "this is code source");
        config.put("var", varJson);
        RouterConfig routerConfig = parser.parseRouterCfg(config, RouterConfig.class);
        System.out.println(routerConfig);
    }

示例:

    @Data
    @FizzConfig
    public class PluginConfig {
        private String id;
        private Var var;
    }

    @Data
    @FizzConfig
    public class RouterConfig {
        private String codeSource;
        private Var var;
    }

    @Data
    public class Var {
        private String var1;
        private Integer var2;
        private Long var3;
    }

3、编写插件逻辑 继承 we.plugin.core.filter.AbstractFizzPlugin ,并实现 pluginName 和 doFilter 方法

pluginName 方法:获取插件名称。无参,返回插件名称,要与网关后台配置的插件名称一致

doFilter 方法:插件主要逻辑方法。入参是 ServerWebExchange出参是 Mono

直接调用父类方法获取各种配置:

routerConfig获取路由级别插件配置

pluginConfig获取插件级别插件配置

originRouterCfg获取原始路由级别插件配置

originPluginCfg获取原始插件级别插件配置

apiConfig获取路由配置

示例:

package we.fizz.plugin.example.plugin;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import we.plugin.core.filter.AbstractFizzPlugin;
import we.plugin.core.filter.config.FizzConfig;
import we.plugin.auth.ApiConfig;
import we.util.WebUtils;

import java.util.Map;

import static we.fizz.plugin.example.plugin.ExamplePlugin.PluginConfig;
import static we.fizz.plugin.example.plugin.ExamplePlugin.RouterConfig;

@Slf4j
@Component
public class ExamplePlugin extends AbstractFizzPlugin<RouterConfig, PluginConfig> {

    /**
     * 插件名称
     */
    @Override
    public String pluginName() {
        return "examplePlugin";
    }

    /**
     * filter逻辑
     */
    @Override
    public Mono<Void> doFilter(ServerWebExchange exchange) {
        RouterConfig routerConfig = routerConfig(exchange);
        PluginConfig pluginConfig = pluginConfig(exchange);
        Map<String, Object> originRouterCfg = originRouterCfg(exchange);
        String originPluginCfg = originPluginCfg(exchange);
        ApiConfig apiConfig = apiConfig(exchange);
        if (log.isTraceEnabled()) {
            log.trace("routerConfig : {}", routerConfig);
            log.trace("pluginConfig : {}", pluginConfig);
            log.trace("originRouterCfg : {}", originRouterCfg);
            log.trace("originPluginCfg : {}", originPluginCfg);
            log.trace("apiConfig : {}", apiConfig);
        }
        return WebUtils.buildDirectResponse(exchange, HttpStatus.OK, null, "success");
    }

    @Data
    @FizzConfig
    public static class PluginConfig {
        private String id;
        private Var var;
    }

    @Data
    public static class Var {
        private String var1;
        private String var2;
        private String var3;
    }

    @Data
    @FizzConfig
    public static class RouterConfig {
        private String codeSource;
        private Var var;
    }
}