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

使用Spring Cloud Gateway實(shí)現(xiàn)動(dòng)態(tài)路由的核心原理

 更新時(shí)間:2025年10月29日 11:28:40   作者:青魚入云  
Spring Cloud Gateway 實(shí)現(xiàn)動(dòng)態(tài)路由的核心是將路由規(guī)則從靜態(tài)配置遷移到外部數(shù)據(jù)源,并通過事件機(jī)制實(shí)時(shí)刷新路由緩存,本文介紹使用Spring Cloud Gateway實(shí)現(xiàn)動(dòng)態(tài)路由的核心原理,感興趣的朋友跟隨小編一起看看吧

動(dòng)態(tài)路由將路由規(guī)則存儲(chǔ)在外部數(shù)據(jù)源(如數(shù)據(jù)庫(kù)、Nacos、Apollo 等),并通過事件監(jiān)聽或配置中心推送機(jī)制實(shí)時(shí)更新路由

一、動(dòng)態(tài)路由的核心原理

Spring Cloud Gateway 的路由信息由 RouteDefinitionLocator 接口提供,默認(rèn)從配置文件(application.yml)加載。要實(shí)現(xiàn)動(dòng)態(tài)路由,需自定義 RouteDefinitionLocator 或通過事件刷新路由緩存

  1. 路由規(guī)則存儲(chǔ)在外部數(shù)據(jù)源(如 Nacos);
  2. 網(wǎng)關(guān)啟動(dòng)時(shí)從數(shù)據(jù)源加載初始路由;
  3. 當(dāng)數(shù)據(jù)源中的路由規(guī)則變更時(shí),通過監(jiān)聽機(jī)制(如 Nacos 配置變更通知)觸發(fā)路由刷新;
  4. 調(diào)用 Gateway 提供的 RouteDefinitionWriter 接口更新內(nèi)存中的路由,并發(fā)布 RefreshRoutesEvent 事件通知網(wǎng)關(guān)重新加載路由。

二、基于 Nacos 實(shí)現(xiàn)動(dòng)態(tài)路由(推薦)

Nacos 作為配置中心,支持配置變更實(shí)時(shí)推送,是實(shí)現(xiàn)動(dòng)態(tài)路由的理想選擇。以下是詳細(xì)步驟:

1. 環(huán)境準(zhǔn)備

引入依賴(Maven):

<!-- Spring Cloud Gateway 核心 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Nacos 配置中心(用于存儲(chǔ)路由規(guī)則) -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- Nacos 服務(wù)發(fā)現(xiàn)(可選,用于服務(wù)名路由) -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

配置 Nacos 地址(bootstrap.yml,需在 application.yml 之前加載):

spring:
  application:
    name: gateway-service  # 服務(wù)名,對(duì)應(yīng) Nacos 配置的 Data ID
  cloud:
    nacos:
      config:
        server-addr: localhost:8848  # Nacos 服務(wù)器地址
        file-extension: yaml  # 配置文件格式

2. 在 Nacos 中定義路由規(guī)則

