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

SpringCloud-Gateway网关的使用

本文介绍如何再 SpringCloud 项目中引入 Gateway 网关并完成网关服务的调用。Gateway 网关是一个在微服务架构中起到入口和路由控制的关键组件。它负责处理客户端请求,进行路由决策,并将请求转发到相应的微服务。Gateway 网关还可以实现负载均衡、安全认证、日志记录等功能,集中管理服务间的通信,提升整体系统的可维护性和安全性。通过 Gateway 网关,可以实现统一的访问点,简化客户端与后端微服务之间的交互,同时也能够更灵活地进行流量控制和监控。


一、Gateway网关介绍

Gateway 网关是一个基于 Spring Cloud 的 API 网关服务,它提供了路由、过滤、监控、日志等功能,用于统一管理和转发微服务的请求流量。作为微服务架构中的入口点,Gateway 网关可以实现负载均衡、安全认证、请求转发等功能,提高了系统的安全性、可用性和可维护性。

网关的作用:

  • 对用户请求做身份认证、权限校验
  • 将用户请求路由到微服务,并实现负载均衡
  • 对用户请求做限流

含 Gateway 网关项目结构示意图:


二、搭建Gateway网关

搭建Gateway网关需要以下步骤:

1、创建Gateway模块

我们需要的开发环境中创建一个新的Spring Boot项目。
不会创建的可以参考我之前的文章:SpringCloud-创建多模块项目

在SpringCloud项目上我们创建Gateway模块,我命名为 springcloud-gateway。


2、引入SpringCloud-Gateway依赖

在 springcloud-gateway 项目的 pom.xml 文件中引入 Spring Cloud Gateway 的依赖。

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

3、配置路由规则

编辑 applicatin.yml,配置 Gateway 网关的路由规则,包括定义路由路径、目标服务等信息。

server:port: 8090
spring:application:name: springcloud-gatewaycloud:nacos:server-addr: localhost:8848gateway:discovery:locator:enabled: true # 开启自动路由routes: # 网关路由配置- id: gateway-service # 路由id,自定义,唯一uri: lb://target # 路由的目标地址,lb表示负载均衡predicates: # 路由断言,判断请求是否符合路由规则- Path=/gateway/** # 要求请求路径以/user/开头,否则404filters:- StripPrefix=1 # 转发请求时uri过滤掉/gateway

我们添加了动态路由,这里的动态路由属性可以自动让网关的转发请求负载均衡。

这里我们用到了一个 Path 断言,要求请求路径以 /user/ 开头,否则请求会返回404 (未找到服务) 。这里我们还用到了一个过滤器,让网关转发请求时,去掉前缀 /gateway。断言工厂和过滤器的概念我们在下文进行详细讲解。


4、添加断言

在Spring Cloud Gateway中,断言(Predicate)用于定义请求匹配的条件,从而决定是否应用某个过滤器链。以下是一些常见的Gateway断言种类和相应的示例:

