前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Fizz Gateway 二次开发集成教程

Fizz Gateway 二次开发集成教程

原创
作者头像
openapplus
修改2021-06-04 14:19:13
9250
修改2021-06-04 14:19:13
举报
文章被收录于专栏:OpenApplusOpenApplus

概述

fizz 2.0 采用分模块设计,包括:

  • fizz-spring-boot-starter 模块,方便第三方快速集成 fizz 网关。
  • fizz-bootstrap 模块,演示模块,展示第三方如何集成 fizz,建议第三方以此模块为骨架应用网关,并进行二次开发。

下面以网关日志插件的例子介绍主题。

集成 fizz 网关

创建 spring boot maven 工程,建议 2.2.13.RELEASE 版本

调整 pom

配置 properties

代码语言:javascript
复制
    <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 网关依赖

代码语言:javascript
复制
        <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>
调整配置

拷贝 fizz-bootstrap 模块 resources 下的 js 目录、application.yml、log4j2-spring.xml,到当前工程的对应位置,调整:

为网关管理后台的 redis;

若非性能测试,可调整 log4j2-spring.xml 中的日志级别为 info/debug。

工程启动类

拷贝 fizz-bootstrap 的 FizzBootstrapApplication.java 到工程源码目录,名字可调整,运行启动类,若无错误日志,说明引入 fizz 成功。

开发日志插件

插件的开发包括新增插件定义、编写插件过滤器、管理后台应用配置。

管理后台新增插件定义

代码语言:javascript
复制
    插件名称也是插件的 id 需唯一,order 为插件的执行顺序,也是插件在界面上的显示顺序。
    
    表单定义:
    [
        {
            "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
                }
            ]
        }
    ]
    管理后台的前端据此生成插件的配置表单

编写插件过滤器

代码语言:javascript
复制
    @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 appendFizzRsv = (Boolean) config.get("appendFizzRsv");
            if (appendFizzRsv == null || appendFizzRsv) {
                WebUtils.appendHeader(exchange, "FIZZ-RSV", rid);
            }
            return WebUtils.transmitSuccessFilterResultAndEmptyMono(exchange, LOG_PLUGIN_FILTER, null); // 保存插件执行结果,并返回
        }
    }

    插件必须是一个 spring 的 Component(或子注解),工程启动类的 scanBasePackages 要覆盖插件的 pkg;
    插件实现了两个功能,记录请求 id 日志,转发请求时添加 FIZZ-RSV 请求头,并且功能是可打开或关闭的。

#应用插件

路由应用插件:

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

代码语言:javascript
复制
public Mono<Void> doFilter(ServerWebExchange exchange, Map<String, Object> config, String fixedConfig) 

中 config 的 logReqId 和 appendFizzRsv key,重启工程,访问前面的路由,若有对应日志输出,表明插件生效。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 集成 fizz 网关
    • 创建 spring boot maven 工程,建议 2.2.13.RELEASE 版本
      • 调整 pom
      • 调整配置
      • 工程启动类
  • 开发日志插件
    • 管理后台新增插件定义
      • 编写插件过滤器
        • #应用插件
        相关产品与服务
        API 网关
        腾讯云 API 网关(API Gateway)是腾讯云推出的一种 API 托管服务,能提供 API 的完整生命周期管理,包括创建、维护、发布、运行、下线等。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档