当前位置: 首页 > news >正文

Springcloud之gateway的使用详解

官网地址:https://docs.spring.io/spring-cloud-gateway/docs/4.0.4/reference/html/

1.网关入门 helloword

网关不依赖start-web

导入的pom:

<!--gateway-->
<dependency><groupIdorg.springframework.cloud</groupId><artifactIdspring-cloud-starter-gateway</artifactId><exclusions><exclusion><groupIdorg.springframework.boot</groupId><artifactIdspring-boot-starter-web</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupIdcom.alibaba.cloud</groupId><artifactIdspring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 指标监控健康检查的actuator,网关是响应式编程删除掉spring-boot-starter-web dependency-->
<dependency><groupIdorg.springframework.boot</groupId><artifactIdspring-boot-starter-actuator</artifactId>
</dependency>
<!--lombok-->
<dependency><groupIdorg.projectlombok</groupId><artifactIdlombok</artifactId><version1.18.28</version><scopeprovided</scope>

配置文件:

 server:port: 8085spring:application:name: gateway-servicecloud:gateway:routes:#路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名- id: order-service#匹配后提供服务的路由地址uri: http://localhost:8081/#uri: http://cloud-payment-service                #匹配后提供服务的路由地址# 断言,路径相匹配的进行路由predicates:- Path=/order/getOrder

直接访问网关服务+网关端口-》

http://localhost:8085/order/getOrder

最后服务转发到8081服务对应的接口上

2.使用服务名的方式调用网关

正常我们会使用服务名的方式进行服务间的调用

不会使用端口号的形式,不然端口号的变更很难维护

变更配置文件

引入依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

变更配置文件

server:port: 8085spring:application:name: gateway-servicecloud:gateway:routes:#路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名- id: order-service#匹配后提供服务的路由地址uri: lb://order-service#uri: http://cloud-payment-service                #匹配后提供服务的路由地址# 断言,路径相匹配的进行路由predicates:- Path=/order/getOrder

3.常用的内置Route Predicate

是什么?

Spring Cloud Gateway包含许多内置的路由谓词工厂。 所有这些谓词都匹配HTTP请求的不同属性。 您可以使用逻辑 and 语句来联合组合多个路由谓词工厂。

在gateway服务启动的时候会看到这样的日志

After,before....

Gateway 启动的时候会加载默认的谓词工厂

1.Predicate之After

配置文件变更:

server:port: 8085spring:application:name: gateway-servicecloud:gateway:routes:#路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名- id: order-service#匹配后提供服务的路由地址uri: lb://order-service#uri: http://cloud-payment-service                #匹配后提供服务的路由地址# 断言,路径相匹配的进行路由predicates:- Path=/order/getOrder- After=2023-07-07T22:14:00.583857100+08:00[Asia/Shanghai]

局部变更

- After=2023-07-07T22:14:00.583857100+08:00[Asia/Shanghai]

after用于限定请求的处理时间,只有在指定时间之后的请求才会被匹配并路由。给出的配置:

生成时间的方式:

public class DateUtil {public static void main(String[] args) {System.out.println(ZonedDateTime.now());}
}
结果:2024-07-07T22:09:45.583857100+08:00[Asia/Shanghai]

应用场景:

举个例子:抢茅台,设置茅台开始抢购的时间

只有到该时间之后接口才会有效,否则一直404

4.Predicate之Cookie

包含cookie且值匹配

  • Cookie=username,zhangsan

配置如下:

server:port: 8085spring:application:name: gateway-servicecloud:gateway:routes:#路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名- id: order-service#匹配后提供服务的路由地址uri: lb://order-service#uri: http://cloud-payment-service                #匹配后提供服务的路由地址# 断言,路径相匹配的进行路由predicates:- Path=/order/getOrder- After=2024-07-07T22:14:00.583857100+08:00[Asia/Shanghai]#- Before=2023-07-08T21:09:00.583857100+08:00[Asia/Shanghai]- Cookie=username,zhangsan

精确匹配,匹配不到404

4.Predicate之Header

配置如下

predicates:- Path=/order/getOrder- After=2024-07-07T22:14:00.583857100+08:00[Asia/Shanghai]#- Before=2023-07-08T21:09:00.583857100+08:00[Asia/Shanghai]- Cookie=username,zhangsan#- Header=X-Request-Id=123456  \d+  #请求头要有X-Request-Id且值正整数的正表达式

如果输入的是字符串404

- Host=**.css.com

请求头包含任意值后缀是css.com的域名

4.Predicate之Query Route 谓词工厂

