断言 (自定义路由断言工厂)

我们来设定一个场景: 假设我们的应用仅仅让age(min,max)之间的人来访问。

1步:在配置文件中,添加一个Age的断言配置

routes:
  - id: product_route   # 路由的唯一标识,只要不重复都可以,如果不写默认会通过UUID产生,一般写成被路由的服务名称
    uri: lb://shop-product  # 被路由的地址
    order: 1                     #表示优先级  数字越小优先级越高
    predicates:                  #断言: 执行路由的判断条件
      - Path=/product_serv/**
      - Age=18,60

2步:自定义一个断言工厂, 实现断言方法

package com.ykq.config;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
//泛型为自定义的一个配置类,该配置类用来存放配置文件中的值
@Component
public class AgeRoutePredicateFactory extends AbstractRoutePredicateFactory<AgeRoutePredicateFactory.Config> {
    public AgeRoutePredicateFactory() {
        super(AgeRoutePredicateFactory.Config.class);
    }
    //读取配置文件中的内容并配置给配置类中的属性
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("minAge","maxAge");
    }

    public Predicate<ServerWebExchange> apply(AgeRoutePredicateFactory.Config config) {
        return (exchange) -> {
            String age = exchange.getRequest().getQueryParams().getFirst("age");
            if(StringUtils.isNotEmpty(age)){
                int a = Integer.parseInt(age);
                return a>=config.minAge && a<=config.maxAge;
            }
            return true;
        };
    }



    @Data
    @NoArgsConstructor
    public static class Config{
        private Integer minAge;
        private Integer maxAge;
    }
}

3步:启动测试

#测试发现当age在(18,60)可以访问,其它范围不能访问

http://localhost:7000/product-serv/product/1?age=30

http://localhost:7000/product-serv/product/1?age=10

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值