《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 jianshu.com/p/dca2d440bd6d 「晓阳emmm」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

路由断言Factories

Spring Cloud Gateway 是路由使用spring webfluxHandler Mapping为基础结构实现的。
Spring Cloud Gateway包含许多内置的路由断言Factories。这些断言都匹配HTTP请求的不同属性。多个路由断言Factories可以通过 and 组合使用

一些默认的路由断言 Factory配置

#路由断言
spring.cloud.gateway.routes[0].predicates[0]=Path=/auth/**
#After路由断言,使用一个日期时间,在该日期以后请求才被匹配
spring.cloud.gateway.routes[0].predicates[1]=After=2019-09-12T17:42:47.789-07:00
#Before路由断言,使用一个日期时间,在该日期之前才被匹配
spring.cloud.gateway.routes[0].predicates[1]=Before=2019-09-12T17:42:47.789-07:00
#Between路由断言,使用两个参数用逗号分隔,在两个时间范围内的请求才被匹配
spring.cloud.gateway.routes[0].predicates[1]=Between=2019-09-12T17:42:47.789-07:00,2019-10-12T17:42:47.789-07:00

除了这些还有许多内置的路由断言Factories可以去官网的文档查看。

自定义路由Predicate 断言

spring-cloud-gateway的官方文档中没有给出自定义Predicate ,只留下一句TODO: document writing Custom Route Predicate Factories

创建RoutePredicateFactory

/**
* @author WXY
*/
@Slf4j
public class TokenRoutePredicateFactory extends AbstractRoutePredicateFactory<TokenRoutePredicateFactory.Config> {


private static final String DATETIME_KEY = "headerName";

public TokenRoutePredicateFactory() {
super(Config.class);
}

@Override
public List<String> shortcutFieldOrder() {
return Collections.singletonList(DATETIME_KEY);
}

@Override
public Predicate<ServerWebExchange> apply(Config config) {
log.debug("TokenRoutePredicateFactory Start...");
return exchange -> {
//判断header里有放token
HttpHeaders headers = exchange.getRequest().getHeaders();
List<String> header = headers.get(config.getHeaderName());
log.info("Token Predicate headers:{}", header);
return header.size() > 0;
};
}

public static class Config {
/**
* 传输token header key
*/
private String headerName;

public String getHeaderName() {
return headerName;
}

public void setHeaderName(String headerName) {
this.headerName = headerName;
}
}
}

继承AbstractRoutePredicateFactory主要实现其中的两个方法

shortcutFieldOrder()-Config对应的字段

Predicate apply(Config config)-具体的逻辑

还有就是构造方法传入用来装配置的类程序会自动把配置的value传入apply中的入参

初始化RoutePredicateFactory为bean

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* @author WXY
*
*/
@Configuration
public class RoutesConfiguration {

@Bean
public TokenRoutePredicateFactory initTokenRoutePredicateFactory(){
return new TokenRoutePredicateFactory();
}

}

或者直接在TokenRoutePredicateFactory类上加@Component也行

配置自定义的Predicate

使用属性文件配置自定义Predicate

spring.cloud.gateway.routes[1].predicates[1]=Token=Authorization

其中Toekn为命名RoutePredicateFactory时的前面部分,所以在定义RoutePredicateFactory时类名必须后缀为RoutePredicateFactory,否则找不到自定义的Predicate

使用代码配置

/**
* @author WXY
*
*/
@Configuration
public class RoutesConfiguration {
/**
* 代码配置路由
*/
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route(predicateSpec ->
predicateSpec.path("/order/**")
.and().asyncPredicate(initTokenRoutePredicateFactory().applyAsync(config -> config.setHeaderName("Authorization")))
.uri("lb://order-service").id("order-service")
).build();
}

@Bean
public TokenRoutePredicateFactory initTokenRoutePredicateFactory(){
return new TokenRoutePredicateFactory();
}

}

使用代码配置自定义Predicate,主要使用asyncPredicate方法,把所需的自定义RoutePredicateFactory对象传进去配置applyAsync方法传入配置的属性。

spring-cloud-gateway中文文档
示例代码
个人博客

文章目录
  1. 1. 路由断言Factories
  2. 2. 一些默认的路由断言 Factory配置
  3. 3. 自定义路由Predicate 断言
    1. 3.1. 创建RoutePredicateFactory
    2. 3.2. 初始化RoutePredicateFactory为bean
  4. 4. 配置自定义的Predicate
    1. 4.1. 使用属性文件配置自定义Predicate
    2. 4.2. 使用代码配置