SpringCloud之网关组件Gateway学习
SpringCloud之网关组件Gateway学习
GateWay简介
Spring Cloud Gateway是Spring Cloud的⼀个全新项目,目标是取代Netflix Zuul,它基于Spring5.0+SpringBoot2.0+WebFlux(基于高性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型)等技术开发,性能⾼于Zuul,官方测试,Gateway是Zuul的1.6倍,旨在为微服务架构提供种简单有效的统⼀的API路由管理方式。Spring Cloud Gateway不仅提供统的路由方式(反向代理)并且基于 Filter(定义过滤器对请求过滤,完成⼀些功能) 链的式提供了网关基本的功能,例如:鉴权、
流量控制、熔断、路径重写、日志监控等。
Gateway相关概念
Gateway使用
在项目中引入Gateway的依赖,这里要注意的是Gateway不支持Spring boot web包,所以需要排除掉spring-boot-starter-web
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></exclusion></exclusions></dependency>
在微服务系统中,如果没有引入网关组件,用户的请求是直接请求到具体的服务的,而引入网关后,用户的请求会被网关组件处理,然后由网关组件将请求转发给具体的服务实例进行处理。网关组件也是一种服务,也需要被注册到Nacos等注册中心中。引入网关后的架构图如下所示:

Gateway服务配置,这一部分配置和其它的服务没有区别,是和Nacos注册中心集成的配置
server:port: 10010 #网关端口
spring:application:name: gatewayservicecloud:nacos:server-addr: localhost:8848discovery:group: testgroup1namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084cluster-name: HZ
GateWay本身的配置如下:
spring:cloud:gateway: #路由匹配是从前往后,依次匹配的routes: #网关路由配置- id: providerservice #路由id,需要唯一uri: lb://providerservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称predicates: #路由断言,其实就是判断请求是否符合路由规则的条件- Path=/user/** #路由匹配 只要是以/user开头的请求就会匹配到,P需要大写,不然会报错- id: consumerserviceuri: lb://consumerservicepredicates:- Path=/consumer/**
然后在浏览器输入 http://localhost:10010/consumer/1,就可以访问到consumerservice服务了,这时因为GateWay服务将我们的请求根据配置的路由规则路由到了consumerservice。
路由断言工厂
路由断言工厂的作用是读取用户定义的断言条件,对请求作出判断。
我们上面的配置中的断言规则 Path=/user/** 只是字符串, 这些字符串会被Spring中的org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory处理的,类似的PredicateFactory在GateWay中还有很多。
| 名称 | 说明 |
|---|---|
| After | 某个时间之后的请求 |
| Before | 某个时间之前的请求 |
| Between | 某两个时间之间的请求 |
| Cookie | 请求必须包含某些cookie |
| Header | 请求必须包含某些Header |
| Host | 请求必须是访问某个host(域名) |
| Method | 请求必须是指定方式 |
| Path | 请求路径必须符合指定规则 |
| Query | 请求参数必须包含指定参数 |
| RemoteAddr | 请求的ip必须是指定范围 |
| Weight | 权重处理 |
上面这些路由断言工厂的具体使用,可以参考官方的路由断言工厂示例
过滤器
GateWay Filter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。

Spring提供了31种不同的路由过滤器工厂,具体的使用可以参考官方的:
过滤器工厂官方示例
使用过滤器给请求添加一个请求头:
cloud:gateway: #路由匹配是从前往后,依次匹配的routes: #网关路由配置- id: providerservice #路由id,需要唯一uri: lb://providerservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称predicates: #路由断言,其实就是判断请求是否符合路由规则的条件- Path=/user/** #路由匹配 只要是以/user开头的请求就会匹配到- id: consumerserviceuri: lb://consumerservicepredicates:- Path=/consumer/**filters: #局部过滤器,只对某个服务起作用- AddRequestHeader=truth,This is a headr #添加请求头
通过@RequestHeader注解来获取请求头的值

在控制台输出了获取到的请求头

如果想要过滤器对所有的路由都生效,可以把过滤器工厂写到default下
server:port: 10010 #网关端口
spring:application:name: gatewayservicecloud:nacos:server-addr: localhost:8848discovery:group: testgroup1namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084cluster-name: HZgateway: #路由匹配是从前往后,依次匹配的routes: #网关路由配置- id: providerservice #路由id,需要唯一uri: lb://providerservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称predicates: #路由断言,其实就是判断请求是否符合路由规则的条件- Path=/user/** #路由匹配 只要是以/user开头的请求就会匹配到- id: consumerserviceuri: lb://consumerservicepredicates:- Path=/consumer/**filters:- AddRequestHeader=truth,This is a headr #添加请求头default-filters:- AddRequestHeader=truth,This is a headr1
前面提到的两种过滤器的过滤规则都是固定的,是框架给我们提供的;如果想要自定义过滤规则,则需要用到全局过滤器Global Filter。GateWay提供了GlobalFilter接口,只要我们实现这个接口就可以实现自定义的过滤器。重点是如何让过滤器链继续向下执行或者阻止过滤器链向下执行。下面是一个简单的全局过滤器示例:
/*** @author DELL* @version 1.0* @description* @date 2024/3/13 22:38:05*/
@Order(value = 1) #指定过滤器的执行顺序,值越小越先执行
public class MyGlobalFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//获取请求参数MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();//获取String authorization = params.getFirst("authorization");//校验if ("admin".equals(authorization)) {//放行return chain.filter(exchange);}//拦截exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);return exchange.getResponse().setComplete();}}
上面提到了三种过滤器,某个服务的过滤器(filters)、默认的过滤器(default-filters)、全局过滤器(GlobalFilter),如果三种过滤器都进行了配置,那么它们的执行顺序如下:

