Spring Cloud Gateway快速入门(二)——断言工厂

文章目录

  • 前言
  • 1. 什么是Gateway断言工厂
  • 2. 为什么要使用断言
    • 2.1. 调试和开发:
    • 2.2. 防御性编程:
    • 2.3. 文档和可读性:
    • 2.4. 测试:
  • 3. 常用的Gateway断言工厂
    • 3.1 Path断言工厂
    • 3.2 Method断言工厂
    • 3.3 Header断言工厂
    • 3.4 时间断言工厂
  • 4. 自定义Gateway断言工厂
  • 5. 使用Gateway断言工厂
  • 6. gateway断言的功能种类
  • 7. 总结

前言

Spring Cloud Gateway包含许多内置的Route Predicate工厂。所有这些断言都匹配HTTP请求的不同属性。多路由断言工厂通过and组合。
官方提供的路由工厂:
在这里插入图片描述
这些断言工厂的配置方式,参照官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.0.RELEASE/single/spring-cloud-gateway.html

1. 什么是Gateway断言工厂

Gateway断言工厂是Spring Cloud Gateway提供的一种机制,用于定义路由请求的匹配条件。通过使用不同的断言工厂,我们可以根据请求的不同属性(如请求路径、请求方法、请求头等)来匹配和过滤请求。

2. 为什么要使用断言

断言在软件开发中起到了非常重要的作用。下面是一些使用断言的主要原因:

2.1. 调试和开发:

断言可以用于验证程序的正确性,并在出现错误时提供有用的错误信息。通过在关键代码段中插入断言,开发人员可以检查假设是否成立,以及在遇到不符合预期的情况时立即发现问题。

2.2. 防御性编程:

断言可以帮助开发人员在代码中插入一些额外的检查,以确保程序在运行时的各种情况下都能正确执行。这有助于防止潜在的错误和异常情况,并提高代码的健壮性和可靠性。

2.3. 文档和可读性:

断言可以作为代码的自文档,提供了一种清晰明了的方式来描述代码的预期行为和假设。这使得其他开发人员能够更容易地理解和维护代码。

2.4. 测试:

断言是单元测试的重要组成部分。通过在测试中使用断言,可以验证代码的正确性,并确保它按照预期的方式工作。断言还可以帮助捕获和报告测试中的错误和异常情况。

总之,断言是一种强大的工具,可以帮助开发人员提高代码的质量和可靠性。它们可以帮助我们在开发和测试过程中发现和解决问题,以及提供更好的代码文档和可读性。

3. 常用的Gateway断言工厂

以下是一些常用的Gateway断言工厂及其用法:

3.1 Path断言工厂

Path断言工厂用于根据请求路径进行匹配。

spring:cloud:gateway:routes:- id: path_routeuri: http://example.orgpredicates:- Path=/foo/**

在上述示例中,我们定义了一个名为 path_route 的路由规则,将以 /foo 开头的请求转发到 http://example.org

3.2 Method断言工厂

Method断言工厂用于根据请求方法进行匹配。

spring:cloud:gateway:routes:- id: method_routeuri: http://example.orgpredicates:- Method=GET

在上述示例中,我们定义了一个名为 method_route 的路由规则,将所有的GET请求转发到 http://example.org

3.3 Header断言工厂

Header断言工厂用于根据请求头进行匹配。

spring:cloud:gateway:routes:- id: header_routeuri: http://example.orgpredicates:- Header=X-Request-Id, \d+

在上述示例中,我们定义了一个名为 header_route 的路由规则,将请求头中包含名为 X-Request-Id 的请求转发到 http://example.org

3.4 时间断言工厂

要使用时间断言工厂,我们需要在配置文件中定义相应的路由规则。

spring:cloud:gateway:routes:- id: time_routeuri: http://example.orgpredicates:- TimeBetween=startTime,08:00:00,endTime,18:00:00

在上述示例中,我们定义了一个名为 time_route 的路由规则,使用时间断言工厂 TimeBetween 进行匹配。我们可以通过传递参数 startTime 和 endTime 来定义时间段的开始和结束时间。

4. 自定义Gateway断言工厂

除了使用内置的断言工厂,我们还可以自定义Gateway断言工厂来满足特定的需求。自定义断言工厂需要实现 org.springframework.cloud.gateway.handler.predicate.GatewayPredicateFactory 接口,并注册为Spring Bean。

以下是一个自定义Gateway断言工厂的示例:

