首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >SpringCloudGateway笔记(3)-Predict与自定义Predict

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

作者头像
yingzi_code
发布于 2019-08-30 14:12:27
发布于 2019-08-30 14:12:27
1.7K0
举报

版权声明:本文为博主原创文章,遵循 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
AI代码解释
复制
      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
AI代码解释
复制
{
    "timestamp": 1558354136596,
    "path": "/client/demo/get",
    "status": 404,
    "error": "Not Found",
    "message": "No matching handler"

添加头

X-Request-Id =1

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

自定义Predict

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

代码语言:javascript
AI代码解释
复制
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
AI代码解释
复制
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
AI代码解释
复制
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
AI代码解释
复制
      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
AI代码解释
复制
{
    "timestamp": 1558355190499,
    "path": "/client/demo/get",
    "status": 404,
    "error": "Not Found",
    "message": "No matching handler"
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年05月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringCloudGateway笔记(8)-权重
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
1.8K0
Nacos + Spring Cloud Gateway动态路由配置
具体的Nacos怎么配置就不介绍了,可以参考阿里巴巴的官方介绍,这里通过windows直接本地启动开启单机模式,登录Nacos Console,创建dev的namespace,在dev下的默认分组下创建gateway-router的dataId
BUG弄潮儿
2021/06/25
7.6K0
Nacos + Spring Cloud Gateway动态路由配置
聊聊spring cloud gateway的RouteLocator
本文主要研究一下spring cloud gateway的RouteLocator
code4it
2018/09/17
3K0
当Tomcat遇上Netty
分部给到的异常日志大概是这样(鉴于公司规定禁止截图禁止拍照禁止外传任何信息,下面是我网上找到一张类似的报错):
彤哥
2020/05/22
1.3K1
当Tomcat遇上Netty
SpringCloudGateway笔记(2)-filter与自定义filter
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
2.2K0
Spring Cloud Gateway解析
Gateway( 网关),顾名思义,是出现在系统边界上的一个面向API或应用服务的、串行集中式的强管控服务,这里我们讨论的边界可以基于企业IT系统的边界,当然,可以理解为企业级应用防火墙,其目标主要起到隔离外部访问与内部系统交互的作用。在微服务概念的流行之前,网关就已经诞生了,在面向SOA体系中已经成熟,然而,随着微服务体系的快速发展,更进一步将Gateway推向更高的浪口。与其说网关催生了微服务体系,不如说微服务体系拥抱了网关。
Luga Lee
2021/12/09
1K0
Spring Cloud Gateway解析
netty案例,netty4.1中级拓展篇一《Netty与SpringBoot整合》
在实际的开发中,我们需要对netty服务进行更多的操作,包括;获取它的状态信息、启动/停止、对客户端用户强制下线等等,为此我们需要把netty服务加入到web系统中,那么本章节介绍如何将Netty与SpringBoot整合。
小傅哥
2020/02/13
1.3K0
netty案例,netty4.1中级拓展篇一《Netty与SpringBoot整合》
Kurento实战之一:KMS部署和体验
《kurento实战》系列是欣宸原创的音视频领域实战专题,旨在通过实战学习主流的实时音视频技术,很荣幸与您一同开启这段精彩的旅程;
程序员欣宸
2022/05/06
1.1K0
Kurento实战之一:KMS部署和体验
Spring Boot 搭建 ELK,这才是正确看日志的方式!
在看大型网站的中间件技术,对于Elasticsearch有点兴趣,所以将配置流程记录了一下。
PHP开发工程师
2021/05/17
2.4K0
Spring Boot 搭建 ELK,这才是正确看日志的方式!
SpringCloudGateway笔记(1)-介绍与基础使用
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
4980
7.Prometheus监控进阶之自定义监控业务应用
描述: Prometheus 可以通过直接测控或者客户端库来测控业务或者应用,目前我们可以采用多种不同语言编写客户端库包括(GO/Python/Java/Ruby)等客户端;
全栈工程师修炼指南
2022/09/29
2.6K0
7.Prometheus监控进阶之自定义监控业务应用
二进制包20分钟快速安装部署 Kubernetes v1.14.0 集群
通过几个小时的努力,完成本次部署脚本的编写,安装脚本支持任意多个节点,主要通过三个脚本实现本次安装。
耕耘实录
2019/07/04
7220
Spring Boot 自定义事件
系统启动时,执行顺序为:application starting > application prepared > application ready
吟风者
2019/08/15
1.2K0
Spring Boot 自定义事件
学习一下SpringCloudGateWay
SpringCloudGateway 的文档上明确写了, 项目是基于Spring Boot 2.x, Spring WebFlux进行构建. SpringBoot项目在项目启动的时候会主动探测 deduceFromClasspath 当前容器的环境并进行构建,WebFlux和SpringMvc的功能和结构很类似, 但是由于响应式编程和传统的同步阻塞式的编程差异较大, 因此WebFlux重复造了一些轮子, 如:
eeaters
2022/01/27
5800
学习一下SpringCloudGateWay
netty案例,netty4.1中级拓展篇六《SpringBoot+Netty+Elasticsearch收集日志存储》
在实际的开发场景中,我们希望将大量的业务以及用户行为数据存储起来用于分析处理,但是由于数据量较大且需要具备可分析功能所以将数据存储到文件系统更为合理。尤其是一些互联网高并发级应用,往往数据库都采用分库分表设计,那么将这些分散的数据通过binlog汇总到一个统一的文件系统就显得非常有必要。
小傅哥
2020/02/28
7570
netty案例,netty4.1中级拓展篇六《SpringBoot+Netty+Elasticsearch收集日志存储》
Elastic Stack之 Elasticsearch 6.7.1版本单机版安装、集群版安装
1、截至目前Elasticsearch 版本已经更新到了7.10.1版本了,这里先使用Elasticsearch 6.7.1版本,给一个下载地址,如下所示:
别先生
2021/01/13
1.5K0
网关 Spring-Cloud-Gateway 源码解析 —— 网关初始化
本文主要基于 Spring-Cloud-Gateway 2.0.X M4 1. 概述 2. GatewayClassPathWarningAutoConfiguration 3. GatewayLoadBalancerClientAutoConfiguration 4. GatewayRedisAutoConfiguration 5. GatewayAutoConfiguration 1. 概述 本文主要分享 Spring Cloud Gateway 启动初始化的过程。 在初始化的过程中,涉及到的组件会较多
芋道源码
2018/06/13
3.7K0
netty案例,netty4.1中级拓展篇一《Netty与SpringBoot整合》
在实际的开发中,我们需要对netty服务进行更多的操作,包括;获取它的状态信息、启动/停止、对客户端用户强制下线等等,为此我们需要把netty服务加入到web系统中,那么本章节介绍如何将Netty与SpringBoot整合。
小傅哥
2020/07/14
1.1K0
netty案例,netty4.1中级拓展篇一《Netty与SpringBoot整合》
Route加载流程
网关服务核心功能是路由转发,即将接收的请求如何正确的路由到下层具体的服务模块。下面分析下这些路由信息构建的流程。
Reactor2020
2023/03/22
1K0
Route加载流程
Spring Cloud Gateway源码解析实战 - 路由工厂
基于日期时间的断言工厂主要是通过日期时间对请求进行断言,判断请求时间是否符合配置的时间,实现类主要有三种,分别如下:
JavaEdge
2021/02/22
5060
Spring Cloud Gateway源码解析实战 - 路由工厂
相关推荐
SpringCloudGateway笔记(8)-权重
更多 >
领券
社区新版编辑器体验调研
诚挚邀请您参与本次调研,分享您的真实使用感受与建议。您的反馈至关重要,感谢您的支持与参与!
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场