Files
fizz-gateway-node/fizz-plugin/plugin-core.md

161 lines
4.8 KiB
Markdown
Raw Normal View History

2021-12-08 19:09:40 +08:00
---
home: false
title: 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 对象):
```groovy
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);
}
```
示例:
```java
@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<Void>
直接调用父类方法获取各种配置:
> routerConfig获取路由级别插件配置
>
> pluginConfig获取插件级别插件配置
>
> originRouterCfg获取原始路由级别插件配置
>
> originPluginCfg获取原始插件级别插件配置
>
> apiConfig获取路由配置
示例:
```java
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;
}
}
```