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