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的使用详解
官网地址:https://docs.spring.io/spring-cloud-gateway/docs/4.0.4/reference/html/ 1.网关入门 helloword 网关不依赖start-web 导入的pom: <!--gateway--> <dependency><groupIdorg.springframework.cloud</groupId><arti…...

中望CAD 建筑 v2024 解锁版下载、安装教程 (超强的CAD三维制图)
前言 中望CAD建筑版是一款国产CAD制图软件,专注于建筑设计领域。中望CAD建筑版拥有丰富多样的建筑图块和图案,完美兼容各类建筑图纸。同时,它提供了绘图标准规范,使绘图更加规范和专业。更值得一提的是,该软件还具备智…...

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

HTML5实现好看的天气预报网站源码
文章目录 1.设计来源1.1 获取天气接口1.2 PC端页面设计1.3 手机端页面设计 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_4…...

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

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

力扣 28找到字符串中第一个匹配项的下标 KMP算法
思路: 朴素匹配有很多步骤是多余的 KMP算法能够避免重复匹配 KMP算法主要是根据子串生成的next数组作为回退的依据,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。 这里讲一下为什么用模式串的最大公共前后缀…...
JavaScript(10)——匿名函数
匿名函数 没有名字的函数,无法直接使用。 使用方式: 函数表达式立即执行函数 函数表达式 将匿名函数赋值给一个变量,并且通过变量名称进行调用 let fn function(){ 函数体 } 调用: fn() 立即执行函数 语法: (function () {…...

图片上传成功却无法显示:静态资源路径配置问题解析
1、故事的背景 最近,有个学弟做了一个简单的后台管理页面。于是他开始巴拉巴拉撘框架,写代码,一顿操作猛如虎,终于将一个简单的壳子搭建完毕。但是在实现功能:点击头像弹出上传图片进行头像替换的时候,卡壳…...

【转盘案例-弹框-修改Bug-完成 Objective-C语言】
一、我们来看示例程序啊 1.旋转完了以后,它会弹一个框,这个框,是啥, Alert 啊,AlertView 也行, AlertView,跟大家说过,是吧,演示过的啊,然后,我们就用iOS9来做了啊,完成了以后,我们要去弹一个框, // 弹框 UIAlertController *alertController = [UIAlertContr…...
Perl 基础语法
Perl 基础语法 Perl 是一种高级、解释型、动态编程语言,广泛用于CGI脚本、系统管理、网络编程、以及其他领域。Perl 以其强大的文本处理能力和简洁的语法而闻名。本文将详细介绍 Perl 的基础语法,帮助读者快速入门。 1. Perl 变量和数据类型 1.1 变量…...
【嵌入式开发之标准I/O】二进制文件的读写及实验
文本文件和二进制的区别 文本文件和二进制文件的区别主要在于它们的编码方式和数据组织方式。 编码方式:文本文件是基于字符编码的文件,常见的编码有ASCII编码、UNICODE编码等。这些编码将字符映射到特定的二进制值,使得字符可以…...

Arduino学习笔记1——IDE安装与起步
一、IDE安装 去浏览器直接搜索Arduino官网,点击Software栏进入下载界面,选择Windows操作系统: 新版IDE下载不需要提前勾选所下载的拓展包,下载好后直接点击安装即可。 安装好后打开Arduino IDE,会自动开始下载所需的…...

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

在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中的计算属性(computed)和方法(methods)都是用于处理数据和逻辑的重要特性,但它们之间存在一些关键的区别。以下是两者的主要区别: 1. 缓存性 计算属性:计算属性是基于它们的依赖进行缓存的…...

学生成绩管理系统(C语言)
系统分析 1. 主菜单的实现 2. 增加人员功能的实现 3. 删除数据功能的实现 4. 编辑人员功能的实现 5. 排序功能的实现 6. 输出功能 7. 查找信息功能 具体代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 100000typedef struc…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...