gateway 路由斷言工廠配置及自定義斷言配置


SpringCloud Gateway 內置的斷言工廠:
官方文檔:
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

 

內置類型:
 
1、基於Datetime類型的斷言工廠
此類型的斷言根據時間做判斷,主要有三個: 
AfterRoutePredicateFactory: 接收一個日期參數,判斷請求日期是否晚於指定日期 
BeforeRoutePredicateFactory: 接收一個日期參數,判斷請求日期是否早於指定日期 
BetweenRoutePredicateFactory: 接收兩個日期參數,判斷請求日期是否在指定時間段內
‐ After=2019‐12‐31T23:59:59.789+08:00[Asia/Shanghai]

2、基於遠程地址的斷言工廠

RemoteAddrRoutePredicateFactory:接收一個IP地址段,判斷請求主機地址是否在地址段中

3、基於Cookie的斷言工廠

CookieRoutePredicateFactory:接收兩個參數,cookie 名字和一個正則表達式;判斷請求 cookie是否具有給定名稱且值與正則表達式匹配。

‐Cookie=chocolate, ch.
4、基於Header的斷言工廠
HeaderRoutePredicateFactory:接收兩個參數,標題名稱和正則表達式。 判斷請求Header是否具有給定名稱且值與正則表達式匹配。 

‐Header=X‐Request‐Id, \d+

5、基於Host的斷言工廠

HostRoutePredicateFactory:接收一個參數,主機名模式。判斷請求的Host是否滿足匹配規則。 

‐Host=**.testhost.org

6、基於Method請求方法的斷言工廠

MethodRoutePredicateFactory:接收一個參數,判斷請求類型是否跟指定的類型匹配。 

‐Method=GET
7、基於Path請求路徑的斷言工廠
PathRoutePredicateFactory:接收一個參數,判斷請求的URI部分是否滿足路徑規則。

‐Path=/foo/{segment}

8、基於Query請求參數的斷言工廠

QueryRoutePredicateFactory :接收兩個參數,請求param和正則表達式, 判斷請求參數是否具有給定名稱且值與正則表達式匹配。 
‐Query
=baz, ba.
9、基於路由權重的斷言工廠
WeightRoutePredicateFactory:接收一個[組名,權重], 然后對於同一個組內的路由按照權重轉發

 routes: ‐id: weight_route1 uri: host1 predicates: ‐ Path=/product/** ‐ Weight=group3, 7 ‐id: weight_route2 uri: host2 predicates: ‐ Path=/product/** ‐ Weight= group3, 9

 

自定義路由斷言工廠

       自定義路由斷言工廠需要繼承 AbstractRoutePredicateFactory 類,重寫 apply 方法的邏輯。在 apply 方法中可以通過exchange.getRequest() 拿到 ServerHttpRequest 對象,從而可以獲取到請求的參數、請求方式、請求頭等信息
 
1、 必須spring組件 bean 
2. 類必須加上RoutePredicateFactory作為結尾
3. 必須繼承AbstractRoutePredicateFactory
4. 必須聲明靜態內部類 聲明屬性來接收 配置文件中對應的斷言的信息
5. 需要結合shortcutFieldOrder進行綁定
6.通過apply進行邏輯判斷 true就是匹配成功 false匹配失敗

 

代碼實現:
package com.geteway.vn.predicates;

import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;

import javax.validation.constraints.NotEmpty;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * @author vn
 * @version 1.0
 * @date 2022/3/10 21:58
 */

@Component
public class CheckAuthRoutePredicateFactory
        extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.Config> {



    public CheckAuthRoutePredicateFactory() {
        super(CheckAuthRoutePredicateFactory.Config.class);
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("name");
    }

    @Override
    public Predicate<ServerWebExchange> apply(CheckAuthRoutePredicateFactory.Config config) {
        return new GatewayPredicate() {
            @Override
            public boolean test(ServerWebExchange exchange) {

                if(config.getName().equals("xushu")){
                    return true;
                }
                return false;
            }

        };
    }


    // 用於接收配置文件中 斷言的信息
    @Validated
    public static class Config {
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

}

 

配置類:

server:
  port: 8088
spring:
  application:
    name: api-gateway
  cloud:
    gateway:   # gateway的配置
      routes:  #路由規則
        - id: order_route  # 路由的唯一標識,路由到order
          uri: lb://order-service  #需要轉發的地址   lb: 使用nacos中的本地負載均衡策略  order-service服務名
          predicates:  #斷言規則 用於路由規則的匹配
            - Path=/order-serv/**    # http://localhost:8088/order-serv/vn/order 路由轉到  http://localhost:80/order-serv/vn/order
           - CheckAuth=xushu1     #自定義CheckAuth斷言工廠
       filters: - StripPrefix=1 # 轉發之前去掉1層路徑  變成 -> http://localhost:80/vn/order
   nacos: server-addr: 192.168.43.197:8848 discovery: username: nacos password: nacos

 

 
 
 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM