0
点赞
收藏
分享

微信扫一扫

33.Gateway自定义路由断言

Gascognya 2021-09-21 阅读 46

自定义路由断言工厂

  • 我们来设定一个场景:假设我们的应用仅仅让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 条评论