Spring Cloud Gateway教程
1 微服务网关概述

Spring Cloud Gateway是在 Spring 生态系统之上构建的API网关服务,旨在为微服务架构应用提供一种简单有效的统一的API路由管理方式。
Spring Cloud Gateway主要功能:
- 反向代理
- 认证鉴权
- 流量控制
- 熔断
- 日志监控
2 Spring Cloud Gateway三大核心概念
- 路由(Route):它由一个 ID、一个目标 URI、断言集合和过滤器集合。如果断言为真,则路由匹配。
- 断言(Predicate):参考的是 Java8 的
java.util.function.Predicate,开发人员可以匹配 HTTP 请求中的所有内容(例如请求头或请求参数),如果与断言相匹配则进行路由。 - 过滤器(Filter):指的是 GatewayFilter 实例,可以在请求被路由之前或之后修改请求和响应。
3 Spring Cloud Gateway工作流程

客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器被虚线分开的原因是过滤器可以在发送代理请求之前(pre)和之后(post)运行逻辑。执行所有“pre”过滤器逻辑。然后发出代理请求。在发出代理请求之后,运行“post”过滤器逻辑。
总结:断言判断–>路由转发–>执行过滤器链
4 Spring Cloud Gateway网关微服务开发
- 新建网关微服务模块
- 修改pom文件,引入依赖
- 修改yml文件和主启动类,在Consul中进行服务注册
4.1 引入依赖
<dependencies><!--Spring Cloud Gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--Consul服务注册--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency><!--指标监控健康检查的actuator--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
</dependencies>
4.2 网关微服务注册
server:port: 9527 # 网关服务端口spring:application:name: gateway-service # 网关服务名称cloud:consul:host: 47.120.52.144 # Consul服务地址port: 8500 # Consul服务端口discovery:prefer-ip-address: true # 服务注册时优先使用IP地址而不是主机名service-name: ${spring.application.name} # 在Consul中注册的服务名称heartbeat:enabled: true # 启用心跳检测,定期检查服务健康状态
@SpringBootApplication
@EnableDiscoveryClient // 服务注册
public class Gateway9527 {public static void main(String[] args) {SpringApplication.run(Gateway9527.class, args);}
}
服务注册使用了 Consul,如果要使用 Nacos 进行服务注册,修改 pom 文件中的依赖和 yml 文件中的配置!

