SpringCloudGateway動態路由詳解

一、概述

Spring Cloud Gateway是一個基於Spring Boot 2.0+和Spring Framework 5.0+的網關,旨在為微服務架構提供一種簡單有效的方式來處理API請求。Spring Cloud Gateway作為Spring Cloud生態系統中的網關,目標是提供統一的路由方式且基於Filter鏈的方式提供各種便捷的操作,例如:熔斷、限流、重試等。

二、動態路由介紹

動態路由是Spring Cloud Gateway最為重要的功能之一,它提供了非常方便的方式來動態增刪改路由規則而無需停止服務。採用動態路由可以讓我們實現路由的自由發揮,充分發揮Spring Cloud Gateway的優勢,使得我們能夠在反向代理層面對請求進行攔截和控制,達到限流、鑒權、監控等效果。

三、動態路由配置示例

下面我們以一個示例來講解如何配置Spring Cloud Gateway的動態路由,假設有三個服務分別是service1、service2、service3,下面是對service1進行動態路由配置的代碼示例:

spring:
  cloud:
    gateway:
      routes:
        - id: service1_route
          uri: http://localhost:8080
          predicates: 
            - Path=/service1/**
          filters:
            - RewritePath=/service1(?<segment>/?.*), $\{segment}

上面的配置意味著,所有路徑為 /service1/** 的請求將被轉發到 http://localhost:8080 這個服務上, RewritePath 告訴網關重新解析路徑。如果沒有此過濾器,/service1/** 對應的請求將會被發送到後端的 /service1 這個路徑上,RewritePath 的作用就是將 /service1/** 路徑下的所有請求的 /service1 替換成空字元串。

四、動態路由實現原理

動態路由的實現依賴於 Spring Cloud Gateway 的核心——RouteLocator,Spring Cloud Gateway 將配置中的所有 Route 信息交給 RouteLocator,RouteLocator根據自身的實現方式返回一個包含所有 Route 信息的 RouteDefinition 列表,Spring Cloud Gateway 則將這些 RouteDefinition 轉換為 Route,並啟動這些 Route 將請求轉發到後端的服務。

當註冊中心中的服務數量發生變化或者配置方式發生變化時,Spring Cloud Gateway會接收到配置中心發來的消息,更新本地的 RouteLocator 中記錄的 RouteDefinition,Spring Cloud Gateway內置了一個RefreshRoutesListener,用來更新 Route,網關收到消息後會觸發RefreshRoutesEvent事件,最終調用RefreshRoutesListener的onApplicationEvent方法,執行Route表的刷新操作,具體如下:

public class RefreshRoutesListener implements ApplicationListener {

    private static final Logger log = LoggerFactory.getLogger(RefreshRoutesListener.class);

    private final RouteDefinitionRouteLocator routeDefinitionRouteLocator;

    private final GatewayProperties gatewayProperties;

    private final RouteLocator routeLocator;

    public RefreshRoutesListener(RouteDefinitionRouteLocator routeDefinitionRouteLocator,
                                 GatewayProperties gatewayProperties, RouteLocator routeLocator) {
        this.routeDefinitionRouteLocator = routeDefinitionRouteLocator;
        this.gatewayProperties = gatewayProperties;
        this.routeLocator = routeLocator;
    }

    @Override
    public void onApplicationEvent(RefreshRoutesEvent event) {
        log.debug("Received refresh event");
        routeDefinitionRouteLocator.setRouteDefinitions(event.getRouteDefinitions());
        CompositeRouteLocator routeLocator = new CompositeRouteLocator(this.routeLocator.getRouteLocators());
        routeLocator.getRouteDefinitions().subscribe(this::logRefreshComplete);
        this.routeDefinitionRouteLocator.initialized(routeLocator);
        this.gatewayProperties.getRoutes().stream().filter(
                route -> route.getId().equals("default")).findFirst().ifPresent(defaultRoute -> {
            if (event.getRouteDefinitions().isEmpty()) {
                log.debug("Clear out the default route");
                defaultRoute.setUri(null);
            }
        });
    }

    private void logRefreshComplete(Collection routeDefinitions) {
        if (log.isDebugEnabled()) {
            log.debug("Routes refreshed: " + routeDefinitions);
        }
    }
}

五、動態路由的優點

採用Spring Cloud Gateway的動態路由可以提供以下幾個優點:

1、靈活性高:動態路由能夠讓我們對路由進行更加靈活的控制,能夠更加精準地選擇服務。

2、可擴展性高:動態路由對後端的服務並沒有太多的要求,用戶可以通過增加規則的方式對新的服務進行支持。

3、無需重啟:實現動態路由之後,即可實現對服務的動態路由,不需要重啟 Spring Cloud Gateway 服務。

六、總結

SpringCloudGateway的動態路由功能是SpringCloud Gateway優秀的特性之一,這個特性可以讓我們在網關層面實現更加細緻化的控制,同時也提高了整個系統的可擴展性和靈活性,是我們在進行微服務架構設計時很好的選擇。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/152125.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-12 00:55
下一篇 2024-11-12 00:55

相關推薦

  • QML 動態載入實踐

    探討 QML 框架下動態載入實現的方法和技巧。 一、實現動態載入的方法 QML 支持從 JavaScript 中動態指定需要載入的 QML 組件,並放置到運行時指定的位置。這種技術…

    編程 2025-04-29
  • Python愛心代碼動態

    本文將從多個方面詳細闡述Python愛心代碼動態,包括實現基本原理、應用場景、代碼示例等。 一、實現基本原理 Python愛心代碼動態使用turtle模塊實現。在繪製一個心形的基礎…

    編程 2025-04-29
  • t3.js:一個全能的JavaScript動態文本替換工具

    t3.js是一個非常流行的JavaScript動態文本替換工具,它是一個輕量級庫,能夠很容易地實現文本內容的遞增、遞減、替換、切換以及其他各種操作。在本文中,我們將從多個方面探討t…

    編程 2025-04-28
  • 使用easypoi創建多個動態表頭

    本文將詳細介紹如何使用easypoi創建多個動態表頭,讓表格更加靈活和具有可讀性。 一、創建單個動態表頭 easypoi是一個基於POI操作Excel的Java框架,支持通過註解的…

    編程 2025-04-28
  • Python動態輸入: 從基礎使用到應用實例

    Python是一種高級編程語言,因其簡單易學和可讀性而備受歡迎。Python允許程序員通過標準輸入或命令行獲得用戶輸入,這使得Python語言無法預測或控制輸入。在本文中,我們將詳…

    編程 2025-04-28
  • Python動態規劃求解公共子串

    本文將從以下多個方面對公共子串Python動態規划進行詳細闡述: 一、什麼是公共子串? 公共子串是指在兩個字元串中同時出現且連續的子串。例如,字元串”ABCD&#822…

    編程 2025-04-27
  • 使用Thymeleaf動態渲染下拉框

    本文將從下面幾個方面,詳細闡述如何使用Thymeleaf動態渲染下拉框: 一、Thymeleaf是什麼 Thymeleaf是一款Java模板引擎,可用於Web和非Web環境中的應用…

    編程 2025-04-27
  • 動態規劃例題用法介紹

    本文將以動態規劃(Dynamic Programming, DP)例題為中心,深入闡述動態規劃的原理和應用。 一、最長公共子序列問題 最長公共子序列問題(Longest Commo…

    編程 2025-04-27
  • IPv6動態域名解析的實現和應用

    一、IPv6的動態域名解析概述 IPv6是下一代互聯網協議,解決了IPv4中IP地址不足的問題。IPv6的地址長度為128位,地址空間巨大,同時支持更多的安全和網路管理特性。動態域…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25

發表回復

登錄後才能評論