指定请求里必须包含参数,允许正则表达式

  • - Query=username,\d+ 要有参数名username并且必须是整数

  • - RemoteAddr=192.168.124.1/24 # 外部访问我的ip限制,最大跨度不超过32,目前是1-24-

  • - Method=

4.自定义predicate

gateway的谓词断言和原生的写法很类似,照葫芦画瓢,参考源码。

新建一个自定义的路由断言工厂,格式和源码格式一样

参考After谓词 源码如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package org.springframework.cloud.gateway.handler.predicate;import jakarta.validation.constraints.NotNull;
import java.time.ZonedDateTime;
import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;
import org.springframework.web.server.ServerWebExchange;public class AfterRoutePredicateFactory extends AbstractRoutePredicateFactory<AfterRoutePredicateFactory.Config> {public static final String DATETIME_KEY = "datetime";public AfterRoutePredicateFactory() {super(AfterRoutePredicateFactory.Config.class);}public List<String> shortcutFieldOrder() {return Collections.singletonList("datetime");}public Predicate<ServerWebExchange> apply(AfterRoutePredicateFactory.Config config) {return new GatewayPredicate() {public boolean test(ServerWebExchange serverWebExchange) {ZonedDateTime now = ZonedDateTime.now();return now.isAfter(config.getDatetime());}public Object getConfig() {return config;}public String toString() {return String.format("After: %s", config.getDatetime());}};}public static class Config {@NotNullprivate ZonedDateTime datetime;public Config() {}public ZonedDateTime getDatetime() {return this.datetime;}public void setDatetime(ZonedDateTime datetime) {this.datetime = datetime;}}
}

Config 内部类对应yaml文件里的配置,咱们在配置After的时候使用的是

  • After=time.....

这里要变更成我们自己的pridicate这里的配置就可以按照我们自己定义的规则配置。

gateway支持两种配置方式

  • 1.Shortcut Configuration

  • 2.Fully Expanded Arguments

方式一最简单

比如

spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- Cookie=mycookie,mycookievalue

方式二

写法参考下面这种方式

Args key value

spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- name: Cookieargs:name: mycookieregexp: mycookievalue

官网地址:docs.spring.io/spring-cloud-gateway/docs/4.0.4/reference/html

假设业务场景:

有这样一个业务场景,请求参数里面必须包含一个参数为userType的参数,该参数代表着用户的会员等级,只有会员等级为gold的才可以访问。

代码实现

package com.css.tom.mypridicate;import lombok.Getter;
import lombok.Setter;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;import java.util.function.Predicate;/*** @author weiwensi* @version 1.0-SNAPSHOT* @since 2024/7/8 21:49*/
@Component
public class MyRoutePredicateFactory extends AbstractRoutePredicateFactory<MyRoutePredicateFactory.Config> {public MyRoutePredicateFactory() {super(MyRoutePredicateFactory.Config.class);}@Overridepublic Predicate<ServerWebExchange> apply(MyRoutePredicateFactory.Config config) {return new Predicate<ServerWebExchange>() {//serverWebExchange 这个参数 相当于servlet的request@Overridepublic boolean test(ServerWebExchange serverWebExchange) {String userType = serverWebExchange.getRequest().getQueryParams().getFirst("userType");if (userType == null) {return false;}//如果说参数存在,就和Config进行比较if(userType.equalsIgnoreCase(config.getUserType())){return true;}return false;}};}//这个Config类就是我们的路断言规则,很重要public class Config {@Setter@Getterprivate String userType; //对应会员等级 /钻石,金牌,银牌}
}

配置文件配置(Fully方式)

    - name: Myargs:userType: diamond

如果使用shortcut的方式自定义实现代码里参考After的

 public List<String> shortcutFieldOrder() {return Collections.singletonList("datetime");}

增加如下代码:

 public List<String> shortcutFieldOrder() {return Collections.singletonList("userType");}

完整代码:

package com.css.tom.mypridicate;import lombok.Getter;
import lombok.Setter;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;/*** @author weiwensi* @version 1.0-SNAPSHOT* @since 2024/7/8 21:49*/
@Component
public class MyRoutePredicateFactory extends AbstractRoutePredicateFactory<MyRoutePredicateFactory.Config> {public MyRoutePredicateFactory() {super(MyRoutePredicateFactory.Config.class);}@Overridepublic List<String> shortcutFieldOrder() {return Collections.singletonList("userType");}@Overridepublic Predicate<ServerWebExchange> apply(MyRoutePredicateFactory.Config config) {return new Predicate<ServerWebExchange>() {//serverWebExchange 这个参数 相当于servlet的request@Overridepublic boolean test(ServerWebExchange serverWebExchange) {String userType = serverWebExchange.getRequest().getQueryParams().getFirst("userType");if (userType == null) {return false;}//如果说参数存在,就和Config进行比较if(userType.equalsIgnoreCase(config.getUserType())){return true;}return false;}};}//这个Config类就是我们的路断言规则,很重要public class Config {@Setter@Getterprivate String userType; //对应会员等级 /钻石,金牌,银牌}
}

5.gateway过滤器

类型

