注意 代码中的注释
package cn.haiwang.gatewayservice.predicate;
import lombok.Data;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
/**
* 开发个自定义的断言工厂,编号间隔超过30才能访问
*/
/* 要注册成spring bean */
@Component
/**
* 1 文件命名需要以 RoutePredicateFactory 结尾
* 2 必须继承AbstractRoutePredicateFactory<自定义的内部类>
*/
public class BianhaoRoutePredicateFactory extends AbstractRoutePredicateFactory<BianhaoRoutePredicateFactory.PeizhiInfo> {
/* 3 必须用无参构造 */
public BianhaoRoutePredicateFactory() {
super(BianhaoRoutePredicateFactory.PeizhiInfo.class);
}
/* 4 通过apply进行逻辑判断 true就是匹配成功 false匹配失败 */
@Override
public Predicate<ServerWebExchange> apply(PeizhiInfo config) {
Integer minId = config.getMinId();
Integer maxId = config.getMaxId();
return new GatewayPredicate() {
@Override
public boolean test(ServerWebExchange serverWebExchange) {
if(minId<0 || maxId>100) return false;
return ((maxId-minId)/2)>30?true:false;
}
};
}
@Override
/* 5 需要结合shortcutFieldOrder进行绑定,注意看 49行和55,56行,名称要对应上 */
public List<String> shortcutFieldOrder() {
return Arrays.asList("minId","maxId");
}
@Data
/* 6 必须声明静态内部类 声明属性来接收 配置文件中对应的断言的信息 */
public static class PeizhiInfo {
private Integer minId;
private Integer maxId;
}
}
使用自定义断言测试
spring:
cloud:
gateway:
routes:
- id: product-fuwu
uri: lb://product-service
predicates:
- Path=/product/**
- Bianhao=5,75 #使用断言