亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringCloud Gateway中斷言路由和過濾器的使用詳解

 更新時間:2025年04月02日 10:23:33   作者:Xwzzz_  
這篇文章主要介紹了SpringCloud Gateway中斷言路由和過濾器的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一、Gateway概念

Spring Cloud Gateway(簡稱 Gateway)是一個基于 Spring WebFlux 的 API 網(wǎng)關解決方案,旨在為微服務架構中的客戶端提供路由、負載均衡、認證、限流、監(jiān)控等功能。

它作為微服務架構中的流量入口,通常位于客戶端和后端微服務之間,處理來自客戶端的請求并將其路由到相應的服務。

主要特性:

  1. 路由功能:Spring Cloud Gateway 可以根據(jù)請求的不同特征(如路徑、方法、頭部、參數(shù)等)將請求路由到不同的微服務。
  2. 負載均衡:支持與服務注冊中心(如 Eureka)集成,能夠?qū)⒘髁糠职l(fā)到多個實例,以實現(xiàn)負載均衡。
  3. 過濾器:提供了豐富的過濾器功能,可以在請求和響應的生命周期中進行定制化處理。例如,身份認證、日志記錄、限流等。
  4. 反向代理:可以將請求轉(zhuǎn)發(fā)給后端服務,實現(xiàn)反向代理功能。
  5. 高可用和可擴展性:通過與 Spring Cloud 配合使用,Spring Cloud Gateway 能夠在微服務架構中提供高可用和擴展性支持。
  6. 監(jiān)控:可以與 Spring Boot Actuator 集成,提供請求和響應的監(jiān)控功能,幫助開發(fā)人員監(jiān)控系統(tǒng)的健康狀況和性能。

二、基本路由

路由是將客戶端請求發(fā)送到后端服務的主要組件。它定義了請求的匹配規(guī)則以及請求將被轉(zhuǎn)發(fā)到的目標(即URI)。每個路由都具有一個id、uri以及predicates

  • id:每個路由的唯一標識符。
  • uri:路由轉(zhuǎn)發(fā)的目標URI。對于lb://協(xié)議,它指向服務注冊中心(如Eureka)中的服務,表示請求將被轉(zhuǎn)發(fā)到注冊的服務。
  • predicates:定義了路由的匹配條件,決定哪些請求將被此路由處理。
spring:
    cloud:
        gateway:
            routes:
                - id: order-route
                  uri: lb://service-order
                  predicates:
                    - Path=/api/order/**

三、斷言

斷言(Predicates) 用于根據(jù)請求的各種屬性來匹配路由,它們是路由的核心部分。

斷言支持不同的匹配條件,如路徑、請求方法、請求頭等。通過不同的請求模式來匹配對應的微服務。

3.1在Spring Cloud Gateway的配置中,斷言有兩種寫法

  • 長寫法:指定完整的斷言語法,明確標明斷言的類型。
spring:
  cloud:
    gateway:
      routes:
        - id: order-route
          uri: lb://service-order
          predicates:
            - name: Path
              args:
                pattern: /api/order/**
  • 短寫法:是斷言的簡化寫法,直接使用斷言類型的簡潔形式。
spring:
  cloud:
    gateway:
      routes:
        - id: order-route
          uri: lb://service-order
          predicates:
            - Path=/api/order/**

系統(tǒng)內(nèi)置斷言(Predicates)

Spring Cloud Gateway 提供了很多內(nèi)置的斷言類型,用來處理各種請求匹配需求。常用的斷言類型包括:

這張圖展示了Spring Cloud Gateway中常用的路由斷言(Predicates)及其相關參數(shù)說明。斷言是路由配置的重要組成部分,它們用來判斷請求是否滿足特定條件,以決定是否將請求轉(zhuǎn)發(fā)到目標服務。

每種斷言都允許通過指定參數(shù)來對請求進行詳細匹配。

3.2自定義斷言

我們通過繼承 AbstractRoutePredicateFactory 類,創(chuàng)建了一個名為 VipRoutePredicateFactory 的類,實現(xiàn)了自定義的路由斷言邏輯,示例代碼如下:

import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * 自定義路由斷言工廠
 */
@Component
public class VipRoutePredicateFactory extends AbstractRoutePredicateFactory<VipRoutePredicateFactory.Config> {

    public VipRoutePredicateFactory() {
        super(Config.class);  // 傳入Config類
    }

    @Override
    public List<String> shortcutFieldOrder() {
        // 返回配置類中的字段順序
        return Arrays.asList("param", "value");
    }

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return new GatewayPredicate() {

            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                // 獲取請求
                ServerHttpRequest request = serverWebExchange.getRequest();

                // 從請求的查詢參數(shù)中獲取 'param' 對應的值
                String first = request.getQueryParams().getFirst(config.param);

                // 比較查詢參數(shù)的值與配置中的 'value' 是否匹配
                return StringUtils.isNotBlank(first) && first.equals(config.value);
            }
        };
    }

    // 配置類
    public static class Config {
        private String param;  // 查詢參數(shù)名稱
        private String value;  // 查詢參數(shù)期望的值

        // Getter和Setter方法
        public String getParam() {
            return param;
        }

        public void setParam(String param) {
            this.param = param;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }
}

VipRoutePredicateFactory

  • 該類繼承自 AbstractRoutePredicateFactory,實現(xiàn)了自定義斷言工廠的功能。
  • AbstractRoutePredicateFactory 是 Spring Cloud Gateway 提供的基礎類,用于創(chuàng)建自定義的路由斷言。
  • 我們將 Config.class 作為構造函數(shù)的參數(shù)傳遞給父類,表示我們會用 Config 類來存儲斷言所需的配置參數(shù)。

shortcutFieldOrder() 方法

  • 這個方法返回一個 List<String>,用于定義配置類中字段的順序。
  • 在這個例子中,paramvalue 的順序決定了用戶在配置時,paramvalue 應該以這個順序出現(xiàn)。
  • Spring Cloud Gateway 使用 shortcutFieldOrder() 方法來生成簡潔的 YAML 配置。
spring:
  cloud:
    gateway:
      routes:
        - id: vip-route
          uri: https://example.com
          predicates:
            - name: Vip(RoutePredicateFactory)//vip是斷言工廠名前綴
              args:
                param: q
                value: test

apply(Config config) 方法

  • 這個方法用于應用自定義斷言的邏輯,接收 Config 類的實例作為參數(shù)。
  • Config 類包含了路由斷言所需的參數(shù)(paramvalue)。
  • 該方法返回一個 Predicate<ServerWebExchange>,用于對每個請求進行斷言判斷。

這里的 Predicate<ServerWebExchange> 表示一個函數(shù),它接收一個 ServerWebExchange(表示當前請求),并返回一個布爾值,表示該請求是否匹配該斷言。

test(ServerWebExchange serverWebExchange) 方法

  • 在這個方法中,我們實際執(zhí)行請求的匹配邏輯。首先通過 serverWebExchange.getRequest() 獲取當前請求對象。接著,我們從請求的查詢參數(shù)中獲取與 config.param 對應的值,存儲在 first 變量中。
  • 然后,我們檢查 first 是否為空,并與 config.value 進行比較。如果它們相等,并且查詢參數(shù)不為空,我們返回 true,表示路由匹配成功;否則返回 false,表示路由不匹配。

Config

  • Config 類是一個靜態(tài)類,用來存儲自定義斷言需要的配置參數(shù)。這里有兩個字段:param 表示查詢參數(shù)的名稱,value 表示查詢參數(shù)的期望值。用戶通過配置文件傳入這兩個參數(shù)。
  • Config 類的作用是封裝從配置文件中讀取的參數(shù),并通過 @Validated 等注解進行驗證

四、過濾器

過濾器(Filters) 是用于在請求和響應過程中執(zhí)行特定操作的機制。它們是在路由決策之前或之后執(zhí)行的,可以對請求進行修改(如添加頭部、修改請求體)或響應進行處理(如修改響應內(nèi)容、記錄日志等)。