@Component
public class CustomPredicateFactory implements GatewayPredicateFactory<CustomPredicateFactory.Config> {@Overridepublic Predicate<ServerWebExchange> apply(Config config) {// 自定义断言逻辑return exchange -> {// 实现自定义的匹配逻辑return true; // 返回匹配结果};}@Overridepublic Config newConfig() {return new Config();}@Overridepublic Class<Config> configClass() {return Config.class;}public static class Config {// 自定义配置参数}
}

在上述示例中,我们定义了一个名为 CustomPredicateFactory 的自定义断言工厂。通过实现 apply 方法,我们可以定义自己的断言逻辑。通过实现 newConfig 方法,我们可以定义自己的配置参数。

5. 使用Gateway断言工厂

要使用Gateway断言工厂,我们需要在配置文件中定义相应的路由规则。

spring:cloud:gateway:routes:- id: custom_routeuri: http://example.orgpredicates:- Custom=param1,value1,param2,value2

在上述示例中,我们定义了一个名为 custom_route 的路由规则,使用自定义断言工厂 Custom 进行匹配。我们可以通过传递参数 param1param2 来进行匹配。

6. gateway断言的功能种类

Spring Cloud Gateway 提供了多种断言工厂,用于根据请求的属性进行路由匹配。以上是一些常用的断言工厂和自定义断言,下面是其他的断言方式:

  1. Path 断言工厂:根据请求的路径进行匹配,可以使用 Ant 风格的路径模式或正则表达式。

  2. Method 断言工厂:根据请求的 HTTP 方法进行匹配,如 GET、POST、PUT 等。

  3. Header 断言工厂:根据请求的头部信息进行匹配,可以指定头部的名称和值。

  4. Cookie 断言工厂:根据请求的 Cookie 进行匹配,可以指定 Cookie 的名称和值。

  5. Query 断言工厂:根据请求的查询参数进行匹配,可以指定参数的名称和值。

  6. Host 断言工厂:根据请求的主机名进行匹配,可以使用 Ant 风格的主机名模式或正则表达式。

  7. RemoteAddr 断言工厂:根据请求的远程地址进行匹配,可以使用 IP 地址或 IP 地址段。

  8. Weight 断言工厂:根据请求的权重进行路由,用于实现负载均衡。

