0
点赞
收藏
分享

微信扫一扫

33.Gateway自定义路由断言

Gascognya 2021-09-21 阅读 49

自定义路由断言工厂

  • 我们来设定一个场景:假设我们的应用仅仅让age在(min,max)之间的人来访问。
  • 第1步:在配置文件中,添加一个age的断言配置
spring:
  application:
    name: api-gateway
  cloud:
    nacos:
      discovery:
        server-addr:192.168.110.130:8848
    gateway:
      routes: # 路由数组[]
        - id: product_route # 当前路由的标识,要求唯一,默认是UUID
          uri: http://localhost:8081 # 请求最终要转发的地址
          order: 1 # 路由的优先级,数字越小代表路由的优先级越高
          predicates:  #断言(条件判断,返回值是Boolean,转发请求要求满足的条件)
            - Path=/product-serv/** # 当请求路径满足path指定的规则时,此路由信息才会正常转发
            - Age=18,16 # 限制年龄只有在18到60之间的人能访问
          filters: # 过滤器(在请求传递过程中 对请求做一些手脚)
            - StripPrefix=1 # 在请求转发之前去掉一层路径
  • 第2步:自定义一个断言工厂,实现断言方法
/**
 * 这是一个自定义的路由断言工厂类
 *  要求:
 *      1.名字必须是 配置+RoutePredicateFactory
 *      2.必须继承AbstractRoutePredicateFactory<配置类>
 */
@Component
public class AgeRoutePredicateFactory extends AbstractRoutePredicateFactory<AgeRoutePredicateFactory.Config> {

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

    /**
     * 读取配置文件中的参数值 给他赋值到配置类中属性上
     * @return
     */
    public List<String> shortcutFieldOrder() {
        //这个位置的顺序必须跟配置文件中的值的顺序对应
        return Arrays.asList("minAge","maxAge");
    }

    /**
     * 断言逻辑
     * @param config
     * @return
     */
    public Predicate<ServerWebExchange> apply(AgeRoutePredicateFactory.Config config) {
        return new Predicate<ServerWebExchange>() {
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                //1.接收前台参数传入的age参数
                String ageStr = serverWebExchange.getRequest().getQueryParams().getFirst("age");
                //2.先判断是否为空
                if(!StringUtils.isEmpty(ageStr)){
                    //3.如果为空,再进行路由逻辑判断
                    int age = Integer.parseInt(ageStr);
                    if (age<config.getMaxAge()&&age>config.getMinAge()){
                        return true;
                    }else {
                        return false;
                    }
                }
                return false;
            }
        };
    }

    /**
     * 配置类,用于接收配置文件中对应参数
     */
    @Data
    @NoArgsConstructor
    public static class Config {
        private int minAge;
        private int maxAge;
    }
}
举报

相关推荐

0 条评论