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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/695352.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue大文件读取部分内容,避免重复加载大文件,造成流量浪费

使用场景&#xff1a;项目点云地图是pcd文件&#xff0c;但是文件可能上百兆&#xff0c;我需要获取到文件中的版本信息&#xff0c;跟本地的缓存文件做比较&#xff0c;如果不一致&#xff0c;才会加载整个文件。从而节省流量。 避免重复加载整个“.pcd文件&#xff0c;以最大…

【PX4学习笔记】04.QGC地面站的使用

目录 文章目录 目录PX4代码烧入PX4固件代码的烧入方式1PX4固件代码的烧入方式2 QGC地面站的基础使用连接地面站的方式查看关键的硬件信息 QGC地面站的Application Settings模块Application Settings模块-常规界面单位其他设置数据持久化飞机中的数传日志飞行视图计划视图自动连…

观察者模式, 发布-订阅模式, 监听器模式

观察者模式, 发布-订阅模式, 监听器模式 观察者模式 观察者模式是一种行为型设计模式, 定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新 角色模型和结构图 在观察者模式中&#xff0c;只有两种…

HarmonyOS Stage模型基本概念讲解

本文 我们来说harmonyos中的一种应用模型 Stage模型 官方提供了两种模型 一种是早期的 FA模型 另一种就是就是 harmonyos 3.1才开始的新增的一种模型 Stage模型 目前来讲 Stage 会成为现在乃至将来 长期推进的一种模型 也就是 无论是 现在的harmonyos 4.0 乃至 之后要发布的 …

IP地理位置查询定位:技术原理与实际应用

在互联网时代&#xff0c;IP地址是连接世界的桥梁&#xff0c;而了解IP地址的地理位置对于网络管理、个性化服务以及安全监控都至关重要。IP数据云将深入探讨IP地理位置查询定位的技术原理、实际应用场景以及相关的隐私保护问题&#xff0c;旨在为读者提供全面了解和应用该技术…

印刷机械故障诊断:虹科MSR165助力Müller Martini AG成功案例

在为杂志装订机开发新产品的过程中&#xff0c;作为印刷后处理机械领域的全球领导者&#xff0c;Mller Martini AG公司发现了传感器故障的问题。通过使用虹科MSR 微型加速度数据记录仪&#xff0c;成功地确定了故障的原因。 新杂志装订机中的三刀修整装置的故障部件是边缘传感器…

BOSS直聘招聘经验

招聘低端兼职岗位。流量很大&#xff0c;来的人通常实力也不足。 招聘高端兼职岗位。流量不多。来的人通常具备一定实力。 招聘高薪职位&#xff0c;流量一般&#xff0c;会有有实力的勾搭。 招聘低薪职位&#xff0c;流量一般。通常没什么实力。

使用 Optimum Intel 在英特尔至强上加速 StarCoder: Q8/Q4 及投机解码

引言 近来&#xff0c;随着 BigCode 的 StarCoder 以及 Meta AI 的 Code Llama 等诸多先进模型的发布&#xff0c;代码生成模型变得炙手可热。同时&#xff0c;业界也涌现出了大量的致力于优化大语言模型 (LLM) 的运行速度及易用性的工作。我们很高兴能够分享我们在英特尔至强 …

测试多线程架构的问题

在测试多线程架构时&#xff0c;需要考虑多个方面以确保系统的稳定性和性能。以下是一些关键问题&#xff0c;需要在测试过程中特别关注&#xff1a; 线程同步 多线程环境中&#xff0c;线程同步是非常重要的问题。由于多个线程可能同时访问共享资源&#xff0c;因此需要使用…

Linux环境下查看磁盘层级占用空间的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

C++从入门到精通 第十三章(认识STL)

写在前面&#xff1a; 本系列专栏主要介绍C的相关知识&#xff0c;思路以下面的参考链接教程为主&#xff0c;大部分笔记也出自该教程&#xff0c;笔者的原创部分主要在示例代码的注释部分。除了参考下面的链接教程以外&#xff0c;笔者还参考了其它的一些C教材&#xff08;比…

下一代自动化爬虫神器--playwright,所见即所得,配合逆向不要太香!!!

文章目录 1.Playwright介绍2.与 Selenium 和 pyppeteer 相比&#xff0c;Playwright 具有以下几个区别和优势3.在爬虫中使用 Playwright 的好处4.环境安装5.屏幕录制6.保留记录cookie信息7.playwright代码编写详解1.第一个Playwright脚本&#xff08;1&#xff09;同步模式&…

Redis之缓存穿透问题解决方案实践SpringBoot3+Docker

文章目录 一、介绍二、方案介绍三、Redis Docker部署四、SpringBoot3 Base代码1. 依赖配置2. 基本代码 五、缓存优化代码1. 校验机制2. 布隆过滤器3. 逻辑优化 一、介绍 当一种请求&#xff0c;总是能越过缓存&#xff0c;调用数据库&#xff0c;就是缓存穿透。 比如当请求一…

阿里云国际站如何助力餐饮行业出海?

近些年&#xff0c;中国企业出海方兴未艾。全球不同国家的经济政治诉求加剧了商业领域的博弈&#xff0c;全球产业供应链格局持续发生深刻变化。无论是海外建厂&#xff0c;还是海外找市场&#xff0c;中国产业链的全球布局蔚然成风,企业想突破现阶段瓶颈&#xff0c;谋求更好的…

⭐北邮复试刷题106. 从中序与后序遍历序列构造二叉树__递归分治 (力扣每日一题)

106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postor…

ros自定义action记录

文章目录 自定义action1. 定义action文件2. 修改 package.xml3. 修改 CMakeLists.txt4. 运行 catkin build5. simple_action_server.py6. simple_action_client.py 测试 自定义action ros 版本&#xff1a;kinetic 自定义test包的文件结构如下 |-- test | |-- CMakeLists.t…

Internet Download Manager 6.42.3 (IDM) 中文免激活绿色版

相信很多网友都遇到过一种情况&#xff0c;网页有些视频资源或者音频资源不知道如何下载&#xff0c;一直不知道如何解决&#xff0c;为此小编特意带来了这款&#xff1a;Internet Download Manager电脑版&#xff0c;这是一款非常专业且十分好用的下载工具&#xff0c;也就是大…

Android 11以上获取不到第三方app是否安装

开年第一篇&#xff0c;处理了一下年前的小问题。 问题&#xff1a;本地app跳转到第三方app地图进行导航&#xff0c;获取不到第三方地图是否安装。 解决&#xff1a; 1.添加包名 This can be done by adding a <queries> element in the Android manifest.在app下的…

1408: [宁波25届]方格稿纸

题目描述 小猪在小学中认识了很多的字&#xff0c;终于会写一点作文了。某天小猪买了一张方格稿纸来写作文,n 行m 列,形状如下所示&#xff1a; 上图中nm5 。 某天小猪的邻居小小猪来小猪家玩&#xff0c; 用黑墨水笔把小猪新买的方格稿纸涂黑了很多格子。 每个格子不是完全黑…

psp游戏存档收集SAVEDATA

不想从头开始 ppsspp存档目录 pc&#xff1a;ppsspp解压目录\memstick\PSP\SAVEDATA 安卓&#xff1a;根目录\PSP\SAVEDATA 噬神者2(日版) NPJH50832099c645531020001000 風燐-https://wwl.lanzouq.com/iI1R01owozxa 咲夜-https://wwl.lanzouq.com/id1tX1owp2uf につてのぬ…