Gateway Predicate断言(谓词)

是什么

Spring Cloud Gateway匹配路由作为Spring WebFlux HandlerMapping基础设施的一部分。 Spring Cloud Gateway包含许多内置的路由谓词工厂。 所有这些谓词都匹配HTTP请求的不同属性。 您可以使用逻辑 and 语句来联合收割机组合多个路由谓词工厂。

Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理。

分类

                                                

idea启动项目打印的日志: 

常用的内置Route Predicate

id:我们自定义的路由 ID,保持唯一
uri:目标服务地址
predicates:路由条件,Predicate接受一个输入参数返回一个布尔值。
        该属性包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)

配置语法总体概述

2种配置方式,二选一

短格式配置

完全展开配置

测试地址

http://localhost:9527/pay/gateway/get/1

After Route Predicate

After路由谓词工厂接受一个datetime参数(这是一个java ZonedDateTime)。

在指定日期时间之后才可以请求该地址。

spring:cloud:gateway:routes:- id: after_routeuri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- After=2024-04-24T23:56:23.970133500+08:00[Asia/Shanghai]

如何获取ZonedDateTime

import java.time.ZonedDateTime;public class Testtt {public static void main(String[] args) {ZonedDateTime zonedDateTime = ZonedDateTime.now().plusMinutes(1);   // 1分钟之后的时间System.out.println(zonedDateTime);}
}

Before Route Predicate

Before路由谓词工厂接受一个datetime参数(这是一个java ZonedDateTime)。

在指定日期时间之前才可以请求该地址。

spring:cloud:gateway:routes:- id: before_routeuri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- Before=2024-04-25T00:02:10.783066100+08:00[Asia/Shanghai]

Between Route Predicate

Between路由谓词工厂接受两个参数,datetime1和datetime2(都是Java ZonedDateTime)。用英文逗号分隔。

在datetime1之后和datetime2之前可以请求该地址。

datetime2参数必须在datetime1之后。

spring:cloud:gateway:routes:- id: between_routeuri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- Between=2024-04-24T23:56:23.970133500+08:00[Asia/Shanghai], 2024-04-25T00:02:10.783066100+08:00[Asia/Shanghai]

Cookie Route Predicate

Cookie Route Predicate需要两个参数,一个是 Cookie name ,一个是正则表达式。
路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。

spring:cloud:gateway:routes:- id: cookie_routeuri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- Cookie=chocolate, ch.p

Header Route Predicate

Header路由谓词工厂接受两个参数,header和regexp(这是一个Java正则表达式)。

此谓词与具有给定名称且其值与正则表达式匹配的标头匹配。

spring:cloud:service-name: ${spring.application.name}gateway:routes:- id: header_routeuri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- Header=X-Request-Id, [0-9]+

Host Route Predicate

Host Route Predicate 接收一组参数,一组匹配的域名列表,这个模板是一个 ant 分隔的模板,用.号作为分隔符。

它通过参数中的主机地址作为匹配规则。

spring:cloud:gateway:routes:- id: pay_routh1uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- Host=**.somehost.org,**.anotherhost.org

Path Route Predicate

路径相匹配的进行路由

spring:cloud:gateway:routes:- id: pay_routh1uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**

Query Route Predica

Query路由谓词工厂有两个参数:一个必需的param和一个可选的regexp(这是一个Java正则表达式)。

请求包含param查询参数。

spring:cloud:gateway:routes:- id: pay_routh1uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- Query=green

RemoteAddr route predicate

RemoteAddr路由断言工厂采用sources的列表(最小大小为1),这些列表是CIDR表示法(IPv4或IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是IP地址,16是子网掩码)。

什么是计算机网络中的 CIDR

spring:cloud:gateway:routes:- id: pay_routh1uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- RemoteAddr=192.168.31.171/24

Method Route Predicat

Method路由谓词工厂接受一个methods参数,它是一个或多个参数:要匹配的HTTP方法。

配置某个请求地址,只能用Get/Post方法访问,方法限制。

spring:cloud:gateway:routes:- id: pay_routh1uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- Method=GET,POST

Weight Route Predicat

Weight路由谓词工厂有两个参数:group和weight(一个int)。计算每组的权重。 

spring:cloud:gateway:routes:- id: weight_highuri: https://weighthigh.orgpredicates:- Weight=group1, 8- id: weight_lowuri: https://weightlow.orgpredicates:- Weight=group1, 2

该路由将把80%的流量转发到weightthigh.org,20%的流量转发到weightlow.org。

自定义断言

规则:

        要么继承AbstractRoutePredicateFactory抽象类

        要么实现RoutePredicateFactory接口

        开头任意取名,但是必须以RoutePredicateFactory后缀结尾

仿照:AfterRoutePredicateFactory

自定义XXXRoutePredicateFactory

1. 新建类名XXX需要以RoutePredicateFactory结尾,并继承AbstractRoutePredicateFactory类。

2. 重写apply方法

3. 新建apply方法所需要的静态内部类MyRoutePredicateFactory.Config,这个Config类就是我们的路由断言规则,重要

4. 空参构造方法,内部调用super

5. 重载 shortcutFieldOrder 方法

        不重载,配置的时候只能完全展开配置,不能短格式配置。

package com.yq.springcloud.predicate;import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;public class MyRoutePredicateFactory extends AbstractRoutePredicateFactory<MyRoutePredicateFactory.Config> {public static final String PARAM_USERTYPE = "userType";public MyRoutePredicateFactory() {super(Config.class);}/*** 返回有关参数数和快捷方式分析顺序的提示* @return*/@Overridepublic List<String> shortcutFieldOrder() {return Collections.singletonList(PARAM_USERTYPE);}@Overridepublic Predicate<ServerWebExchange> apply(Config config) {return serverWebExchange -> {//检查request的参数里面,userType是否为指定的值,符合配置就通过String userType = serverWebExchange.getRequest().getQueryParams().getFirst(PARAM_USERTYPE);if (userType == null) return false;//如果说参数存在,就和config的数据进行比较if (userType.equals(config.getUserType())) {return true;}return false;};}@Validated@Datapublic static class Config {@NotBlankprivate String userType; //钻、金、银等用户等级}
}

自定义GatewayAutoConfiguration

仿照:org.springframework.cloud.gateway.config.GatewayAutoConfiguration

将自己自定义的断言加入IOC

package com.yq.springcloud.config;import com.yq.springcloud.predicate.MyRoutePredicateFactory;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration;
import org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration;
import org.springframework.cloud.gateway.config.GatewayReactiveLoadBalancerClientAutoConfiguration;
import org.springframework.cloud.gateway.config.conditional.ConditionalOnEnabledPredicate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMissing = true)
@EnableConfigurationProperties
@AutoConfigureBefore({ HttpHandlerAutoConfiguration.class, WebFluxAutoConfiguration.class })
@AutoConfigureAfter({ GatewayReactiveLoadBalancerClientAutoConfiguration.class,GatewayClassPathWarningAutoConfiguration.class })
public class MyGatewayAutoConfiguration {@Bean@ConditionalOnEnabledPredicatepublic MyRoutePredicateFactory myRoutePredicateFactory() {return new MyRoutePredicateFactory();}
}

 配置文件中添加配置断言

spring:cloud:gateway:routes:- id: pay_routh1uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**- My=diamond

测试

1, 启动的时候,已加载到断言中

2. 只有userType=diamond才可以正常访问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/660783.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源、轻量、易用的服务器实时监控工具:哪吒探针

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 哪吒探针是一个开源、轻量、易用的服务器监控、运维工具&#xff0c;它有以下几个特点&#xff1a; 一键安装&#xff1a;可以一键安装面板与 Agent&#xff0c;并且支持 Linux、Windows、MacOS、OpenWRT…

vue+elementUI实现点击左右箭头切换按钮功能

原本是可以用el-tabs做的,就像下面的样式,但是领导说不行 最后用button和element里面的el-carousel(走马灯)结合了一下 长这样 感觉还不错 可以自己改样式 代码如下: <div class"drawer-carousel"><el-carousel arrow"always" :loop"false…

VitePress 构建的博客如何部署到 Netlify 平台?

VitePress 构建的博客如何部署到 Netlify 平台&#xff1f; 前言 之前写了篇文章【使用 Vitepress 构建博客并部署到 github 平台】&#xff0c;有个老哥说 github page 访问太慢了&#xff0c;希望放到 Netlify 平台上面。 咱也没部署过&#xff0c;就试了一下&#xff0c;发…

Python urllib 爬虫入门(1)

本文主要为Python urllib类库函数和属性介绍及一些简单示例。 目录 urllib爬取网页 简单示例 写入文件 其他读取方法 readline函数 readlines函数 response属性 当前环境信息 返回状态码 返回url地址 对url进行编码与解码 写入文件 总结 urllib爬取网页 通过pyth…

2024年第二十六届“华东杯”(B题)大学生数学建模挑战赛|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看华东杯 (B题&#xff09;&#xff01; 第一个问题…

shell脚本,删除30天以前的日志,并将日志推送到nas,但运行出现/bin/bash^M。

删除30天以前的日志 将日志推送到nas中&#xff0c;然后删除pod中的日志 pod挂载到本地 运行出现/bin/bash^M 1、删除30天以前的日志&#xff1a; #! /bin/bash# 定义源日志目录 LOG_DIR/home/log/ # 删除日志 find $LOG_DIR -type f -name "*.log" -mtime 30 -exec…

LLM之RAG实战(三十八)| RAG分块策略之语义分块

在RAG应用中&#xff0c;分块是非常重要的一个环节&#xff0c;常见的分块方法有如下几种&#xff1a; Fixed size chunkingRecursive ChunkingDocument Specific ChunkingSemantic Chunking a&#xff09;Fixed size chunking&#xff1a;这是最常见、最直接的分块方法。我们…

使用 LlamaIndex 和 Llama 2-Chat 构建知识驱动的对话应用程序

文章目录 使用 LlamaIndex 和 Llama 2-Chat 构建知识驱动的对话应用程序Llama 2-70B-聊天LlamaIndex 解决方案概述先决条件使用 SageMaker JumpStart 部署 GPT-J 嵌入模型使用 SageMaker Python SDK 进行部署在 SageMaker Studio 中使用 SageMaker JumpStart 进行部署使用 Sage…

Spring Boot Admin

概述 Spirng Boot Admin 登录页面 Spring Boot Admin是一个用于管理Spring Boot应用的监控工具,它允许你查看和管理多个Spring Boot应用实例。用于应用信息进行界面化的展示&#xff0c;常常辅助我们开发人员快速查看服务运行状态在微服务架构中&#xff0c;Spring Boot Admin通…

QT类之间主窗口子窗口传递*指针对象

1.新建CFile_Operation 类文件 2.主窗口头文件声明&#xff1a; CFile_Operation *cfile_operation; 按钮点击事件函数里面调用子窗口 dialog_debug new Dialog_Debug(this);connect(this,&MainWindow_oq::SendCfile_operation_Obj,dialog_debug,&Dialog_Debug::R…

【算法】【贪心算法】【leetcode】870. 优势洗牌

题目地址&#xff1a;https://leetcode.cn/problems/advantage-shuffle/description/ 题目描述&#xff1a; 给定两个长度相等的数组 nums1 和 nums2&#xff0c;nums1 相对于 nums2 的优势可以用满足 nums1[i] > nums2[i] 的索引 i 的数目来描述。 返回 nums1 的任意排列&…

【ZYNQ】Zynq 开发流程

Zynq 芯片架构由嵌入式处理器&#xff08;Processing System, PS&#xff09;与可编程逻辑&#xff08;Programmable Logic, PL&#xff09;&#xff0c;以及 PS 与 PL 之间的互联总线组成。本文主要介绍 Xilinx Zynq 芯片开发所使用的软件&#xff0c;包括 Vivado IDE 与 Xili…