登錄 Nacos 控制臺(tái)(http://localhost:8848),創(chuàng)建配置:

  • Data IDgateway-service.yaml(與 spring.application.name 一致)
  • GroupDEFAULT_GROUP(默認(rèn))
  • 配置內(nèi)容(標(biāo)準(zhǔn)的 Gateway 路由規(guī)則):
spring:
  cloud:
    gateway:
      routes:
        - id: user-service-route
          uri: lb://user-service  # 負(fù)載均衡到 user-service 服務(wù)
          predicates:
            - Path=/api/user/**
          filters:
            - StripPrefix=1  # 去除路徑前綴 /api
        - id: order-service-route
          uri: lb://order-service
          predicates:
            - Path=/api/order/**
          filters:
            - StripPrefix=1

3. 配置動(dòng)態(tài)路由刷新機(jī)制

Nacos 配置變更時(shí),會(huì)自動(dòng)推送新配置到網(wǎng)關(guān),需通過 @RefreshScope 使路由配置生效。但默認(rèn)情況下,Gateway 不會(huì)自動(dòng)刷新路由緩存,需自定義配置類監(jiān)聽配置變更并刷新路由:

import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.cloud.nacos.NacosPropertySourceRepository;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.CollectionUtils;
import reactor.core.publisher.Mono;
import javax.annotation.PostConstruct;
import java.util.List;
import java.util.concurrent.Executor;
@Configuration
public class NacosDynamicRouteConfig implements ApplicationEventPublisherAware {
    @Autowired
    private NacosConfigManager nacosConfigManager;
    @Autowired
    private RouteDefinitionWriter routeDefinitionWriter;
    private ApplicationEventPublisher publisher;
    // 路由配置的 Data ID(與 Nacos 中一致)
    private static final String DATA_ID = "gateway-service.yaml";
    // 路由配置的 Group
    private static final String GROUP = "DEFAULT_GROUP";
    @PostConstruct
    public void init() throws NacosException {
        // 1. 初始化加載路由配置
        String configInfo = nacosConfigManager.getConfigService().getConfig(DATA_ID, GROUP, 5000);
        loadRouteConfig(configInfo);
        // 2. 監(jiān)聽 Nacos 配置變更
        nacosConfigManager.getConfigService().addListener(DATA_ID, GROUP, new Listener() {
            @Override
            public void receiveConfigInfo(String configInfo) {
                // 配置變更時(shí)重新加載路由
                loadRouteConfig(configInfo);
            }
            @Override
            public Executor getExecutor() {
                return null;
            }
        });
    }
    // 解析配置并更新路由
    private void loadRouteConfig(String configInfo) {
        try {
            // 從配置中解析出 RouteDefinition 列表(需自定義解析邏輯,或借助 Spring 配置綁定)
            List<RouteDefinition> routeDefinitions = parseRouteDefinitions(configInfo);
            // 先清空舊路由
            routeDefinitionWriter.delete(Mono.just("*")).block();
            // 再添加新路由
            if (!CollectionUtils.isEmpty(routeDefinitions)) {
                routeDefinitions.forEach(route -> {
                    routeDefinitionWriter.save(Mono.just(route)).block();
                });
            }
            // 發(fā)布刷新事件,通知網(wǎng)關(guān)更新路由
            this.publisher.publishEvent(new RefreshRoutesEvent(this));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 解析配置字符串為 RouteDefinition 列表(需根據(jù)實(shí)際配置格式實(shí)現(xiàn))
    private List<RouteDefinition> parseRouteDefinitions(String configInfo) {
        // 示例:使用 Spring 的 YamlPropertiesFactoryBean 解析配置
        // 實(shí)際需根據(jù) configInfo 中的內(nèi)容提取 spring.cloud.gateway.routes 節(jié)點(diǎn)
        // 此處省略具體解析邏輯,可參考 Spring Cloud Gateway 的配置綁定方式
        return null;
    }
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.publisher = applicationEventPublisher;
    }
}

關(guān)鍵邏輯:

  • 初始化時(shí)從 Nacos 加載路由配置并添加到網(wǎng)關(guān);
  • 監(jiān)聽 Nacos 配置變更,當(dāng)路由規(guī)則更新時(shí),先刪除舊路由,再添加新路由,最后發(fā)布 RefreshRoutesEvent 事件觸發(fā)網(wǎng)關(guān)刷新。

4. 測(cè)試動(dòng)態(tài)路由

  1. 啟動(dòng)網(wǎng)關(guān)服務(wù),驗(yàn)證初始路由是否生效(如訪問 /api/user/1 能否轉(zhuǎn)發(fā)到 user-service);
  2. 在 Nacos 控制臺(tái)修改路由規(guī)則(如新增一個(gè)路由或修改路徑),無需重啟網(wǎng)關(guān);
  3. 再次訪問新路由,驗(yàn)證是否生效(如新增 /api/product/** 路由后,訪問該路徑能否轉(zhuǎn)發(fā)到 product-service)。

三、基于數(shù)據(jù)庫(kù)實(shí)現(xiàn)動(dòng)態(tài)路由(自定義數(shù)據(jù)源)

若需更靈活的路由管理(如通過后臺(tái)系統(tǒng)增刪改路由),可將路由規(guī)則存儲(chǔ)在數(shù)據(jù)庫(kù)(如 MySQL),通過定時(shí)任務(wù)或事件監(jiān)聽刷新路由。

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

創(chuàng)建路由規(guī)則表(gateway_route):

CREATE TABLE `gateway_route` (
  `id` varchar(64) NOT NULL COMMENT '路由ID',
  `uri` varchar(255) NOT NULL COMMENT '目標(biāo)地址(如 lb://user-service)',
  `predicates` text COMMENT '斷言規(guī)則(JSON格式,如 [{"name":"Path","args":{"pattern":"/api/user/**"}}])',
  `filters` text COMMENT '過濾器規(guī)則(JSON格式)',
  `order` int(11) DEFAULT 0 COMMENT '路由優(yōu)先級(jí)(值越小越優(yōu)先)',
  `status` tinyint(1) DEFAULT 1 COMMENT '狀態(tài)(1-啟用,0-禁用)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 自定義 RouteDefinitionLocator

實(shí)現(xiàn) RouteDefinitionLocator 接口,從數(shù)據(jù)庫(kù)加載路由:

@Configuration
public class DbRouteDefinitionLocator implements RouteDefinitionLocator {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Override
    public Flux<RouteDefinition> getRouteDefinitions() {
        // 從數(shù)據(jù)庫(kù)查詢啟用的路由
        List<RouteDefinition> routes = jdbcTemplate.query(
            "SELECT id, uri, predicates, filters, `order` FROM gateway_route WHERE status = 1",
            (rs, rowNum) -> {
                RouteDefinition route = new RouteDefinition();
                route.setId(rs.getString("id"));
                route.setUri(URI.create(rs.getString("uri")));
                route.setOrder(rs.getInt("order"));
                // 解析斷言(JSON -> List<PredicateDefinition>)
                String predicatesJson = rs.getString("predicates");
                List<PredicateDefinition> predicates = JSON.parseArray(predicatesJson, PredicateDefinition.class);
                route.setPredicates(predicates);
                // 解析過濾器(JSON -> List<FilterDefinition>)
                String filtersJson = rs.getString("filters");
                List<FilterDefinition> filters = JSON.parseArray(filtersJson, FilterDefinition.class);
                route.setFilters(filters);
                return route;
            }
        );
        return Flux.fromIterable(routes);
    }
}

3. 定時(shí)刷新路由

通過定時(shí)任務(wù)定期從數(shù)據(jù)庫(kù)加載最新路由并刷新:

@Component
public class DbRouteRefreshTask {
    @Autowired
    private DbRouteDefinitionLocator dbRouteLocator;
    @Autowired
    private RouteDefinitionWriter routeWriter;
    @Autowired
    private ApplicationEventPublisher publisher;
    // 每30秒刷新一次
    @Scheduled(fixedRate = 30000)
    public void refreshRoutes() {
        try {
            // 清空舊路由
            routeWriter.delete(Mono.just("*")).block();
            // 加載新路由
            dbRouteLocator.getRouteDefinitions().collectList().block()
                .forEach(route -> routeWriter.save(Mono.just(route)).block());
            // 發(fā)布刷新事件
            publisher.publishEvent(new RefreshRoutesEvent(this));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

四、關(guān)鍵注意事項(xiàng)

  1. 路由ID唯一性:確保路由 id 唯一,避免更新時(shí)沖突;
  2. 配置格式正確性:動(dòng)態(tài)路由的斷言(predicates)和過濾器(filters)格式需與 Gateway 要求一致,否則會(huì)加載失敗;
  3. 性能考量:頻繁刷新路由可能影響網(wǎng)關(guān)性能,建議合理設(shè)置刷新間隔(如 Nacos 推送機(jī)制可實(shí)時(shí)更新,無需定時(shí)任務(wù));
  4. 容錯(cuò)處理:解析路由配置時(shí)需添加異常處理,避免單個(gè)路由配置錯(cuò)誤導(dǎo)致整體路由失效。

總結(jié)

Spring Cloud Gateway 實(shí)現(xiàn)動(dòng)態(tài)路由的核心是將路由規(guī)則從靜態(tài)配置遷移到外部數(shù)據(jù)源,并通過事件機(jī)制實(shí)時(shí)刷新路由緩存?;?Nacos 等配置中心的方案適合需要頻繁調(diào)整路由的場(chǎng)景,而基于數(shù)據(jù)庫(kù)的方案適合需要通過業(yè)務(wù)系統(tǒng)管理路由的場(chǎng)景。兩種方式均可實(shí)現(xiàn)無需重啟網(wǎng)關(guān)即可更新路由,提升微服務(wù)架構(gòu)的靈活性和可維護(hù)性。

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

相關(guān)文章

  • SpringBoot項(xiàng)目Slf4j沖突問題及解決方案

    SpringBoot項(xiàng)目Slf4j沖突問題及解決方案

    在Spring Boot項(xiàng)目中使用Log4j2替代默認(rèn)的SLF4J實(shí)現(xiàn)時(shí),可能會(huì)遇到多個(gè)SLF4J實(shí)現(xiàn)的沖突,通過調(diào)整pom.xml文件的配置順序,并通過查看Maven依賴樹形關(guān)系,找到并排除沖突的依賴(例如jdbc依賴中的logback),可以解決這個(gè)問題
    2025-12-12
  • springcloud如何配置文件加載順序

    springcloud如何配置文件加載順序

    這篇文章主要介紹了springcloud如何配置文件加載順序問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java之minio文件服務(wù)器的日常操作

    java之minio文件服務(wù)器的日常操作

    本文介紹如何在Java項(xiàng)目中配置Minio服務(wù),通過創(chuàng)建minioConfig和minioDto來管理連接信息,并通過minioUtils工具類實(shí)現(xiàn)文件的上傳、下載和刪除功能,詳細(xì)說明了如何從application.yml文件中讀取配置,并強(qiáng)調(diào)了避免static情況下minioDto為null的問題,另外,提到刪除操作是延遲的
    2024-10-10
  • SpringBoot3 Spring WebFlux簡(jiǎn)介(推薦)

    SpringBoot3 Spring WebFlux簡(jiǎn)介(推薦)

    SpringWebFlux是Spring Framework 5中引入的響應(yīng)式Web框架,用于支持非阻塞異步通信和響應(yīng)式流處理,與傳統(tǒng)的SpringMVC相比,WebFlux提供了完全異步非阻塞的編程模型,適用高并發(fā)、微服務(wù)架構(gòu)和實(shí)時(shí)數(shù)據(jù)流,本文介紹SpringBoot3 Spring WebFlux簡(jiǎn)介,感興趣的朋友一起看看吧
    2024-10-10
  • Java實(shí)現(xiàn)經(jīng)典角色扮演偵探游戲游戲的示例代碼

    Java實(shí)現(xiàn)經(jīng)典角色扮演偵探游戲游戲的示例代碼

    這篇文章主要介紹了如何利用Java語言自制一個(gè)偵探文字游戲—《角色扮演偵探》,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下
    2022-02-02
  • MyBatis圖文并茂講解注解開發(fā)一對(duì)一查詢

    MyBatis圖文并茂講解注解開發(fā)一對(duì)一查詢

    這篇文章主要介紹了SpringBoot中Mybatis注解一對(duì)一查詢的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • request如何獲取完整url(包括域名、端口、參數(shù))

    request如何獲取完整url(包括域名、端口、參數(shù))

    這篇文章主要介紹了request如何獲取完整url(包括域名、端口、參數(shù))問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 如何使用Spring Validation優(yōu)雅地校驗(yàn)參數(shù)

    如何使用Spring Validation優(yōu)雅地校驗(yàn)參數(shù)

    這篇文章主要介紹了如何使用Spring Validation優(yōu)雅地校驗(yàn)參數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • IDEA 每次新建工程都要重新配置 Maven的解決方案

    IDEA 每次新建工程都要重新配置 Maven的解決方案

    這篇文章主要介紹了IDEA 每次新建工程都要重新配置Maven解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • Maven配置倉(cāng)庫(kù)的方法步驟

    Maven配置倉(cāng)庫(kù)的方法步驟

    本文主要介紹了Maven配置倉(cāng)庫(kù)的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評(píng)論

乐安县| 自贡市| 盱眙县| 昌宁县| 海口市| 黄石市| 梓潼县| 临洮县| 鄂托克前旗| 镇平县| 信丰县| 汽车| 汽车| 达拉特旗| 来凤县| 东港市| 永修县| 罗城| 嵊泗县| 勐海县| 贵南县| 阿克| 山丹县| 盐池县| 梅河口市| 开封市| 冷水江市| 乌兰县| 固安县| 敦煌市| 邮箱| 项城市| 通州市| 和顺县| 桑日县| 拉萨市| 龙川县| 信阳市| 讷河市| 临澧县| 东港市|