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