過濾器的使用大致可以分為兩種類型:前置過濾器(pre-filter)和后置過濾器(post-filter)。前置過濾器在請求到達目標服務之前執(zhí)行,后置過濾器則在響應返回客戶端之前執(zhí)行。

過濾器主要用于以下目的:

  • 請求和響應的修改。
  • 安全性(如身份驗證)。
  • 負載均衡和限流。
  • 請求日志和性能監(jiān)控。

4.1基本的過濾器使用步驟

添加依賴: 需要在pom.xml文件中加入Spring Cloud Gateway的依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

創(chuàng)建過濾器: 可以通過實現(xiàn)GatewayFilter接口來創(chuàng)建自定義過濾器。Spring Cloud Gateway提供了GatewayFilter接口和GlobalFilter接口,分別用于處理特定路由和全局的請求過濾。

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class MyCustomFilter implements GatewayFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 在請求處理之前執(zhí)行的邏輯
        System.out.println("請求被過濾: " + exchange.getRequest().getURI());

        // 執(zhí)行后續(xù)過濾器鏈
        return chain.filter(exchange);
    }
}

注冊過濾器: 自定義過濾器可以通過注入GatewayFilter的方式注冊到Spring的上下文中??梢詫⑦^濾器注入到@Configuration中,或者直接使用@Component注解讓其自動注冊。

配置路由過濾器: 在路由配置中,可以為某個特定的路由設置過濾器。

spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://httpbin.org:80
          predicates:
            - Path=/get
          filters:
            - name: RequestHeaderToRequestUri
              args:
                name: X-Request-Id

4.2全局過濾器使用步驟

全局過濾器是應用于所有路由請求的過濾器,它們在請求到達目標服務之前和響應返回時都會被執(zhí)行。全局過濾器對于記錄日志、身份驗證等場景非常有用。

import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;


@Component
public class LoggingGlobalFilter implements GlobalFilter {
    
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 記錄請求的URL
        String path = exchange.getRequest().getURI().getPath();
        System.out.println("Request Path: " + path);
        
        // 繼續(xù)處理鏈中的下一個過濾器
        return chain.filter(exchange);
    }
}

4.3自定義過濾器使用步驟

Spring Cloud Gateway允許開發(fā)者創(chuàng)建自定義過濾器。

自定義過濾器有兩種類型:

  • GatewayFilter:只能作用于單個路由。
  • GlobalFilter:作用于所有路由。
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.http.HttpStatus;
import reactor.core.publisher.Mono;

@Component
public class LoggingGlobalFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 獲取請求的路徑
        String path = exchange.getRequest().getURI().getPath();

        // 記錄請求的路徑
        System.out.println("Request Path: " + path);

        // 向請求中添加一個自定義的請求頭
        exchange.getRequest().mutate()
                .header("X-Request-ID", "Request-" + System.currentTimeMillis())  // 設置一個自定義請求頭
                .build();

        // 繼續(xù)處理請求
        return chain.filter(exchange)
                .doOnTerminate(() -> {
                    // 記錄響應結(jié)束時的日志
                    System.out.println("Request " + path + " processed.");
                });
    }
}

LoggingGlobalFilter 實現(xiàn)了 GlobalFilter 接口

該過濾器會應用于所有的請求,不管是哪個路由請求都會執(zhí)行這個過濾器的邏輯。

filter() 方法

  • 在這個方法中,首先我們通過 exchange.getRequest().getURI().getPath() 獲取當前請求的路徑。
  • 然后,我們通過 System.out.println() 打印日志,記錄下請求的路徑。
  • 接著,我們使用 mutate() 方法修改請求,添加了一個自定義的請求頭 X-Request-ID,其值為當前時間戳(這樣可以在日志中唯一標識每個請求)。
  • 最后,通過 chain.filter(exchange) 將請求繼續(xù)傳遞給下一個過濾器鏈

4.4過濾器的執(zhí)行順序