4.3 路由配置
假设场景,商城系统用户下单支付。
网关微服务yml配置:
spring:gateway:routes:- id: order-route # 路由ID,没有固定规则但要求唯一,建议配合服务名uri: http://localhost:8001 # 路由转发地址predicates:- Path=/gateway/order/**/** # 断言,匹配请求路径- id: pay-routeuri: http://localhost:8002predicates:- Path=/gateway/pay/**/**
如果要使用OpenFeign,订单微服务8001调用支付微服务8002,
服务调用链:
- 用户调用网关微服务9527
- 网关微服务9527根据配置的路由匹配到订单微服务8001
- 订单微服务8001根据业务需要使用OpenFeign远程调用支付微服务8002
- 因为支付微服务8002也需要通过网关访问,因此也要通过网关微服务9527
- 网关微服务9527根据配置的路由匹配到支付微服务8002,到此完成服务调用
此时,网关微服务yml配置:
spring:gateway:routes:- id: order-route # 路由ID,没有固定规则但要求唯一,建议配合服务名uri: lb://order-service # 路由转发地址,负载均衡predicates:- Path=/order/**/** # 断言,匹配请求路径- id: pay-routeuri: lb://pay-servicepredicates:- Path=/pay/**/**
- @FeignClient(value = “gateway-service”)注解不再使用微服务名,而是使用网关服务名称!
- 动态获取服务URI:根据微服务名称而不是固定IP+port的方式获取URI!
Spring Cloud Gateway支持丰富的路由匹配逻辑,以应对各种类型的业务诉求:
| 断言 | 示例 | 说明 |
|---|---|---|
| Path | - Path=/httpbin/** | 路径与/httpbin/**匹配的请求会被转发 |
| Cookie | - Cookie=chocolate, ch.p | 携带Cookie且内容为chocolate=ch.p的请求会被转发 |
| Header | - Header=X-Request-Id, \d+ | 请求有一个名为 X-Request-Id 的头,其值与 \d+ 正则表达式匹配(即它的值为一位或多位),则此路由匹配。 |
| Method | - Method=GET,POST | 请求方法是 GET 或 POST ,则此路由匹配。 |
| Before | - Before=2017-01-20T17:42:47.789+08:00[Asia/Shanghai] | 在2017年01月20日17时42分47.789秒之前的请求,才会被转发 |
| After | - Before=2017-01-20T17:42:47.789+08:00[Asia/Shanghai] | 在2017年01月20日17时42分47.789秒之后的请求,才会被转发 |
| Between | - Between=2017-01-20T17:42:47.789+08:00[Asia/Shanghai],2017-01-21T17:42:47.789+08:00[Asia/Shanghai] | 在2017年01月20日17时42分47.789秒到在2017年01月21日17时42分47.789秒之间的请求,才会被转发 |
4.4 过滤器配置
- 全局过滤器GlobalFilter:作用在所有路由上,不需要在配置文件中配置,实现GlobalFilter接口即可
- 网关过滤器GatewayFilter:作用在单一路由或某个路由分组上,通过spring.cloud.gateway.routes.filters配置在具体的路由上,也可以通过配置spring.cloud.gateway.default-filters让它作用于全局路由上。
- 自定义过滤器:
4.4.1 全局过滤器
/*** Contract for interception-style, chained processing of gateway requests that may be* used to implement cross-cutting, application-agnostic requirements such as security,* timeouts, and others.** Only applies to matched gateway routes.** Copied from framework WebFilter** @author Rossen Stoyanchev* @since 5.0*/
public interface GlobalFilter {/*** Process the Web request and (optionally) delegate to the next {@code GatewayFilter}* through the given {@link GatewayFilterChain}.* @param exchange the current server exchange* @param chain provides a way to delegate to the next filter* @return {@code Mono<Void>} to indicate when request processing is complete*/Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);}
4.4.2 网关过滤器
官网地址:https://docs.spring.io/spring-cloud-gateway/docs/4.0.9/reference/html/#gatewayfilter-factories。这里只列举一些常见的网关过滤器。
-
请求头(RequestHeader)相关
- AddRequestHeader
- RemoveRequestHeader
- SetRequestHeader
spring:cloud:gateway:routes:- id: add_request_header_routeuri: http://example.orgfilters:- AddRequestHeader=X-Request-red, blue- RemoveRequestHeader=X-Request-Foo- SetRequestHeader=X-Request-Red, Blue -
请求参数(RequestParameter)相关
- AddRequestParameter
- RemoveRequestParameter
spring:cloud:gateway:routes:- id: add_request_parameter_routeuri: http://example.orgfilters:- AddRequestParameter=red, blue- RemoveRequestParameter=red -
响应头(ResponseHeader)相关
- AddResponseHeader
- RemoveResponseHeader
- SetResponseHeader
spring:cloud:gateway:routes:- id: add_response_header_routeuri: http://example.orgfilters:- AddResponseHeader=X-Response-Red, Blue- RemoveResponseHeader=X-Response-Foo- SetResponseHeader=X-Response-Red, Blue -
前缀和路径相关
-
PrefixPath
spring:cloud:gateway:routes:- id: prefixpath_routeuri: http://example.orgpredicates:- Path=/redfilters:- PrefixPath=/mypath浏览器访问地址:http://example.org/red
实际微服务地址:http://example.org/mypath/red
-
SetPath
spring:cloud:gateway:routes:- id: prefixpath_routeuri: http://example.orgpredicates:- Path=/redfilters:- SetPath=/blue浏览器访问地址:http://example.org/red
实际微服务地址:http://example.org/blue
-
RedirectTo
spring:cloud:gateway:routes:- id: prefixpath_routeuri: http://example.orgpredicates:- Path=/redfilters:- RedirectTo=302, http://www.baidu.com浏览器访问地址:http://example.org/red
实际微服务地址:http://www.baidu.com
-
-
其他
-
Default:添加过滤器用于所有路由,相当于全局过滤器。
spring:cloud:gateway:default-filters:- AddResponseHeader=X-Response-Default-Red, Default-Blue- PrefixPath=/httpbin
-
如果调用链中再加入远程调用,调用链还是很复杂的!
4.4.3 自定义过滤器
🔔Spring Cloud Gateway自定义过滤器参考另一篇笔记
参考
- https://mp.weixin.qq.com/s/ua_VlF30fzdMjkuKVnGhvw
- https://www.cnblogs.com/duanxz/p/14780675.html
相关文章:
Spring Cloud Gateway教程
1 微服务网关概述 Spring Cloud Gateway是在 Spring 生态系统之上构建的API网关服务,旨在为微服务架构应用提供一种简单有效的统一的API路由管理方式。 Spring Cloud Gateway主要功能: 反向代理认证鉴权流量控制熔断日志监控 2 Spring Cloud Gateway三…...
解码新时代内存架构:探秘数据在内存中的灵动驻足
欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看,已成习惯 创作不易,多多支持! 随着信息技术的飞速发展,我们身处一个数据爆炸的时代。数据的处理和存储方式正日益成为技术革新的重要领域。在新时代的…...
前端基础篇-前端工程化 Vue 项目开发流程(环境准备、Element 组件库、Vue 路由、项目打包部署)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 环境准备 1.1 安装 NodeJs 1.2 验证 NodeJs 环境变量 1.3 配置 npm 的全局安装路径 1.4 切换 npm 的淘宝镜像( npm 使用国内淘宝镜像的方法(最新) ) 1.5 查看镜像…...
【通用人工智能AGI元年-各领域的精彩AI/LLM(持续更新)】
AI元年弄潮儿 通用人工智能AGI时代大模型LLM集成平台:Poe语言大模型:ChatGPT音乐:Suno文生图: [Stable Diffusion整合包](https://www.bilibili.com/video/BV1iM4y1y7oA/?spm_id_from333.999.0.0&vd_source260c69efcf1f56243…...
【微服务】设计弹性微服务架构模式
目录 模式#1 — 超时模式#2 — 重试模式#3— 隔离模式#4— 断路器模式#5 — 冗余推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战在微服务架构中,服务通常相互协作以提供业务用例。这些服务可能在可用性、可伸缩性、弹性等方面具有…...
Websocket + Vue使用
这里有一篇文档可以参考一下> 闪现 POM文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.7.0</version> </dependency> WebSocketConf…...
AI程序员革命:探析Devin的登场与编程未来
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
vue 控制窗口禁止缩放,已解决
注意:不是浏览器窗口禁止缩放 1.vue框架中,index.html文件head标签中加上内容 <meta name"viewport" content"widthdevice-width, initial-scale1, maximum-scale1, user-scalable0"><script>document.addEventListen…...
【黑马头条】-day01环境搭建SpringBoot-Cloud-Nacos
文章目录 1 环境搭建及简介2 项目介绍2.1 应用2.2 业务说明2.3 技术栈2.4 收获2.5 大纲 3 Nacos准备3.1 安装Nacos 4 初始工程搭建4.1 环境准备4.1.1 导入项目4.1.2 设置本地仓库4.1.3 设置项目编码格式 4.2 全局异常4.2.1 自动装配 4.3 工程主体结构 5 登录功能开发5.1 需求分…...
HTML发展史
为什么要讲 HTML 发展史呢? 唐太宗告诉我们: 以铜为镜,可以正衣冠;以史为镜,可以知兴替;以人为镜,可以明得失。 那了解了 HTML 的发展史,可以知道什么呢? 答案是兼容 国内在 淘宝…...
Java进阶—GC回收(垃圾回收)
1. 什么是垃圾回收 垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一项重要功能,用于自动管理程序中不再使用的内存。在Java中,程序员不需要手动释放内存,因为GC会自动检测并回收不再使用的对象,从而减少内存泄…...
C++默认构造函数(二)
目录 构造函数补充 构造函数初始化列表的使用 赋值运算符重载函数 运算符重载函数介绍 运算符重载函数的使用 赋值运算符重载函数 赋值运算符重载函数的使用 拷贝构造函数和赋值运算符重载函数 重载前置和后置 前置 后置 重载流插入<<与流提取>> 流插…...
云原生部署手册02:将本地应用部署至k8s集群
(一)部署集群镜像仓库 1. 集群配置 首先看一下集群配置: (base) ➜ ~ multipass ls Name State IPv4 Image master Running 192.168.64.5 Ubuntu 22.04 LTS1…...
AJAX——JSON
目录 一、JSON概述 二、JSON对象语法 三、JSON序列化方法 四、JSON与XML比较 五、Java对象与Json对象的转换 六、Js解析服务器发送过来的JSON字符串 七、$.getJSON() 一、JSON概述 JSON简介:JSON的全称为JavaScript Object Nation(JavaScript 对象表示语法),…...
Nexus3 Docker 私有仓库
Nexus3 Docker 私有仓库 安装并部署 Nexus3 $ docker search nexus3$ docker pull sonatype/nexus3$ mkdir /home/tester/data/docker/nexus3/sonatype-work $ sudo chown -R 200 /home/tester/data/docker/nexus3/sonatype-work$ docker run -d --namenexus3 \ --restartalw…...
Element UI el-dialog自由拖动功能
1.创建drag .js文件 /*** 拖拽移动* param {elementObjct} bar 鼠标点击控制拖拽的元素* param {elementObjct} target 移动的元素* param {function} callback 移动后的回调*/ export function startDrag(bar, target, callback) {var params {top: 0,left: 0,currentX: …...
RPC浅析,加密数据解析
个人总结 其实就是HOOK注入wbsocket 链接创建服务端和客户端进行通信,直接调用js代码中的加密方法 将结果通过浏览器客户端传入服务端。一种比较好实用的一种技术 https://blog.csdn.net/qq_36759224/article/details/123082574 (搬运记录下ÿ…...
光速论文能用吗 #媒体#知识分享#学习方法
光速论文是一个非常有效的论文写作、查重降重工具,它的使用非常简单方便,而且功能强大,是每个写作者必备的利器。 首先,光速论文具有强大的查重降重功能,能够快速检测论文中的抄袭部分,帮助作者避免不必要的…...
智慧工地解决方案,智慧工地项目管理系统源码,支持大屏端、PC端、手机端、平板端
智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合,为工程项目管理提供先进技术手段,构建工地现场智能监控和控制体系,弥补传统方法在监管中的缺陷,最线实现项目对人、机、料、法、环的全…...
【前端寻宝之路】学习和使用label标签
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| 💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-2nm9oQQVtSL8hDS1 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
