最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud Gateway 利用 Mysql 實(shí)現(xiàn)動(dòng)態(tài)路由的方法

 更新時(shí)間:2021年02月19日 09:54:39   作者:稀土掘金  
這篇文章主要介紹了SpringCloud Gateway 利用 Mysql 實(shí)現(xiàn)動(dòng)態(tài)路由的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

需求描述

標(biāo)準(zhǔn)網(wǎng)關(guān)動(dòng)態(tài)路由功能是重要的一環(huán),將路由、斷言以及過(guò)濾器信息,持久化到 Mysql 中,通過(guò)配置后臺(tái)頁(yè)面實(shí)現(xiàn)路由、斷言、以及過(guò)濾器等配置的增刪改查。

Spring Cloud Gateway 路由及黑白名單實(shí)現(xiàn)背景 Spring Cloud 路由API

Spring Cloud Gateway 通過(guò)定義 RouteDefinitionRepository 來(lái)實(shí)現(xiàn)動(dòng)態(tài)路由.

//保存路由緩存
public interface RouteDefinitionWriter {

  Mono<Void> save(Mono<RouteDefinition> route);

  Mono<Void> delete(Mono<String> routeId);

}
//獲取路由緩存
public interface RouteDefinitionLocator {

  Flux<RouteDefinition> getRouteDefinitions();

}

Spring Cloud 配置文件路由加載方式

public class PropertiesRouteDefinitionLocator implements RouteDefinitionLocator {

  private final GatewayProperties properties;

  public PropertiesRouteDefinitionLocator(GatewayProperties properties) {
   this.properties = properties;
  }

  @Override
  public Flux<RouteDefinition> getRouteDefinitions() {
   return Flux.fromIterable(this.properties.getRoutes());
  }

}

Spring Cloud 黑白名 FilterFactory

利用 Spring Cloud Gateway 聲明的一個(gè)工廠接口 GatewayFilterFactory, 定義 黑白名單過(guò)濾器

BlacklistGatewayFilterFactory 類圖

WhitelistGatewayFilterFactory 類圖

動(dòng)態(tài)路由設(shè)計(jì) Spring Cloud Gateway 路由實(shí)體類

Spring Cloud Gateway 通過(guò)定義 RouteDefinition 類裝載路由信息。

package org.springframework.cloud.gateway.route;

public class RouteDefinition {

  //路由 ID
  @NotEmpty
  private String id = UUID.randomUUID().toString();

  //斷言數(shù)組
  @NotEmpty
  @Valid
  private List<PredicateDefinition> predicates = new ArrayList<>();

  //過(guò)濾器數(shù)組
  @Valid
  private List<FilterDefinition> filters = new ArrayList<>();

  // 路由地址
  @NotNull
  private URI uri;

  // 路由順序
  private int order = 0;
}

數(shù)據(jù)庫(kù)設(shè)計(jì)

路由表

drop table if exists gateway_route_t;

create table if not exists gateway_route_t
(
  ID     int auto_increment primary key,
  ROUTE_ID  varchar(255) not null comment '路由ID',
  ROUTE_ORDER int default 0 null comment '路由順序',
  URI     varchar(255) not null comment '路由路徑',
  VALID    int default 1 not null comment '是否有效:0-無(wú)效,1-有效',
  CREATE_USER varchar(200) null comment '創(chuàng)建人',
  CREATE_TIME datetime   null comment '創(chuàng)建時(shí)間',
  UPDATE_USER varchar(200) null comment '修改人',
  UPDATE_TIME datetime   null comment '修改時(shí)間',
  constraint idx_ROUTE_ID_index unique (ROUTE_ID)
) comment '網(wǎng)關(guān)路由信息表' charset = utf8;

路由參數(shù)表

drop table if exists gateway_route_param_t;

create table if not exists gateway_route_param_t
(
  ID     int auto_increment primary key,
  ROUTE_ID  varchar(255) not null comment '路由ID',
  PARAM_NAME varchar(255) not null comment '參數(shù)name',
  PARAM_KEY  varchar(255) not null comment '參數(shù) key',
  PARAM_VALUE varchar(255) not null comment '參數(shù) value',
  TYPE    int      not null comment '參數(shù)類型,1為 predicate,2為過(guò) filter',
  VALID    int default 1 not null comment '是否有效:0-無(wú)效,1-有效',
  CREATE_USER varchar(200) null comment '創(chuàng)建人',
  CREATE_TIME datetime   null comment '創(chuàng)建時(shí)間',
  UPDATE_USER varchar(200) null comment '修改人',
  UPDATE_TIME datetime   null comment '修改時(shí)間'
) comment '網(wǎng)關(guān)路由參數(shù)表' charset = utf8;

create index idx_route_id on gateway_route_param_t (ROUTE_ID);

接口設(shè)計(jì) 接口定義

路由表配置接口

封裝 gateway_route_t dao 層接口.

/**
 * <功能描述> 路由表接口
 *
 * @author 20024322
 * @date 2020/12/24 13:20
 */
