首页
学习
活动
专区
圈层
工具
发布

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/yingziisme/article/details/90381759

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测试一下

路由配置

代码语言:javascript
复制
      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

返回

代码语言:javascript
复制
{
    "timestamp": 1558354136596,
    "path": "/client/demo/get",
    "status": 404,
    "error": "Not Found",
    "message": "No matching handler"

添加头

X-Request-Id =1

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

自定义Predict

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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]

添加配置

代码语言:javascript
复制
      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

则返回异常

代码语言:javascript
复制
{
    "timestamp": 1558355190499,
    "path": "/client/demo/get",
    "status": 404,
    "error": "Not Found",
    "message": "No matching handler"
}
下一篇
举报
领券