断言种类匹配规则示例
Path根据请求的路径进行匹配。- Path=/api/**
匹配路径为 "/api/**" 的请求。
Method根据请求的HTTP方法进行匹配。- Method=GET
匹配GET请求。
Header根据请求的头部信息进行匹配。- Header=Authorization, \d+
匹配包含 "Authorization" 头部的请求。
Host根据请求的主机名进行匹配。- Host=example.com
匹配主机名为 "example.com" 的请求。
Query根据请求的查询参数进行匹配。- Query=category, \w+
匹配包含 "category" 参数的请求。
Cookie根据请求的Cookie进行匹配。- Cookie=sessionId, \d+
匹配包含名为 "sessionId" 的Cookie的请求。
Combining将多个断言组合成一个逻辑条件,
实现更复杂的匹配。
- Path=/api/** AND Method=GET
同时匹配路径为 "/api/**" 且是GET请求的请求。

下面来举个例子:

server:port: 8090
spring:application:name: springcloud-gatewaycloud:nacos:server-addr: localhost:8848gateway:discovery:locator:enabled: true # 开启自动路由routes:- id: gateway-serviceuri: lb://targetpredicates:- Header=Authorization, Bearer 831B175-D251501-31A3F301-711636-9CAE

这里用到的最常用的 Header 断言中的鉴权断言,要求访问网关的请求必须在请求头里带有 <Authorization, Bearer 831B175-D251501-31A3F301-711636-9CAE> 的鉴权码,如果没有鉴权码或者鉴权码不匹配,则返回 404。


5、添加过滤器

Spring Cloud Gateway提供了丰富的过滤器种类,这些过滤器用于在请求进入网关或响应离开网关时执行各种操作。以下是一些常见的Gateway过滤器种类:

过滤器种类过滤器作用
Pre Filters
(前置过滤器)
AddRequestHeader: 添加请求头。
AddRequestParameter: 添加请求参数。
ModifyRequestBody: 修改请求体。
Route Filters
(路由过滤器)
AddResponseHeader: 添加响应头。
AddResponseParameter: 添加响应参数。
Hystrix: 集成Hystrix断路器,提供服务容错能力。
Post Filters
(后置过滤器)
SetStatus: 设置响应状态码。
ModifyResponseBody: 修改响应体。
Error Filters
(错误过滤器)
SendError: 处理请求发生错误时的操作。
ExceptionHandler: 自定义异常处理。
Global Filters
(全局过滤器)
GlobalFilter: 全局过滤器,适用于所有路由。
Ordered: 为过滤器设置顺序。
Custom Filters
(自定义过滤器)
自定义实现GatewayFilter接口: 开发者可以通过实现该接口创建自定义的过滤器。

这些过滤器可以按照需求进行组合和配置,使得开发者可以在Gateway中实现各种复杂的请求和响应处理逻辑。通过合理配置过滤器,可以实现日志记录、认证授权、请求重试、熔断器等功能,提高网关的灵活性和可扩展性。

下面我们来举个例子:

server:port: 8090
spring:application:name: springcloud-gatewaycloud:nacos:server-addr: localhost:8848gateway:discovery:locator:enabled: true # 开启自动路由routes:- id: gateway-serviceuri: lb://targetpredicates:- Path=/gateway/**filters:- StripPrefix=1- AddRequestHeader=test_header, damon0806

这里可以看到,我们在 routes(网关路由)下配置了 filters(过滤器)。

  • StripPrefix=1:表示从请求的URI中去除前缀的数量。在这里,1 表示去除两级路径的前缀。例如,如果原始请求是 /path1/rest-of-the-uri,使用此配置后,转发到后端的请求 URI 将是 /rest-of-the-uri
  • AddRequestHeader=test_header, damon0806:表示在请求头中添加一个自定义的头部。具体来说,它添加了一个名为 test_header 的头部,其值为 damon0806。这可以用于在请求发送到后端服务时传递额外的信息或标识。

6、启动网关服务

编写 springcloud-gateway 的启动类,启动 Gateway 网关服务,使其开始监听和转发请求。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringcloudGatewayApplication {public static void main(String[] args) {SpringApplication.run(SpringcloudGatewayApplication.class, args);}
}

7、测试路由

可以使用 Postman 等接口测试工具发送请求,测试 Gateway 网关是否能够正确转发请求到相应的微服务,以及断言工厂或者过滤器是否实现。


三、Gatway网关的作用

Gateway 网关作为微服务架构中的入口点,扮演着关键的角色。

其作用主要体现在以下几个方面:

作用点详细描述
路由
(Routing)
Gateway能够根据请求的路径,将请求路由到相应的微服务实例上。简化了服务调用的过程,使得客户端无需直接关注每个微服务的位置和细节。
负载均衡
(Load Balancing)
Gateway支持负载均衡,可将请求均匀地分发到多个微服务实例,提高系统的可用性和性能。有效避免了单一服务实例的过载,提高了整体系统的稳定性。
过滤
(Filtering)
Gateway可以通过过滤器实现对请求和响应进行处理,如添加、修改请求头、记录日志、认证、鉴权等操作。统一处理与安全、日志、性能等相关的逻辑,使得系统更加易于维护和管理。
熔断器
(Circuit Breaker)
Gateway支持熔断器机制,当某个微服务出现故障或超时时,能够自动切换到备用服务,防止故障向下游传递。提高了系统的容错性,减少了因单一服务故障而导致整个系统不稳定的风险。
统一异常处理
(Exception Handling)
Gateway可以统一处理微服务中的异常,提供友好的错误提示,防止细节泄露给客户端。提高了系统的安全性和用户体验,降低了对异常的不良影响。
协议转换
(Protocol Transformation)
Gateway支持协议的转换,可以将外部请求转换成内部微服务所需的协议。降低了微服务之间的耦合度,允许使用不同的协议进行通信。

Gateway网关在微服务架构中承担了集中处理、管理和保护服务的责任,通过提供统一的入口和处理机制,使得微服务系统更加稳定、灵活和易于维护。


四、Gateway网关服务的调用

下面是前端 Ajax 调用网关服务的实例:

前端 JavaScript 代码:

$.ajax({type: "POST",url: "http://localhost:8090/gateway/getUserList",data: {},dataType: 'json'
});

网关配置如下:

server:port: 8090
spring:application:name: springcloud-gatewaycloud:nacos:server-addr: localhost:8848gateway:discovery:locator:enabled: true # 开启自动路由routes:- id: gateway-serviceuri: lb://targetpredicates:- Path=/gateway/**filters:- StripPrefix=1- AddRequestHeader=test_header, damon0806

当我们执行上述 Ajax 请求时,请求会被网关转发到 lb://target/getUserList 上。


五、Gateway网关总结

Gateway网关作为微服务架构中的关键组件,承担着诸多重要任务,为整个系统提供了一种高效、可靠的服务入口。以下是对Gateway网关的总结:

要点要点详细内容
统一入口Gateway网关为微服务提供了一个统一的入口,客户端通过与网关交互,无需直接访问每个微服务,简化了服务调用的复杂性。
路由与负载均衡Gateway能够根据路由规则将请求动态转发到不同的微服务实例,同时支持负载均衡,提高了系统的可用性和性能。
过滤器与拦截通过过滤器,Gateway网关能够在请求进入网关或响应离开网关时执行一系列操作,如鉴权、认证、日志记录等,增强了系统的安全性和可维护性。
熔断与异常处理Gateway网关支持熔断器机制,能够处理微服务的异常情况,避免故障的扩散。统一的异常处理机制提高了系统的稳定性和用户体验。
协议转换与透明性Gateway网关允许协议的转换,为微服务提供了透明的通信机制。这使得微服务之间可以使用不同的通信协议,提高了系统的灵活性。
集中式管理Gateway网关提供了集中管理微服务的能力,可以在一个地方配置和管理所有微服务的路由规则和过滤器,降低了系统的维护成本。
性能监控与日志记录Gateway网关可以通过集成性能监控工具和记录详细日志,帮助开发人员更好地了解系统的运行状况,方便进行性能优化和故障排查。

综上所述,Gateway网关在微服务架构中扮演了不可或缺的角色,通过集中化管理、智能路由和强大的过滤器机制,为构建高效、可扩展的微服务系统提供了有力支持。其优势在于简化了开发、提高了系统的可维护性,并在面对复杂的微服务架构时提供了一种优雅的解决方案。

相关文章:

SpringCloud-Gateway网关的使用

本文介绍如何再 SpringCloud 项目中引入 Gateway 网关并完成网关服务的调用。Gateway 网关是一个在微服务架构中起到入口和路由控制的关键组件。它负责处理客户端请求&#xff0c;进行路由决策&#xff0c;并将请求转发到相应的微服务。Gateway 网关还可以实现负载均衡、安全认…...

想要学习编程,有什么推荐的书籍吗

如果你要变得更好&#xff0c;C语言是一个极佳的选择&#xff0c;其原因有二。首先&#xff0c;C语言缺乏任何现代的安全功能&#xff0c;这意味着你必须更为警惕&#xff0c;时刻了解真正发生的事情。如果你能写出安全、健壮的C代码&#xff0c;那你就能用任何编程语言写出安全…...

LWM(LargeWorldModel)大世界模型-可文字可图片可视频-多模态LargeWorld-视频问答成功运行-实现循环问答多次问答

Large World Model&#xff08;LWM&#xff09;现在大火&#xff0c;其最主要特点是不仅能够针对文本进行检索交互&#xff0c;还能对图片、视频进行问答交互&#xff0c;自从上文《LWM(LargeWorldModel)大世界模型-可文字可图片可视频-多模态LargeWorld-详细安装记录》发出后&…...

线阵相机之帧超时

1 帧超时的效果 在帧超时时间内相机若未采集完一张图像所需的行数&#xff0c;则相机会直接完成这张图像的采集&#xff0c;并自动将缺失行数补黑出图&#xff0c;机制有以下几种选择&#xff1a; 1. 丢弃整张补黑的图像 2. 保留补黑部分出图 3.丢弃补黑部分出图...

模型转换案例学习:等效替换不支持算子

文章介绍 Qualcomm Neural Processing SDK &#xff08;以下简称SNPE&#xff09;支持Caffe、ONNX、PyTorch和TensorFlow等不同ML框架的算子。对于某些特定的不支持的算子&#xff0c;我们介绍一种算子等效替换的方法来完成模型转换。本案例来源于https://github.com/quic/qidk…...

js 数组排序的方式

var numberList [5, 100, 94, 71, 49, 36, 2, 4]; 冒泡排序&#xff1a; 相邻的数据进行两两比较&#xff0c;小数放在前面&#xff0c;大数放在后面&#xff0c;这样一趟下来&#xff0c;最小的数就被排在了第一位&#xff0c;第二趟也是如此&#xff0c;如此类推&#xff0…...

手机连接电脑后资源管理器无法识别(识别设备但无法访问文件)

问题描述 小米8刷了pixel experience系统,今天用电脑连接后无法访问手机文件,但是手机选择了usb传输模式为文件传输 解决办法 在设备和打印机页面中右键选择属性 点击改变设置 卸载驱动,注意勾选删除设备的驱动程序软件 卸载后重新连接手机,电脑弹出希望对设备进行什么操作时…...

安装unget包 sqlsugar时报错,完整的报错解决

前置 .net6的开发环境 问题 ? 打开unget官网&#xff0c;搜索报错的依赖Oracle.ManagedDataAccess.Core unget官网 通过unget搜索Oracle.ManagedDataAccess.Core查看该依赖的依赖 发现应该是需要的依赖Oracle.ManagedDataAccess.Core(>3.21.100)不支持.net6的环境 解…...

oracle数据库事务的四大特性与隔离级别与游标

数据库事务的四大特性: 这里提到了 ACID 四个特性&#xff0c;分别是&#xff1a; A&#xff08;Atomicity&#xff09;&#xff1a; 原子性&#xff0c;确保事务中的所有操作要么全部执行成功&#xff0c;要么全部不执行&#xff0c;不存在部分执行的情况。 C&#xff08;…...

Day25--learning English

一、积累 1.crab 2.scrape 3.crude 4.infect 5.blinds 6.plunk 7.fart 8.expel 9.stamp 10.tongs 11.utensil 12.sticky 13.yolk 14.snap 15.fuzz 16.chuck 17.hamper 18.panel 19.prod 20.eyebrow 二、练习 1.牛津原译 scrape /skreɪp/ REMOVE 除去 1.to remove sth from…...

职业技能鉴定服务中心前端静态页面(官网+证书查询)

有个朋友想做职业技能培训&#xff0c;会发证书&#xff0c;证书可以在自己网站可查。想做一个这样的网站&#xff0c;而且要特别土&#xff0c;一眼看上去像xxx官方网站&#xff0c;像jsp .net技术开发的网站。用htmlcssjquery还原了这样子一个前端页面&#xff0c;这里分享给…...

第六十六天 API安全-接口安全阿里云KEY%postmanDVWSXEE鉴权泄露

第66天 API安全-接口安全&阿里云KEY%postman&DVWS&XEE&鉴权&泄露 知识点 1.HTTP类接口-测评 2.RPC类接口-测评 3.Web Service类-测评 参考链接&#xff1a;https://www.jianshu.com/p/e48db27d7c70 内容点&#xff1a; SOAP(Simple Object Access Prot…...

在Vue3 + Vite项目中使用less

在Vue3 Vite项目中使用less&#xff0c;需要安装less和less-loader两个依赖。 首先&#xff0c;在项目根目录下执行以下命令安装less和less-loader&#xff1a; npm install less less-loader --save-dev安装完成后&#xff0c;在vite.config.js配置文件中添加以下代码&…...

this的指向问题总结

this一般会出现在函数里面&#xff0c;但是一般情况下只有在函数被调用执行时&#xff0c;才能确定this指向哪个对象。一般情况下this是指调用函数的对象。 1.在全局作用域下或者普通函数中this的指向一般都是window对象 window.fn&#xff08;&#xff09;&#xff0c;普通函…...

jQuery的应用(二)

对上一节内容的补充。 jQuery选择器 jQuery选择器类似于CSS选择器,用来选取网页中的元素 jQuery选择器功能强大,种类也很多,分类如下 通过CSS选择器选取元素: 基本选择器层次选择器属性选择器通过过滤选择器选择元素: 基本过滤选择器可见性过滤选择器表单对象过滤选择器…...

芋道源码(yudao)跳转新页面的几种方式

芋道源码&#xff08;yudao&#xff09;跳转新页面的几种方式 导入useRouter const { push, replace, resolve } useRouter() 当前页面跳转 const goToPage (url: string) > {url push(/hot163) }当前页面跳转 const goToPage (url: string) > {url resolve(/h…...

Open AI — Sora 如何发挥其魔力 — 近距离观察该技术

OpenAI 的大模型 Sora 可以制作一整分钟的高质量视频。他们的工作成果表明,使视频生成模型更大是为现实世界创建多功能模拟器的好方法。Sora 是一种灵活的可视化数据模型。它可以创建不同长度、形状和大小的视频和图片,甚至可以创建长达一分钟的高清视频。我阅读了 OpenAI 的…...

密码解密 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 给定一段 “密文”字符串 s &#xff0c;其中字符都是经过 “密码本” 映射的&#xff0c;现需要将“密文”解密并且输出。 映射的规则&#xff1a; ( a−i ) 分…...

【深度学习】Pytorch教程(八):PyTorch数据结构:2、张量的数学运算(6):高维张量:乘法、卷积(conv2d~四维张量;conv3d~五维张量)

文章目录 一、前言二、实验环境三、PyTorch数据结构1、Tensor&#xff08;张量&#xff09;1. 维度&#xff08;Dimensions&#xff09;2. 数据类型&#xff08;Data Types&#xff09;3. GPU加速&#xff08;GPU Acceleration&#xff09; 2、张量的数学运算1. 向量运算2. 矩阵…...

Autosar-Mcal配置详解-GPT

3.3.1添加GPT模块 方法与添加Dio相似&#xff0c;可参加Dio模块添加方法。 3.3.2 创建、配置GPT通道 1)根据需求创建GPT通道&#xff08;即创建几个定时器&#xff09; 本例中创建了3个定时器通道&#xff1a;1ms&#xff0c;100us&#xff0c;OsTimer。 2)配置GPT通道 配置T…...

前端面试问题(jwt/布局/vue数组下标/扁平化/菜单树形/url api/新版本)

前端面试问题(jwt/布局/vue数组下标/扁平化/菜单树形/url api/新版本) 1. jwt鉴权逻辑 前端 JWT 鉴权逻辑通常涉及在发起请求时携带 JWT&#xff0c;并在接收到响应后处理可能的授权问题。 1. 用户登录&#xff1a; 用户提供凭证&#xff1a; 用户在登录界面输入用户名和密码…...

Learn HTML in 1 hour

website address https://www.youtube.com/watch?vHD13eq_Pmp8 excerpt All right, what’s going on? everybody. It’s your Bro, hope you’re doing well, and in this video I’m going to help you started with html; so sit back, relax and enjoy the show. If y…...

HashMap的put方法执行过程

根据Key通过哈希算法与与运算得出数组下标如果数组下标位置元素为空&#xff0c;则将key和value封装为Entry对象&#xff08;JDK1.7中是Entry对象&#xff0c;JDK1.8中 是Node对象&#xff09;并放⼊该位置如果数组下标位置元素不为空&#xff0c;则要分情况讨论 a. 如果是JDK1…...

一、直方图相关学习

目录 1、灰度直方图1.1 基本概念和作用1.2 代码示例 2、BGR直方图2.1 基本概念和作用2.2 代码示例 3、灰度直方图均衡1. 基本概念和作用2. 代码示例 4、直方图变换&#xff08;查找&#xff09;4.1 基本概念和作用4.2 代码示例 5、直方图匹配5.1 基本概念和作用5.2 代码示例 6、…...

Linux 权限详解

目录 一、权限的概念 二、权限管理 三、文件访问权限的相关设置方法 3.1chmod 3.2chmod ax /home/abc.txt 一、权限的概念 Linux 下有两种用户&#xff1a;超级用户&#xff08; root &#xff09;、普通用户。 超级用户&#xff1a;可以再linux系统下做任何事情&#xff…...

零基础学习8051单片机(十五)

本次先看书学习&#xff0c;并完成了课后习题&#xff0c;题目出自《单片机原理与接口技术》第五版—李清朝 答: &#xff08;1&#xff09;当 CPU正在处理某件事情的时候&#xff0c;外部发生的某一件事件请求 CPU 迅速去处理&#xff0c;于是&#xff0c;CPU暂时中止当前的工…...

项目的一些难点

1.不用redis?分布式锁&#xff0c;如何防止用户重复点击&#xff1f; 1.乐观锁 乐观锁是一种在数据库层面上避免并发冲突的机制。它通常通过在数据库记录中添加一个版本号&#xff08;或时间戳&#xff09;来实现。每次更新记录时&#xff0c;都会检查版本号是否与数据库中的…...

Kubernetes 卷存储 NFS | nfs搭建配置 原理介绍 nfs作为存储卷使用

1、NFS介绍 NFS&#xff08;Network File System&#xff09;是一种分布式文件系统协议&#xff0c;允许客户端远程访问服务器上的文件&#xff0c;实现数据共享。它整合多个存储设备为统一文件系统&#xff0c;方便数据存储和管理&#xff0c;支持负载均衡和故障转移&#xf…...

开启智能互动新纪元——ChatGPT提示词工程的引领力

目录 提示词工程的引领力 高效利用ChatGPT提示词方法 提示词工程的引领力 近年来&#xff0c;随着人工智能技术的迅猛发展&#xff0c;ChatGPT提示词工程正逐渐崭露头角&#xff0c;为智能互动注入了新的活力。这一技术的引入&#xff0c;使得人机交流更加流畅、贴近用户需求&…...

ElasticSearch语法

Elasticsearch 概念 入门学习: Index索引>MySQL 里的表(table)建表、增删改查(查询需要花费的学习时间最多)用客户端去调用 ElasticSearch(3 种)语法:SQL、代码的方法(4 种语法) ES 相比于 MySQL&#xff0c;能够自动帮我们做分词&#xff0c;能够非常高效、灵活地查询内…...