Fizz Gateway 二次開發集成教程

概述

fizz 2.0 採用分模塊設計,包括:前端

  • fizz-spring-boot-starter 模塊,方便第三方快速集成 fizz 網關。java

  • fizz-bootstrap 模塊,演示模塊,展現第三方如何集成 fizz,建議第三方以此模塊爲骨架應用網關,並進行二次開發。react

下面以網關日誌插件的例子介紹主題。redis

集成 fizz 網關

建立 spring boot maven 工程,建議 2.2.13.RELEASE 版本

調整 pom

配置 propertiesspring

<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 網關依賴apache

<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,到當前工程的對應位置,調整:bootstrap

爲網關管理後臺的 redis;markdown

若非性能測試,可調整 log4j2-spring.xml 中的日誌級別爲 info/debug。app

工程啓動類

拷貝 fizz-bootstrap 的 FizzBootstrapApplication.java 到工程源碼目錄,名字可調整,運行啓動類,若無錯誤日誌,說明引入 fizz 成功。maven

開發日誌插件

插件的開發包括新增插件定義、編寫插件過濾器、管理後臺應用配置。

管理後臺新增插件定義

插件名稱也是插件的 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
                }
            ]
        }
    ]
    管理後臺的前端據今生成插件的配置表單

複製代碼

編寫插件過濾器

@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 請求頭",對應

public Mono<Void> doFilter(ServerWebExchange exchange, Map<String, Object> config, String fixedConfig) 

複製代碼

中 config 的 logReqId 和 appendFizzRsv key,重啓工程,訪問前面的路由,如有對應日誌輸出,代表插件生效。

相關文章
相關標籤/搜索