public interface IRouteConfigService extends IService<RouteDomain>

路由參數(shù)表配置接口

封裝 gateway_route_param_t dao 層接口.

/**
 * <功能描述> 路由參數(shù)表接口
 *
 * @author 20024322
 * @date 2020/12/24 13:20
 */
public interface IRouteParamConfigService extends IService<RouteParamDomain>

數(shù)據(jù)庫(kù)路由服務(wù)接口

封裝 路由表配置服務(wù)接口以及路由參數(shù)表配置接口, 對(duì)外層提供對(duì)數(shù)據(jù)庫(kù)路由信息的操作.

/**
 * <功能描述> 數(shù)據(jù)庫(kù)路由服務(wù)
 *
 * @author 20024322
 * @date 2020/12/24 13:20
 */
public interface IRoutePropertiesService

網(wǎng)關(guān)路由緩存接口

封裝 RouteDefinitionRepository 接口,對(duì)外提供對(duì)網(wǎng)關(guān)路由緩存的刷新.

/**
 * <功能描述> 網(wǎng)關(guān)緩存路由服務(wù)
 *
 * @author 20024322
 * @date 2020/12/24 13:20
 */
public interface IGatewayRouteService extends ApplicationEventPublisherAware

路由事件監(jiān)聽(tīng)接口

配置需要監(jiān)聽(tīng)路由變化的 service 實(shí)現(xiàn)

/**
 * <功能描述> 路由事件監(jiān)聽(tīng)接口
 *
 * @author 20024322
 * @date 2020/12/24 13:20
 */
public interface RouteEventListener extends ApplicationListener<RefreshCacheEvent>

數(shù)據(jù)庫(kù)黑白名單配置接口

/**
 * <功能描述> API Filter 接口定義
 *
 * @author 20024322
 * @date 2020/12/24 13:20
 */
public interface IApiFilterService

網(wǎng)關(guān)白名單緩存接口

提供指定路由 API 白名單check 監(jiān)聽(tīng)路由事件

/**
 * <功能描述> API 白名單緩存接口
 *
 * @author 20024322
 * @date 2020/12/24 13:20
 */
public interface IApiCacheService extends RouteEventListener

路由參數(shù)執(zhí)行校驗(yàn)接口

封裝 提供路由參數(shù)的校驗(yàn)的接口.

/**
 * <功能描述> 路由參數(shù)校驗(yàn)
 *
 * @author 20024322
 * @date 2020/12/24 13:20
 */
public interface IRouteValidateExecutorService

接口類圖 路由及黑白名單類圖

斷言及過(guò)濾器封裝類圖

集群緩存刷新事件處理策略類圖

路由初始化設(shè)計(jì) 重載 PropertiesRouteDefinitionLocator

/**
 * <功能描述> 重寫 PropertiesRouteDefinitionLocator bean
 * 將配置文件中的路由信息通過(guò) MysqlRouteConfig 載入。
 *
 * @author 20024322
 * @date 2020/12/24 13:20
 */
@Configuration
@AutoConfigureBefore({MysqlRouteConfig.class})
public class PropertiesRouteConfig {
  @Bean
  public PropertiesRouteDefinitionLocator propertiesRouteDefinitionLocator(
      GatewayProperties properties) {
    return new PropertiesRouteDefinitionLocator(new GatewayProperties());
  }
}

定義 initMysqlRouteDefinition Bean 加載數(shù)據(jù)庫(kù)及配置文件的路由配置

/**
 * <功能描述> 從Mysql中初始化路由信息
 * 覆蓋配置文件中的路由信息
 *
 * @author 20024322
 * @date 2020/12/24 13:20
 */
@Configuration
public class MysqlRouteConfig {
  private final IRoutePropertiesService routePropertiesService;
  private final IGatewayRouteService gatewayRouteService;

  public MysqlRouteConfig(IRoutePropertiesService routePropertiesService, IGatewayRouteService gatewayRouteService) {
    this.routePropertiesService = routePropertiesService;
    this.gatewayRouteService = gatewayRouteService;
  }

  /**
   * 初始化 gatewayProperties 中的 route
   *
   * @param gatewayProperties
   * @return
   */
  @Bean
  public List<RouteDefinition> initMysqlRouteDefinition(GatewayProperties gatewayProperties) {
    List<RouteDefinition> gatewayPropertiesRoutes = gatewayProperties.getRoutes();

    //初始化數(shù)據(jù)庫(kù)路由信息
    List<RouteDefinition> routeDefinitionList = routePropertiesService.getRouteDefinitionList();
    if (CollectionUtils.isEmpty(gatewayProperties.getRoutes()) && CollectionUtils.isEmpty(routeDefinitionList)) {
      throw new BizBaseException(HprmcExceptionCode.ROUTE_NOT_FOUND);
    }

    Set<String> routeIds = routeDefinitionList.stream()
        .map(RouteDefinition::getId).collect(Collectors.toSet());
    if (gatewayPropertiesRoutes.stream().anyMatch(r -> routeIds.contains(r.getId()))) {
      throw new BizBaseException(HprmcExceptionCode.ROUTE_INIT_CONFLICT);
    }

    //將配置文件中的路由信息添加到 InMemoryRouteDefinitionRepository 成員變量中
    if (!CollectionUtils.isEmpty(gatewayPropertiesRoutes)) {
      gatewayPropertiesRoutes.forEach(gatewayRouteService::addInMemoryRouteRefresh);
    }

    //寫到 InMemoryRouteDefinitionRepository 成員初始化緩存
    if (!CollectionUtils.isEmpty(routeDefinitionList)) {
      routeDefinitionList.forEach(gatewayRouteService::addInMemoryRouteRefresh);
    }
    return routeDefinitionList;
  }
}

