自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

實(shí)戰(zhàn)Spring Cloud Gateway自定義謂詞及網(wǎng)關(guān)過濾器

開發(fā) 前端
Spring Cloud Gateway 的自定義謂詞工廠和網(wǎng)關(guān)過濾器工廠為開發(fā)者提供了靈活性和擴(kuò)展性,使得開發(fā)者可以根據(jù)業(yè)務(wù)需求自定義路由條件和請(qǐng)求處理邏輯。通過實(shí)現(xiàn)這些自定義組件,你可以輕松地構(gòu)建出滿足特定業(yè)務(wù)需求的 API 網(wǎng)關(guān)。

環(huán)境:SpringBoot2.7.12 + SpringCloud2021.0.7

1. 簡介

Spring Cloud Gateway 中,路由斷言(predicates)和過濾器(filters)是兩個(gè)核心概念,它們共同決定了如何處理進(jìn)入網(wǎng)關(guān)的請(qǐng)求。

謂詞工廠

謂詞工廠用于定義路由斷言。斷言是路由的一個(gè)條件,只有當(dāng)條件滿足時(shí),請(qǐng)求才會(huì)被路由到指定的服務(wù)。Spring Cloud Gateway 提供了一系列的內(nèi)置斷言,例如基于路徑、請(qǐng)求頭、請(qǐng)求方法等的斷言。然而,如果你需要實(shí)現(xiàn)一些特定的業(yè)務(wù)邏輯或自定義條件,你可以創(chuàng)建自定義的謂詞工廠。

自定義謂詞工廠通常需要實(shí)現(xiàn) org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory 或其子類,并定義斷言的條件。在創(chuàng)建自定義謂詞工廠時(shí),你需要指定謂詞的名字、配置類以及斷言的匹配邏輯。

例如,你可以創(chuàng)建一個(gè)自定義謂詞工廠來檢查請(qǐng)求中是否包含特定的自定義請(qǐng)求頭。

網(wǎng)關(guān)過濾器工廠

網(wǎng)關(guān)過濾器工廠用于定義在路由匹配后應(yīng)用于請(qǐng)求的過濾器。這些過濾器可以對(duì)請(qǐng)求和響應(yīng)進(jìn)行修改,例如添加請(qǐng)求頭、修改響應(yīng)體或進(jìn)行身份驗(yàn)證等。Spring Cloud Gateway 同樣提供了一系列的內(nèi)置過濾器,但同樣,如果你需要實(shí)現(xiàn)特定的業(yè)務(wù)邏輯或自定義處理,你可以創(chuàng)建自定義的網(wǎng)關(guān)過濾器工廠。

自定義網(wǎng)關(guān)過濾器工廠通常需要實(shí)現(xiàn) org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory,并定義過濾器的邏輯。你可以在這里編寫 Java 代碼來實(shí)現(xiàn)對(duì)請(qǐng)求和響應(yīng)的自定義處理。

例如,你可以創(chuàng)建一個(gè)自定義網(wǎng)關(guān)過濾器工廠來記錄每個(gè)請(qǐng)求的詳細(xì)信息,或者根據(jù)特定的業(yè)務(wù)邏輯修改響應(yīng)的內(nèi)容。

2. 實(shí)戰(zhàn)案例

2.1 自定義謂詞工廠

該謂詞工廠的作用檢查請(qǐng)求參數(shù)及header中個(gè)性化的信息。

@Component
public class ParamHeaderRoutePredicateFactory extends AbstractRoutePredicateFactory<ParamHeaderRoutePredicateFactory.Config> {
  
  public static final String PARAM_KEY = "param";
  public static final String HEADER_KEY = "header" ;
  public static final String PARAM_VALUE = "pv" ;
  public static final String HEADER_VALUE = "hv" ;
  
  public ParamHeaderRoutePredicateFactory() {
    super(Config.class);
  }


  @Override
  public List<String> shortcutFieldOrder() {
    return Arrays.asList(PARAM_KEY, PARAM_VALUE, HEADER_KEY, HEADER_VALUE) ;
  }


  @Override
  public Predicate<ServerWebExchange> apply(Config config) {
    return new GatewayPredicate() {
      @Override
      public boolean test(ServerWebExchange t) {
        String pv = t.getRequest().getQueryParams().getFirst(config.param) ;
        String hv = t.getRequest().getHeaders().getFirst(config.header) ;
        System.err.printf("請(qǐng)求參數(shù): %s=%s, 請(qǐng)求頭: %s=%s%n", config.param, pv, config.header, hv) ;
        return config.pv.equals(pv) && config.hv.equals(hv) ;
      }
    } ;
  }
  