- 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
- GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
- 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增
- 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行
CROS配置
Gateway中进行跨域的配置如下:
spring:application:name: gatewayservicecloud:nacos:server-addr: localhost:8848discovery:group: testgroup1namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084cluster-name: HZgateway: #路由匹配是从前往后,依次匹配的routes: #网关路由配置- id: providerservice #路由id,需要唯一uri: lb://providerservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称predicates: #路由断言,其实就是判断请求是否符合路由规则的条件- Path=/user/** #路由匹配 只要是以/user开头的请求就会匹配到- id: consumerserviceuri: lb://consumerservicepredicates:- Path=/consumer/**filters:- AddRequestHeader=truth,This is a headr #添加请求头default-filters:- AddRequestHeader=truth,This is a headr1globalcors: #跨域配置cors-configurations:'[/**]':allowedOrigins: "http://localhost:8090" #允许哪些请求跨域allowedMethods: #允许的跨域的请求方式- GETallowedHeaders: "*" 允许在请求中携带的头信息allowCredentials: true # 是否允许携带cookiemaxAge: 36000 #跨域检测有效期
参考
- Gateway官方文档
相关文章:
SpringCloud之网关组件Gateway学习
SpringCloud之网关组件Gateway学习 GateWay简介 Spring Cloud Gateway是Spring Cloud的⼀个全新项目,目标是取代Netflix Zuul,它基于Spring5.0SpringBoot2.0WebFlux(基于高性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型…...
全球大型语言模型(LLMS)现状与比较
我用上个博文的工具将一篇ppt转换成了图片,现分享给各位看官。 第一部分:国外大语言模型介绍 1,openai的Chatgpt 免费使用方法1:choose-carhttps://share.freegpts.org/list 免费使用方法2:Shared Chathttps://share…...
Git Commit 提交规范,变更日志、版本发布自动化和 Emoji 提交标准
前言 Git Commit 是开发的日常操作, 一个优秀的 Commit Message 不仅有助于他人 Review, 还可以有效的输出 CHANGELOG, 对项目的管理实际至关重要, 但是实际工作中却常常被大家忽略,希望通过本文,能够帮助大家规范 Git Commit,并且展示相关 …...
Spark与flink计算引擎工作原理
Spark是大批量分布式计算引擎框架,scale语言开发的,核心技术是弹性分布式数据集(RDD)可以快速在内存中对数据集进行多次迭代,支持复杂的数据挖掘算法及图形计算算法,spark与Hadoop区别主要是spark多个作业之…...
Excel数字乱码怎么回事 Excel数字乱码怎么调回来
在日常工作中,Excel是我们最常使用的数据处理软件之一,它强大的功能使得数据处理变得既简单又高效。然而,用户在使用Excel时偶尔会遇到数字显示为乱码的问题,这不仅影响了数据的阅读,也大大降低了工作效率。那么&#…...
实例:NX二次开发使用链表进行拉伸功能(链表相关功能练习)
一、概述 在进行批量操作时经常会利用链表进行存放相应特征的TAG值,以便后续操作,最常见的就是拉伸功能。这里我们以拉伸功能为例子进行说明。 二、常用链表相关函数 UF_MODL_create_list 创建一个链表,并返回链表的头指针。…...
【VSTO开发】遍历 Ribbon 中的所有控件或按钮
在 VSTO(Visual Studio Tools for Office)中,可以通过代码来遍历 Ribbon 中的所有控件或按钮。可以使用 C# 或 VB.NET 等编程语言来实现这个功能。 下面是一个简单的示例代码,演示如何遍历 Ribbon 中的所有控件或按钮:…...
上位机图像处理和嵌入式模块部署(qmacvisual图像识别)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 所谓图像识别,就是对图像进行分类处理,比如说判断图像上面的物体是飞机、还是蝴蝶。在深度学习和卷积神经网络CNN不像现在这…...
当Java 22遇到 SpringBoot 3.3.0!
工程 | JOSH LONG | 0条评论 Java 22发布快乐! Java 22 是一个重大的进步,是一个值得升级版本。有一些重大的最终发布功能,如 Project Panama及一系列更优秀的预览功能。我不可能覆盖它们全部,但我确实想谈谈我最喜爱的一些。我们…...
贪吃蛇(C语言超详细版)
目录 前言: 总览: API: 控制台程序(Console): 设置坐标: COORD: GetStdHandle: STD_OUTPUT_HANDLE参数: SetConsoleCursorPosition: …...
python(django)之流程接口管理后台开发
1、在models.py中加入流程接口表和单一接口表 代码如下: from django.db import models from product.models import Product# Create your models here.class Apitest(models.Model):apitestname models.CharField(流程接口名称, max_length64)apitester model…...
Hive入门
什么是hive? - Hive是Facebook开发并贡献给Hadoop开源社区的。它是建立在 Hadoop体系架构上的一层 SQL抽象,使得数据相关人 员使用他们最为熟悉的SQL语言就可以进行海量数据的处理、 分析和统计工作 - Hive将数据存储于HDFS的数据文件映射为一张数据库…...
【神经网络】得分函数,损失函数~
目录 引言 一、神经网络概述 1 定义 2 基本原理 二、得分函数 1 定义 2 应用方法 3 与神经网络 三、损失函数 1 定义 2实现方法 3 与神经网络 四、得分函数与损失函数的协同作用 1 关系 2 实际应用 六、代码事例 、总结与展望 引言 在人工智能与机…...
FFmepg--AVFilter过滤器使用以及yuv视频裁剪
文章目录 AVFilter 流程:api核心代码变量yuv视频裁剪AVFilter 流程: ⾸先使⽤split滤波器将input流分成两路流(main和tmp),然后分别对两路流进⾏处理。对于tmp流,先经过crop滤波器进⾏裁剪处理,再经过flip滤波器进⾏垂直⽅向上的翻转操作,输出的结果命名为flip流。再将…...
.net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
$exception {"Public member Value on type Range not found."} System.MissingMemberException 代码准备运行问题解决1. 下载别的版本的.net框架2. 安装3. 运行 代码 Imports Excel Microsoft.office.Interop.Excel Public Class Form1Private Sub Button1_Click(…...
string类的详细模拟实现
string类的模拟实现 文章目录 string类的模拟实现前言1. 类的框架设计2. 构造函数与析构函数3. 拷贝构造与重载赋值运算符函数4. 运算符重载5. 成员函数6. 迭代器的实现7. 非成员函数8. 单元测试总结 前言 在现代编程中,字符串处理是每个程序员都会遇到的基本任…...
【EasyX】 使用说明
EasyX 使用说明 基本说明 EasyX 是针对 C 的图形库,可以帮助 C/C 初学者快速上手图形和游戏编程。 比如,可以基于 EasyX 图形库很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏&am…...
以太坊基金会JUSTIN DRAKE确认出席Hack.Summit() 2024区块链开发者大会
以太坊基金会JUSTIN DRAKE确认将出席由Hack VC主办,AltLayer、Berachain协办,并获得了Solana、The Graph、Blockchain Academy、ScalingX、0G、SNZ以及数码港的大力支持,本次大会由Techub News承办的Hack.Summit() 2024区块链开发者盛会。 Ju…...
数学建模常用代码
SVM分类器 1.命令函数部分: clear;%清屏 clc; X load(data.txt); n length(X);%总样本数量 y X(:,4);%类别标志 X X(:,1:3); TOL 0.0001;%精度要求 C 1;%参数,对损失函数的权重 b 0;%初始设置截距b Wold 0;%未更新a时的W(a) Wnew 0;%更新a后的…...
学点儿Java_Day7_在实体类当中IDEA无法进行单元测试(@Test没有启动按钮)
在敲代码体会继承和访问修饰符的时候忽然遇到了单元测试不管用的情况,表现为没有启动按钮 经过一番折腾,发现我的测试是在具有构造函数的实体类Person当中进行的,当我把所有的构造函数删除后,启动按钮又出来了,加…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
