SpringCloudGateway笔记(3)-Predict与自定义Predict

Predict与自定义Predict

Predict(谓词)用于匹配用户的请求,来选择是否要路由

Spring Cloud Gateway自带的谓词工程列表

Predict说明
After Route Predicate请求的时候发生在指定时间之后
Before Route Predicate请求发生在指定时间之前
Between Route Predicate请求发生在指定时间之间
Cookie Route Predicate请求带有指定的cookie,且值包含在指定的值列表里面
Header Route Predicate请求头带有指定的key,value满足规则
Host Route Predicate主机满足规则
Method Route Predicate指定HTTP Method
Path Route Predicate指定路径规则
Query Route Predicate指定请求参数
RemoteAddr Route Predicate请求ip满足规则

写个demo测试一下

路由配置

      routes:
        - id: spring-cloud-client-demo
          uri: lb://spring-cloud-client-demo
          predicates:
            - Path=/client/**
            - Method=GET
            - Header=X-Request-Id, \d+
          filters:
            - AddRequestHeader=X-Request-Foo, Bar
            - StripPrefix=1

postman 请求 http://localhost:10001/client/demo/get?param=aaa

返回

{
    "timestamp": 1558354136596,
    "path": "/client/demo/get",
    "status": 404,
    "error": "Not Found",
    "message": "No matching handler"

添加头

X-Request-Id =1

再从请求,得到正确的返回

自定义Predict

启动的时候可以看到所有存在的predict

2019-05-20 19:39:11.389  INFO 8156 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [After]
2019-05-20 19:39:11.389  INFO 8156 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Before]
2019-05-20 19:39:11.389  INFO 8156 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Between]
2019-05-20 19:39:11.389  INFO 8156 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Cookie]
2019-05-20 19:39:11.389  INFO 8156 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Header]
2019-05-20 19:39:11.389  INFO 8156 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Host]
2019-05-20 19:39:11.390  INFO 8156 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Method]
2019-05-20 19:39:11.390  INFO 8156 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Path]
2019-05-20 19:39:11.390  INFO 8156 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Query]
2019-05-20 19:39:11.390  INFO 8156 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [ReadBodyPredicateFactory]
2019-05-20 19:39:11.390  INFO 8156 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [RemoteAddr]
2019-05-20 19:39:11.390  INFO 8156 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Weight]
2019-05-20 19:39:11.390  INFO 8156 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [CloudFoundryRouteService]

编写自己的Predict

package com.mt.demo.gateway.predict;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;

import javax.validation.constraints.NotEmpty;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;

/**
 * UserRoutePredicateFactory
 *
 * @author mt.luo
 * @description:
 */
@Slf4j
@Component
@Order(1)
public class UserRoutePredicateFactory extends AbstractRoutePredicateFactory<UserRoutePredicateFactory.Config> {


    private String user = "mt";

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

    @Override
    public ShortcutType shortcutType() {
        return ShortcutType.GATHER_LIST;
    }

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

    @Override
    public Predicate<ServerWebExchange> apply(UserRoutePredicateFactory.Config config) {
        log.info("================config: {}", config);
        return exchange -> {
            if (config.sources.contains(user)) {
                return true;
            }
            return false;
        };
    }

    @Validated
    public static class Config {
        @NotEmpty
        private List<String> sources = new ArrayList<>();

        public List<String> getSources() {
            return sources;
        }

        public UserRoutePredicateFactory.Config setSources(List<String> sources) {
            this.sources = sources;
            return this;
        }

        public UserRoutePredicateFactory.Config setSources(String... sources) {
            this.sources = Arrays.asList(sources);
            return this;
        }
    }
}

重启程序可以看到,以及存在了自定义的Predicate

2019-05-20 20:24:09.325  INFO 3448 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [User]
2019-05-20 20:24:09.325  INFO 3448 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [After]
2019-05-20 20:24:09.325  INFO 3448 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Before]
2019-05-20 20:24:09.325  INFO 3448 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Between]
2019-05-20 20:24:09.326  INFO 3448 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Cookie]
2019-05-20 20:24:09.326  INFO 3448 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Header]
2019-05-20 20:24:09.326  INFO 3448 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Host]
2019-05-20 20:24:09.326  INFO 3448 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Method]
2019-05-20 20:24:09.326  INFO 3448 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Path]
2019-05-20 20:24:09.326  INFO 3448 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Query]
2019-05-20 20:24:09.326  INFO 3448 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [ReadBodyPredicateFactory]
2019-05-20 20:24:09.326  INFO 3448 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [RemoteAddr]
2019-05-20 20:24:09.326  INFO 3448 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Weight]
2019-05-20 20:24:09.326  INFO 3448 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [CloudFoundryRouteService]

添加配置

      routes:
        - id: spring-cloud-client-demo
          uri: lb://spring-cloud-client-demo
          predicates:
            - Path=/client/**
            - Method=GET
            - Header=X-Request-Id, \d+
            - User=mt
          filters:
            - AddRequestHeader=X-Request-Foo, Bar
            - StripPrefix=1

请求http://localhost:10001/client/demo/get?param=aaa

正常返回

把User=mt换成User=mm

则返回异常

{
    "timestamp": 1558355190499,
    "path": "/client/demo/get",
    "status": 404,
    "error": "Not Found",
    "message": "No matching handler"
}

欢迎关注微信交流
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值