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

【Spring Cloud Netflix】GateWay服务网关

1.基本概述

GateWay用于在微服务架构中提供统一的入口点,对请求进行路由,过滤和处理。它就像是整个微服务系统的大门,所有外部请求都要通过它才能访问到后端的各个微服务。

2.核心概念

2.1路由(Route)

路由是Spring Cloud gateWay中最基本的构建块,它由一个ID,一个目标URI(不是URL,URL是URI的一种),一组断言和一组过滤器组成。当一个请求满足路由中的所有断言是,该请求会被路由到指定的URI中。

它定义了请求从网关到目标服务的映射规则,决定了请求将被转发到哪个具体的微服务。

2.2断言(Predicate)

断言是Java8中java.util.function.Predicate的示例。在Spring Cloud Gateway里,它用于匹配HTTP请求的条件。只有当请求满足断言所定义的条件时,才会被路由到相应的目标服务。

它是用来帮助网关判断是否将请求路由到特定的服务。可以根据请求的多种属性进行匹配,如请求路径、请求方法、请求头、请求参数等。

2.3过滤(Filter)

过滤器是 Spring Cloud Gateway 中用于修改请求和响应的组件。可以在请求被路由到目标服务之前(前置过滤器)或之后(后置过滤器)对请求和响应进行处理。

它实现诸如请求参数修改、请求头添加、限流、熔断、日志记录等功能,增强网关的功能和安全性。

3.工作流程

客户端将请求发送给SpringCloud GateWay,如果GateWay Handler Mapping确定这个请求和一个路由匹配,它将此请求发送给GatWay Web Handler进行处理。此时GatWay Web Handler就会处理请求,通过Filter Chain来进行处理,这个过滤器链会在请求路由前后都执行。简而言之就是通过一连串的Filter处理匹配到特定规则Predicates的请求。

基于上面的原理图,下面进一步查看其流程图

执行流程大致如下:

1. Gateway Client向Gateway Server发送请求。

2. 请求被HttpWebHandlerAdapter提取组装成网关上下文。

3. 网关上下文传递到DispatcherHandler,由其将请求分发给RoutePredicateHandlerMapping。

4. RoutePredicateHandlerMapping进行路由查找,依据路由断言判断路由可用性。

5. 断言成功时,FilteringWebHandler创建过滤器链并调用。

6. 请求依次经过PreFilter、微服务、PostFilter的方法后返回响应。

4.搭建网关微服务

先导入相关依赖

<dependencies><!--gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--eureka-client  gateWay作为网关,也要注册进服务中心--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- gateway和web不能同时存在,即web相关jar包不能导入 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
</dependencies>

然后编写启动类

@SpringBootApplication
@EnableDiscoverClient
public class GateWayApplication{public static void main(String[] args){SpringApplication.run(GateWayApplication.class,args);}
}

编写yml配置文件

server:port: 9527 # 配置网关服务监听的端口号为9527
spring:application:name: service - gateway # 配置Spring应用的名称为service - gatewaycloud:gateway:routes:- id: consumer_route # 路由id,一般保证唯一即可uri: http://localhost:80 # 路由目标地址,这里是本地80端口,硬编码形式(不推荐)predicates:- Path=/api/consumer/** # 断言规则,匹配以/api/consumer/开头的请求路径filters:- StripPrefix=1 # 过滤器,在请求转发到目标服务前,去掉一层路径,这里去掉的是/api- id: provider_routeuri: lb://service-provider # 使用负载均衡(lb)访问名为service-provider的微服务,动态路由(推荐)predicates:- Path=/provider/** # 断言规则,匹配以/provider/开头的请求路径
eureka:client:register-with-eureka: true # 配置向Eureka注册中心注册自身服务实例fetch-registry: true # 配置从Eureka注册中心拉取服务注册信息service-url:defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka # Eureka注册中心的地址

动态路由中的lb属于GateWay的关键字,代表是动态uri,即代表使用 的是服务注册中心的微服务名,它默认开启使用负载均衡机制。

5.断言详讲 

我们重点讨论的是内置断言,即已经实现好的断言,而非自己定义的断言。

5.1.After

After 在指定时间之后,顾名思义就是只有在指定时间之后的请求才会生效。After后面跟的是一个时间

