# 概述
fizz 2.0 采用分模块设计,包括:
fizz-spring-boot-starter 模块,方便第三方快速集成 fizz 网关。
fizz-bootstrap 模块,演示模块,展示第三方如何集成 fizz,建议第三方以此模块为骨架应用网关,并进行二次开发。
下面以网关日志插件的例子介绍主题。
# 集成 fizz 网关
# 创建 spring boot maven 工程,建议 2.2.13.RELEASE 版本
# 调整 pom
配置 properties
<properties>
<java.version>1.8</java.version>
<fizz.version>2.0.0</fizz.version>
<spring-framework.version>5.2.15.RELEASE</spring-framework.version>
<reactor-bom.version>Dysprosium-SR20</reactor-bom.version>
<lettuce.version>5.3.7.RELEASE</lettuce.version>
<netty.version>4.1.65.Final</netty.version>
<httpcore.version>4.4.14</httpcore.version>
<log4j2.version>2.13.3</log4j2.version>
<commons-lang3.version>3.12.0</commons-lang3.version>
<lombok.version>1.18.20</lombok.version>
<apache.dubbo.version>2.7.5</apache.dubbo.version>
<grpc.version>1.16.1</grpc.version>
<mockito.version>3.4.6</mockito.version>
<curator.version>4.0.1</curator.version>
<zookeeper.version>3.5.9</zookeeper.version>
</properties>
<!-- 这些 properties 指定网关依赖的版本 -->
加入 fizz 网关依赖
<dependency>
<groupId>com.fizzgate</groupId>
<artifactId>fizz-common</artifactId>
<version>${fizz.version}</version>
</dependency>
<dependency>
<groupId>com.fizzgate</groupId>
<artifactId>fizz-spring-boot-starter</artifactId>
<version>${fizz.version}</version>
</dependency>
注:
https://mvnrepository.com/artifact/com.github.wehotel/fizz-bootstrap
https://mvnrepository.com/artifact/com.github.wehotel/fizz-gateway-node
为遗留的测试包,请勿使用
# 调整配置
拷贝 fizz-bootstrap 模块 resources 下的 js 目录、application.yml、log4j2-spring.xml,到当前工程的对应位置,调整:
为网关管理后台的 redis;
若非性能测试,可调整 log4j2-spring.xml 中的日志级别为 info/debug。
# 工程启动类
拷贝 fizz-bootstrap 的 FizzBootstrapApplication.java 到工程源码目录,名字可调整,运行启动类,若无错误日志,说明引入 fizz 成功。
# 开发日志插件
插件的开发包括新增插件定义、编写插件过滤器、管理后台应用配置。
# 管理后台新增插件定义
插件名称也是插件的 id 需唯一,order 为插件的执行顺序,也是插件在界面上的显示顺序。
表单定义:
[
{
"field":"logReqId",
"label":"打印请求id日志",
"component":"radio",
"dataType":"boolean",
"default":false,
"options":[
{
"label":"是",
"value":true
},
{
"label":"否",
"value":false
}
]
},
{
"field":"appendFizzGateRsv",
"label":"添加fizzRsv请求头",
"component":"radio",
"dataType":"boolean",
"default":false,
"options":[
{
"label":"是",
"value":true
},
{
"label":"否",
"value":false
}
]
}
]
管理后台的前端据此生成插件的配置表单
# 编写插件过滤器
@Component(LogPluginFilter.LOG_PLUGIN_FILTER) // 与上面的插件 id 一致
public class LogPluginFilter extends PluginFilter {
private static final Logger log = LoggerFactory.getLogger(LogPluginFilter.class);
public static final String LOG_PLUGIN_FILTER = "logPlugin";
@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 日志,即上面的定义,可通过管理后台配置
if (logReqId == null || logReqId) {
log.info(exchange.getRequest().getURI().toString() + " 的请求id: " + rid);
}
Boolean appendFizzGateRsv = (Boolean) config.get("appendFizzGateRsv");
if (appendFizzGateRsv == null || appendFizzGateRsv) {
WebUtils.appendHeader(exchange, "FIZZ-RSV", rid);
}
return WebUtils.transmitSuccessFilterResultAndEmptyMono(exchange, LOG_PLUGIN_FILTER, null); // 保存插件执行结果,并返回
}
}
插件必须是一个 spring 的 Component(或子注解),工程启动类的 scanBasePackages 要覆盖插件的 pkg;
插件实现了两个功能,记录请求 id 日志,转发请求时添加 FIZZ-RSV 请求头,并且功能是可打开或关闭的。
# 应用插件
对
路由应用插件:
上面配置的"打印请求 id 日志"、"添加 fizzRsv 请求头",对应
public Mono<Void> doFilter(ServerWebExchange exchange, Map<String, Object> config, String fixedConfig)
中 config 的 logReqId 和 appendFizzGateRsv key,重启工程,访问前面的路由,若有对应日志输出,表明插件生效。