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

161 lines
4.8 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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;
}
}
```