  • 全局默认过滤器 Global Filters

  • 单一内置过滤器 GatewayFilter

  • 自定义过滤器

官网地址:docs.spring.io/spring-cloud-gateway/docs/current/reference/html#global-filters

gateway内置过滤器

docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories

38个 分组

  • RequestHeader 相关组

  • 请求参数 Requestparameter 相关组

  • 回应头 ResponseHeader 相关组

  • 前缀和路径相关组

  • 其他

配置文件配置

相关文章:

Springcloud之gateway的使用详解

官网地址&#xff1a;https://docs.spring.io/spring-cloud-gateway/docs/4.0.4/reference/html/ 1.网关入门 helloword 网关不依赖start-web 导入的pom&#xff1a; <!--gateway--> <dependency><groupIdorg.springframework.cloud</groupId><arti…...

中望CAD 建筑 v2024 解锁版下载、安装教程 (超强的CAD三维制图)

前言 中望CAD建筑版是一款国产CAD制图软件&#xff0c;专注于建筑设计领域。中望CAD建筑版拥有丰富多样的建筑图块和图案&#xff0c;完美兼容各类建筑图纸。同时&#xff0c;它提供了绘图标准规范&#xff0c;使绘图更加规范和专业。更值得一提的是&#xff0c;该软件还具备智…...

windows edge自带的pdf分割工具(功能)

WPS分割pdf得会员&#xff0c;要充值&#xff01;网上一顿乱找&#xff0c;发现最简单&#xff0c;最好用&#xff0c;免费的还是回到Windows。 Windows上直接在edge浏览器打开PDF&#xff0c;点击 打印 按钮,页面下选择对应页数 打印机 选择 另存为PDF&#xff0c;然后保存就…...

HTML5实现好看的天气预报网站源码

文章目录 1.设计来源1.1 获取天气接口1.2 PC端页面设计1.3 手机端页面设计 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_4…...

比较(八)利用python绘制指示器

比较&#xff08;八&#xff09;利用python绘制指示器 指示器&#xff08;Indicators&#xff09;简介 指示器是一系列相关图的统称&#xff0c;主要用于突出展示某一变量的实际值与目标值的差异&#xff0c;例如常见的数据delta、仪表盘、子弹图、水滴图等。 快速绘制 基于p…...

【体外诊断】ARM/X86+FPGA嵌入式计算机在医疗CT机中的应用

体外诊断 信迈科技提供基于Intel平台、AMD平台、NXP平台的核心板、2.5寸主板、Mini-ITX主板、4寸主板、PICO-ITX主板&#xff0c;以及嵌入式准系统等计算机硬件。产品支持GAHDMI等独立双显&#xff0c;提供丰富串口、USB、GPIO、PCIe扩展接口等I/O接口&#xff0c;扩展性强&…...

力扣 28找到字符串中第一个匹配项的下标 KMP算法

思路&#xff1a; 朴素匹配有很多步骤是多余的 KMP算法能够避免重复匹配 KMP算法主要是根据子串生成的next数组作为回退的依据&#xff0c;它记录了模式串与主串(文本串)不匹配的时候&#xff0c;模式串应该从哪里开始重新匹配。 这里讲一下为什么用模式串的最大公共前后缀…...

JavaScript(10)——匿名函数

匿名函数 没有名字的函数&#xff0c;无法直接使用。 使用方式: 函数表达式立即执行函数 函数表达式 将匿名函数赋值给一个变量&#xff0c;并且通过变量名称进行调用 let fn function(){ 函数体 } 调用&#xff1a; fn() 立即执行函数 语法&#xff1a; (function () {…...

图片上传成功却无法显示:静态资源路径配置问题解析

1、故事的背景 最近&#xff0c;有个学弟做了一个简单的后台管理页面。于是他开始巴拉巴拉撘框架&#xff0c;写代码&#xff0c;一顿操作猛如虎&#xff0c;终于将一个简单的壳子搭建完毕。但是在实现功能&#xff1a;点击头像弹出上传图片进行头像替换的时候&#xff0c;卡壳…...

【转盘案例-弹框-修改Bug-完成 Objective-C语言】

一、我们来看示例程序啊 1.旋转完了以后,它会弹一个框,这个框,是啥, Alert 啊,AlertView 也行, AlertView,跟大家说过,是吧,演示过的啊,然后,我们就用iOS9来做了啊,完成了以后,我们要去弹一个框, // 弹框 UIAlertController *alertController = [UIAlertContr…...

Perl 基础语法

Perl 基础语法 Perl 是一种高级、解释型、动态编程语言&#xff0c;广泛用于CGI脚本、系统管理、网络编程、以及其他领域。Perl 以其强大的文本处理能力和简洁的语法而闻名。本文将详细介绍 Perl 的基础语法&#xff0c;帮助读者快速入门。 1. Perl 变量和数据类型 1.1 变量…...

【嵌入式开发之标准I/O】二进制文件的读写及实验

文本文件和二进制的区别 文本文件和二进制文件的区别主要在于它们的编码方式和数据组织方式。‌ 编码方式&#xff1a;‌文本文件是基于字符编码的文件&#xff0c;‌常见的编码有ASCII编码、‌UNICODE编码等。‌这些编码将字符映射到特定的二进制值&#xff0c;‌使得字符可以…...

Arduino学习笔记1——IDE安装与起步

一、IDE安装 去浏览器直接搜索Arduino官网&#xff0c;点击Software栏进入下载界面&#xff0c;选择Windows操作系统&#xff1a; 新版IDE下载不需要提前勾选所下载的拓展包&#xff0c;下载好后直接点击安装即可。 安装好后打开Arduino IDE&#xff0c;会自动开始下载所需的…...

一个注解解决重复提交问题

一、前言 ​ 在应用系统中提交是一个极为常见的功能&#xff0c;倘若不加管控&#xff0c;极易由于用户的误操作或网络延迟致使同一请求被发送多次&#xff0c;从而生成重复的数据记录。针对用户的误操作&#xff0c;前端通常会实现按钮的 loading 状态&#xff0c;以阻…...

在qt的c++程序嵌入一个qml窗口

//拖拽一个QQuickWidget c端和qml通信的桥梁 找到qml的main.qml的路径 ui->quickWidget->setSource(QUrl::fromLocalFile("../../../code/main.qml"));// QML 与 Qt Widgets 通信//窗口就成了一个类实例对象pRoot (QObject*)ui->quickWidget->rootObje…...

Vue的依赖注入:组件树中的共享数据与功能

引言 在构建大型前端应用时,组件间的通信和状态共享是一个常见问题。Vue.js 提供了一种类似于 React 的 Context 机制的依赖注入系统,允许开发者在组件树中共享数据和功能。provide 和 inject 是 Vue 依赖注入的两个关键概念。本文将深入探讨 Vue 的依赖注入机制,讨论如何使…...

softmax 函数的多种实现方式 包括纯C语言、C++版本、Eigen版本等

softmax 函数的多种实现方式 包括纯C语言、C版本、Eigen版本等 flyfish 先看这里Softmax函数介绍 版本1 规矩的写法 #include <iostream> #include <vector> #include <algorithm> #include <numeric> #include <cmath>// 计算 softmax 的函…...

R语言学习笔记11-读取csv-xlsx-txt-json-pdf-lua格式文件

R语言学习笔记11-读取csv-xlsx-txt-json-pdf-lua格式文件 读取csv使用base的 read.csv 函数使用 readr 包的 read_csv 函数 读取xlsx使用 xlsx 包的 read.xlsx 函数使用 readxl 包的 read_excel 函数 读取txt使用base的文件读取函数 readLines使用 readr 包的 read_lines 函数 …...

Vue的计算属性和方法有什么区别

Vue中的计算属性&#xff08;computed&#xff09;和方法&#xff08;methods&#xff09;都是用于处理数据和逻辑的重要特性&#xff0c;但它们之间存在一些关键的区别。以下是两者的主要区别&#xff1a; 1. 缓存性 计算属性&#xff1a;计算属性是基于它们的依赖进行缓存的…...

学生成绩管理系统(C语言)

系统分析 1. 主菜单的实现 2. 增加人员功能的实现 3. 删除数据功能的实现 4. 编辑人员功能的实现 5. 排序功能的实现 6. 输出功能 7. 查找信息功能 具体代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 100000typedef struc…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...