2.2 路由断言工厂(Route Predicate Factories)配置
    https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories
    作用: 当请求gateway的时候, 使用断言对请求进行匹配, 如果匹配成功就路由转发, 如果匹配失败就返回404
    类型:内置,自定义
    SpringCloud Gateway包括许多内置的断言工厂,所有这些断言都与HTTP请求的不同属性匹配。具体如下:

    • 基于Datetime类型的断言工厂

    此类型的断言根据时间做判断,主要有三个:
    AfterRoutePredicateFactory: 接收一个日期参数,判断请求日期是否晚于指定日期
    BeforeRoutePredicateFactory: 接收一个日期参数,判断请求日期是否早于指定日期
    BetweenRoutePredicateFactory: 接收两个日期参数,判断请求日期是否在指定时间段内
    ZonedDateTime.now()

    1. - After=2019-12-31T23:59:59.789+08:00[Asia/Shanghai]
    • 基于远程地址的断言工厂

    RemoteAddrRoutePredicateFactory:接收一个IP地址段,判断请求主机地址是否在地址段中

    1. - RemoteAddr=192.168.1.1/24
    • 基于Cookie的断言工厂

    CookieRoutePredicateFactory:接收两个参数,cookie 名字和一个正则表达式。 判断请求
    cookie是否具有给定名称且值与正则表达式匹配。

    1. -Cookie=chocolate, ch.
    • 基于Header的断言工厂

    HeaderRoutePredicateFactory:接收两个参数,标题名称和正则表达式。 判断请求Header是否具有给定名称且值与正则表达式匹配。

    1. -Header=X-Request-Id, \d+
    • 基于Host的断言工厂

    HostRoutePredicateFactory:接收一个参数,主机名模式。判断请求的Host是否满足匹配规则。

    1. -Host=**.testhost.org
    • 基于Method请求方法的断言工厂

    MethodRoutePredicateFactory:接收一个参数,判断请求类型是否跟指定的类型匹配。

    1. -Method=GET
    • 基于Path请求路径的断言工厂

    PathRoutePredicateFactory:接收一个参数,判断请求的URI部分是否满足路径规则。

    1. -Path=/foo/{segment}
    • 基于Query请求参数的断言工厂

    QueryRoutePredicateFactory :接收两个参数,请求param和正则表达式, 判断请求参数是否具有给定名称且值与正则表达式匹配。

    1. -Query=baz, ba.
    • 基于路由权重的断言工厂

    WeightRoutePredicateFactory:接收一个[组名,权重], 然后对于同一个组内的路由按照权重转发

    1. routes:
    2. -id: weight_route1
    3. uri: host1
    4. predicates:
    5. -Path=/product/**
    6. -Weight=group3, 1
    7. -id: weight_route2
    8. uri: host2
    9. predicates:
    10. -Path=/product/**
    11. -Weight= group3, 9

    2.2.5 自定义路由断言工厂
    自定义路由断言工厂需要继承 AbstractRoutePredicateFactory 类,重写 apply 方法的逻辑。在 apply 方法中可以通过 exchange.getRequest() 拿到 ServerHttpRequest 对象,从而可以获取到请求的参数、请求方式、请求头等信息。
    1、 必须spring组件 bean
    2. 类必须加上RoutePredicateFactory作为结尾
    3. 必须继承AbstractRoutePredicateFactory
    4. 必须声明静态内部类 声明属性来接收 配置文件中对应的断言的信息
    5. 需要结合shortcutFieldOrder进行绑定
    6.通过apply进行逻辑判断 true就是匹配成功 false匹配失败
    注意: 命名需要以 RoutePredicateFactory 结尾

    1. @Component
    2. @Slf4j
    3. public class CheckAuthRoutePredicateFactory extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.Config> {
    4. public CheckAuthRoutePredicateFactory() {
    5. super(Config.class);
    6. }
    7. @Override
    8. public Predicate<ServerWebExchange> apply(Config config) {
    9. return new GatewayPredicate() {
    10. @Override
    11. public boolean test(ServerWebExchange serverWebExchange) {
    12. log.info("调用CheckAuthRoutePredicateFactory" + config.getName());
    13. if(config.getName().equals("xushu")){
    14. return true;
    15. }
    16. return false;
    17. }
    18. };
    19. }
    20. /**
    21. * 快捷配置
    22. * @return
    23. */
    24. @Override
    25. public List<String> shortcutFieldOrder() {
    26. return Collections.singletonList("name");
    27. }
    28. public static class Config {
    29. private String name;
    30. public String getName() {
    31. return name;
    32. }
    33. public void setName(String name) {
    34. this.name = name;
    35. }
    36. }
    37. }

    yml中配置

    1. spring:
    2. cloud:
    3. gateway:
    4. #设置路由:路由id、路由到微服务的uri、断言
    5. routes:
    6. - id: order_route #路由ID,全局唯一
    7. uri: http://localhost:8020 #目标微服务的请求地址和端口
    8. predicates:
    9. # 测试:http://localhost:8888/order/findOrderByUserId/1
    10. - Path=/order/** #Path路径匹配
    11. #自定义CheckAuth断言工厂
    12. - CheckAuth=xushu