到此這篇關(guān)于SpringCloud Gateway 利用 Mysql 實(shí)現(xiàn)動(dòng)態(tài)路由的方法的文章就介紹到這了,更多相關(guān)SpringCloud Gateway 實(shí)現(xiàn)動(dòng)態(tài)路由內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • EasyExcel自定義導(dǎo)出列和順序?qū)嵗a

    EasyExcel自定義導(dǎo)出列和順序?qū)嵗a

    這篇文章主要給大家介紹了關(guān)于EasyExcel自定義導(dǎo)出列和順序的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • 基于Spring實(shí)現(xiàn)零重啟自由編排任務(wù)的定時(shí)管理器

    基于Spring實(shí)現(xiàn)零重啟自由編排任務(wù)的定時(shí)管理器

    我們發(fā)現(xiàn),我們使用Spring自帶的定時(shí)任務(wù)如果要有修改,那么就要修改代碼,然后重啟項(xiàng)目,所以本文就帶大家實(shí)現(xiàn)一個(gè)零重啟自由編排任務(wù)的定時(shí)管理器吧
    2023-07-07
  • idea創(chuàng)建Spring項(xiàng)目的方法步驟(圖文)

    idea創(chuàng)建Spring項(xiàng)目的方法步驟(圖文)

    這篇文章主要介紹了idea創(chuàng)建Spring項(xiàng)目的方法步驟(圖文),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • java?緩沖流的概念使用方法以及實(shí)例詳解

    java?緩沖流的概念使用方法以及實(shí)例詳解

    這篇文章主要為大家介紹了java?緩沖流的概念使用方法以及實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • 解決Mybatis-plus找不到對(duì)應(yīng)表及默認(rèn)表名命名規(guī)則的問(wèn)題

    解決Mybatis-plus找不到對(duì)應(yīng)表及默認(rèn)表名命名規(guī)則的問(wèn)題

    這篇文章主要介紹了解決Mybatis-plus找不到對(duì)應(yīng)表及默認(rèn)表名命名規(guī)則的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • eclipse/IDEA配置javafx項(xiàng)目步驟(圖文教程)

    eclipse/IDEA配置javafx項(xiàng)目步驟(圖文教程)

    這篇文章主要介紹了eclipse/IDEA配置javafx項(xiàng)目步驟(圖文教程),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 實(shí)例講解java定時(shí)任務(wù)

    實(shí)例講解java定時(shí)任務(wù)

    這篇文章主要介紹了實(shí)例講解java定時(shí)任務(wù),感興趣的的朋友可以參考下
    2015-08-08
  • Maven版本沖突的三種解決方法

    Maven版本沖突的三種解決方法

    在Maven項(xiàng)目中,依賴傳遞可能導(dǎo)致Jar包版本沖突,常見(jiàn)的解決策略包括依賴排除、版本鎖定和使用maven-shade-plugin插件,本文就來(lái)介紹一下這三種解決方法,感興趣的可以了解一下
    2024-10-10
  • Java中文亂碼解決方案全解析,讓你的程序“說(shuō)人話”!

    Java中文亂碼解決方案全解析,讓你的程序“說(shuō)人話”!

    探索Java中文亂碼解決方案全解析,讓你的程序終于能“說(shuō)人話”!厭倦了看著一串串的問(wèn)號(hào)或者奇怪符號(hào)嗎?跟著我們的指南,一步步輕松解鎖中文亂碼的秘密,讓你的代碼清晰表達(dá)每一個(gè)字,需要的朋友可以參考下
    2024-02-02
  • Java對(duì)稱加密工作模式原理詳解

    Java對(duì)稱加密工作模式原理詳解

    這篇文章主要介紹了Java對(duì)稱加密工作模式原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02

最新評(píng)論

张家口市| 闻喜县| 周至县| 上杭县| 四平市| 巩留县| 简阳市| 贺兰县| 桐梓县| 七台河市| 梁河县| 绵阳市| 吕梁市| 财经| 莒南县| 林甸县| 车险| 林芝县| 信阳市| 乌兰浩特市| 安化县| 龙江县| 马公市| 石柱| 梓潼县| 萝北县| 龙岩市| 清徐县| 章丘市| 靖边县| 安达市| 克什克腾旗| 稻城县| 宾川县| 山西省| 太仓市| 江门市| 苍梧县| 正阳县| 安乡县| 石阡县|