  // 驗(yàn)證配置參數(shù)
  @Validated
  public static class Config {
    @NotEmpty(message = "參數(shù)param不能為空")
    private String param ;
    @NotEmpty(message = "請(qǐng)求header不能為空")
    private String header ;
    private String pv ;
    private String hv ;
    // getter, setter
  }
}

使用

spring:
  cloud:
    gateway:
      default-filters:
      - StripPrefix=1 
      routes:           
      - id: pack-lbs-1
        uri: packlb://cloudAppServiceProvider
        predicates:
        #- ParamHeader=q,java,v,1
        - name: ParamHeader
          args:
            param: q
            pv: java
            header: v
            hv: 1

請(qǐng)求中的q參數(shù)值必須是java,請(qǐng)求header中的v值必須是1,才會(huì)匹配該路徑。

圖片圖片

2.2 自定義網(wǎng)關(guān)過濾器工廠

該過濾器的功能是改寫請(qǐng)求參數(shù)信息。

@Component
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<Config> {
  
  public CustomGatewayFilterFactory() {
    super(Config.class) ;
  }
  
  @Override
  public List<String> shortcutFieldOrder() {
    return super.shortcutFieldOrder() ;
  }


  @Override
  public GatewayFilter apply(Config config) {
    return (exchange, chain) -> {
      Route r = exchange.getAttribute(GATEWAY_ROUTE_ATTR) ;
      Map<String,Object> metadata = r.getMetadata() ;
      System.out.println(metadata) ;
      
      ServerHttpRequest request = exchange.getRequest() ;
      URI uri = request.getURI() ;  
      // 獲取idNo參數(shù),改寫請(qǐng)求參數(shù)idNo數(shù)值
      MultiValueMap<String, String> queryParams = request.getQueryParams();
      String idNo = queryParams.getFirst("idNo") ;
      // 對(duì)idNo參數(shù)進(jìn)行解密操作(只是演示)
      idNo = idNo + "-new" ;
      // 這里為了演示簡單,不考慮多個(gè)參數(shù)的情況
      String query = "idNo=" + idNo ;
      System.out.println(uri) ;
      URI newUri = UriComponentsBuilder.fromUri(uri).replaceQuery(query).build(true).toUri() ;
      System.out.println(newUri) ;
      Builder builder = request.mutate().uri(newUri) ;
      return chain.filter(exchange.mutate().request(builder.build()).build()) ;
    };
  }
  public static class Config {
  }
}

使用

spring:
  cloud:
    gateway:
      routes:
      - id: demo-service-01
        uri: http://localhost:8088
        predicates:
        - name: Path
          args:
            a: /api-x/**
        filters:
        - name: Custom

測試

圖片圖片

Spring Cloud Gateway 的自定義謂詞工廠和網(wǎng)關(guān)過濾器工廠為開發(fā)者提供了靈活性和擴(kuò)展性,使得開發(fā)者可以根據(jù)業(yè)務(wù)需求自定義路由條件和請(qǐng)求處理邏輯。通過實(shí)現(xiàn)這些自定義組件,你可以輕松地構(gòu)建出滿足特定業(yè)務(wù)需求的 API 網(wǎng)關(guān)。

以上是本篇文章全部內(nèi)容,希望對(duì)你有幫助。

責(zé)任編輯:武曉燕 來源: Spring全家桶實(shí)戰(zhàn)案例源碼
相關(guān)推薦

2023-01-26 01:41:27

核心全局過濾器

2023-04-14 09:01:25

2021-01-14 08:13:39

Spring Clou應(yīng)用內(nèi)置過濾器

2024-12-06 14:34:00

Spring過濾器

2023-02-15 08:12:19

http超時(shí)過濾器

2023-07-24 08:00:56

客戶端訪問指定

2022-05-16 08:22:11

網(wǎng)關(guān)過濾器路由

2010-02-24 14:59:52

WCF自定義過濾器

2017-04-12 14:43:01

Spring ClouZuul過濾器

2017-09-15 23:29:53

Spring Clou微服務(wù)架構(gòu)過濾器

2017-05-04 22:30:17

Zuul過濾器微服務(wù)

2021-11-04 10:11:02

Sentinel網(wǎng)關(guān)限流

2021-01-14 07:54:19

Spring Clou應(yīng)用路由

2022-05-13 08:23:07

Zuul微服務(wù)Zuul過濾器

2021-07-05 15:22:03

Servlet過濾器客戶端

2024-01-05 09:04:35

隆過濾器數(shù)據(jù)結(jié)構(gòu)哈希函數(shù)

2024-11-04 08:45:48

布隆過濾器元數(shù)據(jù)指紋值

2022-02-16 23:58:41

Spring過濾器驗(yàn)證碼

2009-07-08 15:30:56

Servlet過濾器

2009-07-08 16:07:04

Servlet過濾器配
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)