配置文件如下

 predicates:- Path=/api/consumer/**- After=2023-05-16T20:29:54.475+08:00[GMT+08:00]

5.2.Before

before 指定时间之前只有在指定时间之前的请求才会生效。

在配置文件里面,我们配置如下

 predicates:- Path=/api/consumer/**- Before=2023-05-16T20:29:54.475+08:00[GMT+08:00]

5.3.Between

between 需要在设定的时间范围之内才能进行请求转发。

在配置文件里面,我们配置如下

 predicates:- Path=/api/consumer/**- Between=2023-05-16T20:19:54.475+08:00[GMT+08:00],2023-05
16T20:32:54.475+08:00[GMT+08:00]

5.4.Cookie

要求请求中包含指定Cookie名和满足特定正则要求的值,Cookie必须有两个值,第一个Cookie包含的参 数名,第二个表示参数对应的值,可以是具体的值,也可以是正则表达式。 在配置文件里面,我们配置如下:

 predicates:- Path=/api/consumer/**- Cookie=username,eric

5.5.Header

表示请求头中必须包含的内容。注意:参数名和参数值之间依然使用逗号,参数值可以写具体的值,也可 以使用正则表达式。如果Header只有一个值表示请求头中必须包含的参数。如果有两个值,第一个表示请 求头必须包含的参数名,第二个表示请求头参数对应值。

配置如下

 predicates:- Path=/api/consumer/**- Header=name,james

5.6.Host

匹配请求参数中Host参数的值,可以有多个,使用逗号隔开**表示支持模糊匹配。

在配置文件里面我们进行如下配置:

predicates:- Path=/api/consumer/**- Host=127.0.0.1:8080,**.test.com

5.7.Method

Method表示请求方式。支持多个值,使用逗号分隔,多个值之间为or条件。

在配置文件里面我们进行如下配置:

 predicates   - Path=/api/consumer/**- Method=GET # 只允许使用GET请求方式

5.8.Query

要求请求必须携带对应的参数。

我们在配置文件里面我们进行如下配置:

 predicates:- Path=/api/consumer/**- Query=age,18

请求的URL要在后面用?拼接该参数才能访问到 

5.9.RemoteAddr

允许访问的客户端地址,不能使用类似ocahost这种。

在配置文件里面我们配置如下:

 predicates  - Path=/api/consumer/*  - RemoteAddr=127.0.0.1

相关文章:

【Spring Cloud Netflix】GateWay服务网关

1.基本概述 GateWay用于在微服务架构中提供统一的入口点&#xff0c;对请求进行路由&#xff0c;过滤和处理。它就像是整个微服务系统的大门&#xff0c;所有外部请求都要通过它才能访问到后端的各个微服务。 2.核心概念 2.1路由(Route) 路由是Spring Cloud gateWay中最基本…...

Docker部署Jenkins服务

文章目录 1.下载Jenkins服务2.部署Java21&#xff08;可选&#xff09;2.1 安装Java21 3.Maven3.9.9安装4.启动Jenkins5.初始化Jenkins5.1 入门5.2 安装推荐的插件5.3 创建第一个管理员用户5.4 实例配置5.5 Jenkins已就绪5.6 开始使用Jenkins5.7 重启Jenkins 6.配置Jenkins6.1 …...

[ctfshow web入门] web40

信息收集 怎么一下子多这么多过滤啊&#xff0c;我以为跳过了好几题 这又能eval了&#xff0c;但是连$也不能用了 不能用. * ?&#xff0c;所以打不出fla*或者fla?????了 不能用/&#xff0c;构造不出日志注入和伪协议包含 仔细观察&#xff0c;禁的是中文的括号&#x…...

蓝桥杯c ++笔记(含算法 贪心+动态规划+dp+进制转化+便利等)

蓝桥杯 #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; //常使用的头文件动态规划 小蓝在黑板上连续写下从 11 到 20232023 之间所有的整数&#xff0c;得到了一个数字序列&#xff1a; S12345…...

UE5 Windows游戏窗口置顶

参考资料&#xff1a;UE5 UE4 项目设置全局置顶_ue4运行设置置顶-CSDN博客 修改完build.cs后&#xff0c;关掉重新生成解决方案。&#xff08;不然可能编译报错&#xff0c;在这卡了半个小时&#xff09; 不知道怎么用C的&#xff0c;可以用这个 Topmost - Keep Editor/Game w…...

Qt问题之 告别软件因系统默认中文输入法导致错误退出的烦恼

1. 问题 使用Qt进行研发时&#xff0c;遇到一个问题&#xff0c;当在系统默认输入法中文&#xff08;英文输入法或者搜狗就不会触发闪退&#xff09;的情况下&#xff0c;选中QTableWidget控件&#xff08;QTableWidgetItem有焦点&#xff0c;但是不双击&#xff09;&#xff…...

力扣热题100刷题day62|283.移动零、39.组合总和、94.二叉树的中序遍历

1.283.移动零——双指针 快慢两个指针&#xff0c;慢指针指向新数组&#xff0c;快指针遍历旧数组&#xff0c;寻找非0元素&#xff0c;找到后&#xff0c;交换快慢指针所指向元素&#xff1b; 因为快指针已经遍历过&#xff0c;所以交换前慢指针处的元素都是0&#xff1b; …...

API 请求失败时的处理方法

在使用 Python 爬虫调用 API 时&#xff0c;请求失败是一个常见的问题。这可能是由于网络问题、API 限制、服务器错误或其他原因导致的。为了确保爬虫的稳定性和可靠性&#xff0c;我们需要合理地处理这些失败的请求。以下是一些有效的处理方法&#xff1a; 1. 捕获异常 使用…...

【MySQL | 八、 事务管理】

文章目录 什么是事务&#xff1f;事务的特性&#xff1a;事务的意义事务的提交查看事务提交方式事务的自动提交事务的手动提交开始事务执行SQL操作事务操作提交事务示例&#xff1a; 事务的隔离级别并发访问的基本概念并发事务的典型问题对ACID特性的影响查看和设置隔离属性各个…...

AlDente Pro for Mac电脑 充电限制保护工具

AlDente Pro for Mac电脑 充电限制保护工具 一、介绍 AlDente Pro for Mac&#xff0c;是一款充电限制保护工具&#xff0c;是可以限制最大充电百分比来保护电池的工具。锂离子和聚合物电池&#xff08;如 MacBook 中的电池&#xff09;在40&#xff05; 至 80&#xff05; 之…...

算法训练之动态规划(一)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

Navicat连接远程PostGreSQL失败

问题描述 使用本地Navicat连接Windows远程服务器上部署的PostGreSQL数据库时,出现以下错误: 解决方案 出现以上报错信息,是因为PostGreSQL数据库服务尚未设置允许客户端建立远程连接。可做如下配置, 1. 找到PostGreSQL数据库安装目录下的data子文件夹,重点关注:postgres…...

漏洞扫描系统docker版本更新(2025.4.10)

一、github地址 https://github.com/huan-cdm/info_scan本人一直维护的一个项目&#xff0c;持续更新中&#xff0c;感兴趣的小伙伴帮忙点点星 二、docker版本更新 1. 账号密码&#xff1a;nginx/web/mysql&#xff1a;admin/123456 2. 创建docker自定义网络&#xff0c;使容…...

新一代达梦官方管理工具SQLark:可视化建表操作指南

在数据库管理工作中&#xff0c;新建表是一项基础且频繁的操作。SQLark 的可视化建表功能为我们提供了一种高效、便捷且丝滑流畅的建表新体验。一起来了解下吧。 SQLark 官方下载链接&#xff1a;www.sqlark.com 新建表作为常见的功能&#xff0c;相比其他管理工具&#xff0c;…...

什么是EXR透视贴图 ?

EXR透视贴图是一种基于 OpenEXR 格式的高动态范围&#xff08;HDR&#xff09;图像技术&#xff0c;主要用于3D建模、渲染和视觉特效领域。它通过高精度图像数据和透视映射功能&#xff0c;为场景创建逼真的光影效果和空间深度。 技术原理 高动态范围&#xff08;HDR&#xf…...

音频转文本:如何识别音频成文字

Python脚本:MP4转MP3并语音识别为中文 以下是一个完整的Python脚本,可以将MP4视频转换为MP3音频,然后使用语音识别模型将音频转换为中文文本。 准备工作 首先需要安装必要的库: pip install moviepy pydub SpeechRecognition openai-whisper完整脚本 import os from m…...

每日一题(小白)数组娱乐篇21

由于题意可知我们是要将对应的数字转换为英文&#xff0c;我们要考虑两点一个是进制的转换&#xff0c;也就是类似于我们的十进制一到9就多一位&#xff0c;这里的进制就是Z进制也就是27进制一旦到26下一位则进位&#xff1b;另一方面要考虑数字的转换也就是1~26对应A~Z。解决上…...

LINUX的使用(1)-挂载云硬盘

1.磁盘的挂载&#xff1a; 这个输出是来自 fdisk 或类似的工具&#xff0c;它展示了两块磁盘的分区信息。让我们逐个分析&#xff1a; 第一块磁盘 /dev/sda: 磁盘大小: 53.7 GB (约 53687091200 字节)&#xff0c;总共有 104857600 个扇区。扇区单位: 每个扇区大小为 512 字节…...

GPT-4o-image模型:开启AI图片编辑新时代

在生成式AI技术爆发式迭代的今天&#xff0c;智创聚合API率先突破多模态创作边界&#xff0c;正式发布集成GPT-4o-image模型的创作平台&#xff0c;以“文生图-图生图-循环编辑”三位一体的技术矩阵&#xff0c;重新定义数字内容生产流程。生成图像效率较传统工具提升300%&…...

基于Python的网络爬虫技术研究

基于Python的网络爬虫技术研究 以下从多个方面为你介绍基于 Python 的网络爬虫技术&#xff1a; 概述 网络爬虫是一种自动获取网页内容的程序&#xff0c;在 Python 中可以借助诸多强大的库和工具实现。网络爬虫能应用于数据采集、搜索引擎、舆情监测等众多领域。 核心库 …...

使用pip3安装PyTorch与PyG,实现NVIDIA CUDA GPU加速

使用python3的pip3命令安装python依赖库。 # python3 -V Python 3.12.3 # # pip3 -V pip 25.0.1 from /root/.pyenv/versions/3.12.3/lib/python3.12/site-packages/pip (python 3.12)Usage: pip3 install [options] <package> ...pip3 install [options] -r <re…...

Rust主流框架性能比拼: Actix vs Axum vs Rocket

本内容是对知名性能评测博主 Anton Putra Actix (Rust) vs Axum (Rust) vs Rocket (Rust): Performance Benchmark in Kubernetes 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在以下中&#xff0c;我们将比较 Rust 生态中最受欢迎的几个框架。我会将三个应用程序…...

设计模式-观察者模式和发布订阅模式区别

文章目录 其他不错的文章 二者有类似的地方&#xff0c;也有区别。 引用的文章说的已经比较清楚了&#xff0c;这里只列出对比图。 对比点观察者模式发布订阅模式中间人角色无事件中心&#xff0c;观察者直接订阅目标有事件中心&#xff0c;发布者与订阅者通过事件中心通信关系…...

【QT】QT的消息盒子和对话框(自定义对话框)

QT的消息盒子和对话框&#xff08;自定义对话框&#xff09; 一、消息盒子QMessageBox1、弹出警告盒子示例代码&#xff1a;现象&#xff1a; 2、致命错误盒子示例代码&#xff1a;现象&#xff1a; 3、帮助盒子示例代码&#xff1a;现象&#xff1a; 4、示例代码&#xff1a; …...

ArcGIS 给大面内小面字段赋值

文章目录 引言:地理数据处理中的自动化赋值为何重要?实现思路模型实现关键点效果实现步骤1、准备数据2、执行3、完成4、效果引言:地理数据处理中的自动化赋值为何重要? 在地理信息系统(GIS)的日常工作中,空间数据的属性字段赋值是高频且关键的操作,例如在土地利用规划…...

【结合vue源码,分析vue2及vue3的数据绑定实现原理】

结合vue源码&#xff0c;分析vue2及vue3的数据绑定实现原理 Vue 2 数据绑定实现整体思路详细实现1. Observer 类&#xff1a;数据劫持2. Dep 类&#xff1a;依赖收集3. Watcher 类&#xff1a;订阅者 Vue 3 数据绑定实现整体思路详细实现1. reactive 函数&#xff1a;创建响应式…...

WebGPU:前端图形技术的革命性进化与WebGL的未来

WebGPU&#xff1a;前端图形技术的革命性进化与WebGL的未来 WebGPU作为新一代Web图形API&#xff0c;正在引发前端图形领域的深刻变革。本文将全面剖析WebGPU的技术优势、性能表现、应用场景&#xff0c;以及它与WebGL的关系和未来发展趋势。 WebGPU与WebGL的技术代差 WebGP…...

如何实现H5端对接钉钉登录并优雅扩展其他平台

如何实现H5端对接钉钉登录并优雅扩展其他平台 钉钉H5登录逻辑后端代码如何实现&#xff1f;本次采用策略模式工厂方式进行定义接口确定会使用的基本鉴权步骤具体逻辑类进行实现采用注册表模式&#xff08;Registry Pattern&#xff09;抽象工厂进行基本逻辑定义具体工厂进行对接…...

Android MediaStore访问的外部存储公共空间都不需要申请权限,这些目录具体指的是哪些

在 Android 10 及更高版本中&#xff0c;通过 MediaStore 访问以下 ​​外部存储公共目录​​ 时&#xff0c;如果操作的是应用自己创建的文件&#xff0c;则​​无需申请存储权限​​。这些目录属于系统明确定义的媒体集合&#xff0c;具体包括&#xff1a; 1. 媒体类型目录​…...

Java中的Exception和Error有什么区别?还有更多扩展

概念 在Java中&#xff0c;Exception和Error都是Throwable的子类&#xff0c;用于处理程序中的错误和异常情况。 然而&#xff0c;它们在用途和处理方式上有显著的不同&#xff1a; Exception&#xff1a; 用于表示程序在正常运行过程中可能出现的错误&#xff0c;如文件未找…...