  9. CloudFoundryRouteService 断言工厂:根据请求的 Cloud Foundry 路由服务进行匹配。

实际上 Spring Cloud Gateway 还提供了更多的断言工厂,可以根据具体的需求选择合适的断言工厂来实现路由匹配。同时,还可以通过自定义断言工厂来扩展和定制路由规则的匹配逻辑。

7. 总结

通过Gateway断言工厂,我们可以根据请求的不同属性来匹配和过滤路由请求。除了使用内置的断言工厂,我们还可以自定义断言工厂来满足特定的需求。使用Gateway断言工厂,可以帮助我们实现更加灵活和精确的路由策略。

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

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

相关文章

北邮22级信通院数电:Verilog-FPGA(1)实验一“跑通第一个例程” 过程中遇到的常见问题与解决方案汇总(持续更新中)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 问题一&#xff1a;Verilog代码没有跑通 报…

LabVIEW使用ModbusTCP协议构建分布式测量系统

LabVIEW使用ModbusTCP协议构建分布式测量系统 分布式测量系统主要用于监控远程物体。这种系统允许对系统用户获得的数据进行全面的数据收集、处理、存储和组织访问。它们可能包括许多不同类型的传感器。 在任何具有互联网接入的个人计算机上运行的软件都会发送来自传感器的测…

SpringCloud Alibaba - Sentinel

接上文SpringCloud Alibaba - Nacos 1.Sentinel 流量防卫兵 1.1 安装与部署 和Nacos一样&#xff0c;它是独立安装和部署的&#xff0c;下载地址https://github.com/alibaba/Sentinel/releases 下载后的jar放到目录 然后配置 启动并访问,用户名密码都是 sentinel 此时就…

Springboot整合分页插件pagehelper

首先需要有一定的springbootmybatis的基础&#xff0c;才能使用顺畅 项目结构如下 引入依赖&#xff0c;springboot版本选的是2.7.16版本&#xff0c;jdk选的17&#xff0c; <!--分页插件--> <dependency><groupId>com.github.pagehelper</groupId><…

滑动窗口9.23

1876.长度为3且各字符不同的子字符串 1876. 长度为三且各字符不同的子字符串 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/substrings-of-size-three-with-distinct-characters/?envTypelist&envId24zW97w8自写思路&#xff1a; 数组充当哈希表…

useCallBack

React.memo 保证了只有props发生变化时&#xff0c;该组件才会重新渲染 &#xff08;当然组件内部的state 和 context 变化也会导致组件重新渲染&#xff09;&#xff0c;但咱们只要将咱们的子组件包裹&#xff0c;便可以保证Child组件在props不变的情况下&#xff0c;不会重新…

【C语言】指针经典笔试题(上)

C语言的一大重头戏就是指针。 对于指针有一些认识&#xff1a; 1.指针是存放变量的地址&#xff0c;一般说的指针和指针变量是一个概念。 2.地址的单位是字节&#xff0c;大小在不同编译器环境下有所不同&#xff0c;32位机器是4个字节&#xff0c;64位机器是8个字节。 3.数组名…

学会使用Git 和 GitHub

Git 和 GitHub 都是程序员每天都要用到的东西 —— 前者是目前最先进的 版本控制工具&#xff0c;拥有最多的用户&#xff0c;且管理着地球上最庞大的代码仓库&#xff1b;而后者是全球最大 同性交友 代码托管平台、开源社区。 在没有这两个工具时&#xff0c;编程可能是这样的…

Floyd算法基础

弗洛伊德算法(Floyd) 之前介绍了迪杰斯特拉算法(Dijkstra)。具体请看&#xff1a;最短路径算法——简单明了的迪杰斯特拉算法(Dijkstra)。Dijkstra适用于非负权图&#xff0c;并且一次只能从网络中找源点到任何一个节点的最短路径&#xff0c;而Floyd算法的应用更加广泛&#…

【C刷题】day3

一、选择题 1、已知函数的原型是&#xff1a; int fun(char b[10], int *a); &#xff0c;设定义&#xff1a; char c[10];int d; &#xff0c;正确的调用语句是&#xff08; &#xff09; A: fun(c,&d); B: fun(c,d); C: fun(&c,&d); D: fun(&c,d); 【答案…

正则表达式新解

文章目录 是什么&#xff1f;正则用法匹配单个字符匹配一组字符其他元字符核心函数 贪婪匹配和非贪婪匹配正则练习 是什么&#xff1f; 正则表达式(Regular Expression)是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊…

算法leetcode|83. 删除排序链表中的重复元素(rust重拳出击)

文章目录 83. 删除排序链表中的重复元素&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 83. 删除排序链表中的重复元素&#xff1a; 给…

ChatGLM GPT原理介绍

图解GPT 除了BERT以外,另一个预训练模型GPT也给NLP领域带来了不少轰动,本节也对GPT做一个详细的讲解。 OpenAI提出的GPT-2模型(https://openai.com/blog/better-language-models/) 能够写出连贯并且高质量的文章,比之前语言模型效果好很多。GPT-2是基于Transformer搭建的,相…

注解,自定义注解

一、什么是注解 二、自定义注解 /*** 自定义注解*/public interface MyAnnotation {String aaa();boolean bbb() default true;String ccc(); }MyAnnotation ( aaa "牛魔王",ccc "sss") public class Test {MyAnnotation ( aaa "aaa",ccc &q…

vue 使用cornerstone解析 .dcm 文件

// 首先下载依赖 npm install --save cornerstone-core cornerstone-math cornerstone-tools hammerjs cornerstone-web-image-loader 下载之后再package.json中可以看到最后图片的依赖// 下面是完成的组件代码 <template><div id"dicom_canvas" refdicom_c…

第75步 时间序列建模实战:多步滚动预测 vol-3(以决策树回归为例)

基于WIN10的64位系统演示 一、写在前面 上两期&#xff0c;我们讲了多步滚动预测的第两种策略&#xff1a; 对于重复的预测值&#xff0c;取平均处理。例如&#xff0c;&#xff08;1,2,3&#xff09;预测出3.9和4.5&#xff0c;&#xff08;2,3,4&#xff09;预测出5.2和6.…

物联网的未来:连接的智能世界

物联网&#xff08;IoT&#xff09;是引领我们走向未来的一项关键技术。它让物品通过互联网进行连接&#xff0c;交流&#xff0c;开创了智能生活新时代。预计到2025年&#xff0c;全球将拥有超过410亿的IoT设备。在对人类生活的每个方面产生影响的同时&#xff0c;物联网也正在…

【ardunio】青少年机器人四级实操代码(2023年9月)

目录 一、题目 &#xff08;一&#xff09;试题原题 &#xff08;二&#xff09;试题解读 1、欢迎区和欢送区范围 &#xff08;1&#xff09;符合习惯 &#xff08;2&#xff09;以门为参考点会有不反应区 &#xff08;3&#xff09;以门为参考点门里门外不反应区不对称…

virtualbox配置ubuntu1804虚拟机相关流程

virtualbox配置ubuntu1804虚拟机相关流程 相关版本能解决的问题安装流程1&#xff1a;新建虚拟机安装流程2&#xff1a;配置虚拟机安装流程3&#xff1a;安装虚拟机系统安装流程4&#xff1a;设置ubuntu 相关版本 virtualbox使用VirtualBox官网下载的6.1.34 r150636 版。ubunt…

深度学习修炼(二)全连接神经网络 | Softmax,交叉熵损失函数 优化AdaGrad,RMSProp等 对抗过拟合 全攻略

文章目录 1 多层感知机&#xff08;全连接神经网络&#xff09;1.1 表示1.2 基本概念1.3 必要组成—激活函数1.4 网络结构设计 2 损失函数2.1 SOFTMAX操作2.2 交叉熵损失函数 3 优化3.1 求导计算过于复杂&#xff1f;3.2 链式法则导致的问题&#xff1f;3.3 梯度下降算法的改进…