Spring Cloud Gateway的過濾器按以下順序執(zhí)行:

  • 請求過濾器:請求從客戶端進入網(wǎng)關后,過濾器鏈會逐個執(zhí)行請求過濾器。
    • 過濾器執(zhí)行順序是鏈式的:GlobalFilter -> GatewayFilter
  • 響應過濾器:請求被轉(zhuǎn)發(fā)到目標服務,響應返回時,再次按鏈式執(zhí)行響應過濾器。

4.5常用過濾器

Spring Cloud Gateway提供了一些內(nèi)置的過濾器,可以直接使用。例如:

  • AddRequestHeader:添加請求頭部。
  • AddResponseHeader:添加響應頭部。
  • RemoveRequestHeader:刪除請求頭部。
  • RemoveResponseHeader:刪除響應頭部。
  • SetPath:修改請求路徑。
  • RewritePath:重寫路徑。

添加請求頭的過濾器舉例:

spring:
  cloud:
    gateway:
      routes:
        - id: add-header-route
          uri: http://localhost:8081
          predicates:
            - Path=/add-header/**
          filters:
            - AddRequestHeader=X-Custom-Header, Value

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • java學生信息管理系統(tǒng)MVC架構詳解

    java學生信息管理系統(tǒng)MVC架構詳解

    這篇文章主要為大家詳細介紹了java學生信息管理系統(tǒng)MVC架構的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java用鄰接表存儲圖的示例代碼

    Java用鄰接表存儲圖的示例代碼

    鄰接表是圖的一種鏈式存儲方法,其數(shù)據(jù)結(jié)構包括兩部分:節(jié)點和鄰接點。本文將用鄰接表實現(xiàn)存儲圖,感興趣的小伙伴可以了解一下
    2022-06-06
  • Java后端接入微信小程序?qū)崿F(xiàn)登錄功能

    Java后端接入微信小程序?qū)崿F(xiàn)登錄功能

    這篇文章主要介紹了Java如何在后端接入微信小程序從而實現(xiàn)登錄功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-06-06
  • SpringCloud之動態(tài)刷新、重試、服務化的實現(xiàn)

    SpringCloud之動態(tài)刷新、重試、服務化的實現(xiàn)

    這篇文章主要介紹了SpringCloud 之動態(tài)刷新、重試、服務化的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • 并發(fā)編程之Java內(nèi)存模型鎖的內(nèi)存語義

    并發(fā)編程之Java內(nèi)存模型鎖的內(nèi)存語義

    這篇文章主要介紹了并發(fā)編程之Java內(nèi)存模型鎖的內(nèi)存語義,鎖的作用是讓臨界區(qū)互斥執(zhí)行,本文只要圍繞鎖的內(nèi)存語義展開全文內(nèi)容,需要的小伙伴可以參考一下
    2021-11-11
  • Java手把手必會的實例漢諾塔講解練習

    Java手把手必會的實例漢諾塔講解練習

    漢諾塔,傳說神在創(chuàng)造世界的時候做了三根金剛石柱子,并在一個教塔里留下了三根金剛石棒,第一根上面從上到下套著64個按從小到大排列的金盤,神命令廟里的眾僧將它們一個個地從這根金剛石棒搬到另一根金剛石棒上,大盤不能放在小盤上。最后64個金盤仍然要按從小到大排列
    2021-09-09
  • JSON,AJAX,Maven入門基礎

    JSON,AJAX,Maven入門基礎

    這篇文章主要介紹了JSON,AJAX和Maven基礎,如何使用AJAX讀取Json數(shù)組里面的數(shù)據(jù),感興趣的小伙伴們可以參考一下,希望能夠幫助到你
    2021-07-07
  • Idea中Jdk和Language level的指定方式

    Idea中Jdk和Language level的指定方式

    這篇文章主要介紹了Idea中Jdk和Language level的指定方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • idea解決Git分支合并沖突問題

    idea解決Git分支合并沖突問題

    這篇文章主要介紹了idea解決Git分支合并沖突問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java實現(xiàn)向Word文檔添加文檔屬性

    Java實現(xiàn)向Word文檔添加文檔屬性

    這篇文章主要介紹了Java實現(xiàn)向Word文檔添加文檔屬性的相關資料,需要的朋友可以參考下
    2023-01-01

最新評論