前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloudGateway笔记(3)-Predict与自定义Predict

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

作者头像
yingzi_code
发布2019-08-30 22:12:27
1.5K0
发布2019-08-30 22:12:27
举报

版权声明:本文为博主原创文章,遵循 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"
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年05月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 自定义Predict
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档