自定义路由断言工厂

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

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

spring:
application:
 name: api-gateway
cloud:
 nacos:
  discovery:
   server-addr: 127.0.0.1:8848
 gateway:
  discovery:
   locator:
    enabled: true
  routes:
   - id: product-route
    uri: lb://service-product
    predicates:
     - Path=/product-serv/**
     - Age=18,60 # 限制年龄只有在18到60岁之间的人能访问
    filters:
     - StripPrefix=1

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

package com.itheima.predicates;
//泛型 用于接收一个配置类,配置类用于接收中配置文件中的配置
@Component
public class AgeRoutePredicateFactory
    extends AbstractRoutePredicateFactory<AgeRoutePredicateFactory.Config> {
  public AgeRoutePredicateFactory() {
    super(AgeRoutePredicateFactory.Config.class);
 }
  //用于从配置文件中获取参数值赋值到配置类中的属性上
  @Override
  public List<String> shortcutFieldOrder() {
    //这里的顺序要跟配置文件中的参数顺序一致
    return Arrays.asList("minAge", "maxAge");
 }
  //断言
  @Override
  public Predicate<ServerWebExchange> apply(AgeRoutePredicateFactory.Config
config) {
    return new Predicate<ServerWebExchange>() {
      @Override
      public boolean test(ServerWebExchange serverWebExchange) {
        //从serverWebExchange获取传入的参数
         String ageStr =
        
serverWebExchange.getRequest().getQueryParams().getFirst("age");
        if (StringUtils.isNotEmpty(ageStr)) {
          int age = Integer.parseInt(ageStr);
          return age > config.getMinAge() && age < config.getMaxAge();
       }
        return true;
     }
   };
 }
}
//自定义一个配置类, 用于接收配置文件中的参数
@Data
class Config {
  private int minAge;
  private int maxAge;
}

第4步:启动测试

#测试发现当age在(20,60)可以访问,其它范围不能访问
http://localhost:7000/product-serv/product/1?age=30
http://localhost:7000/product-serv/product/1?age=10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chuxuezhe_987

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值