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

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网关微服务开发

  1. 新建网关微服务模块
  2. 修改pom文件,引入依赖
  3. 修改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 文件中的配置!

image-20240308150657584

4.3 路由配置

假设场景,商城系统用户下单支付。

Consul注册中心8500
订单微服务8001
网关微服务9527
支付微服务8002
用户

网关微服务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,

Consul注册中心8500
OpenFeign
订单微服务8001
网关微服务9527
支付微服务8002
用户

服务调用链:

  1. 用户调用网关微服务9527
  2. 网关微服务9527根据配置的路由匹配到订单微服务8001
  3. 订单微服务8001根据业务需要使用OpenFeign远程调用支付微服务8002
    1. 因为支付微服务8002也需要通过网关访问,因此也要通过网关微服务9527
    2. 网关微服务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请求方法是 GETPOST ,则此路由匹配。
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
网关过滤器GatewayFilter
自定义过滤器
  • 全局过滤器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。这里只列举一些常见的网关过滤器。

  1. 请求头(RequestHeader)相关

    1. AddRequestHeader
    2. RemoveRequestHeader
    3. 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
    
  2. 请求参数(RequestParameter)相关

    1. AddRequestParameter
    2. RemoveRequestParameter
    spring:cloud:gateway:routes:- id: add_request_parameter_routeuri: http://example.orgfilters:- AddRequestParameter=red, blue- RemoveRequestParameter=red
    
  3. 响应头(ResponseHeader)相关

    1. AddResponseHeader
    2. RemoveResponseHeader
    3. 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
    
  4. 前缀和路径相关

    1. PrefixPath

      spring:cloud:gateway:routes:- id: prefixpath_routeuri: http://example.orgpredicates:- Path=/redfilters:- PrefixPath=/mypath
      

      浏览器访问地址:http://example.org/red

      实际微服务地址:http://example.org/mypath/red

    2. SetPath

      spring:cloud:gateway:routes:- id: prefixpath_routeuri: http://example.orgpredicates:- Path=/redfilters:- SetPath=/blue
      

      浏览器访问地址:http://example.org/red

      实际微服务地址:http://example.org/blue

    3. 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

  5. 其他

    1. 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网关服务&#xff0c;旨在为微服务架构应用提供一种简单有效的统一的API路由管理方式。 Spring Cloud Gateway主要功能&#xff1a; 反向代理认证鉴权流量控制熔断日志监控 2 Spring Cloud Gateway三…...

解码新时代内存架构:探秘数据在内存中的灵动驻足

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 随着信息技术的飞速发展&#xff0c;我们身处一个数据爆炸的时代。数据的处理和存储方式正日益成为技术革新的重要领域。在新时代的…...

前端基础篇-前端工程化 Vue 项目开发流程(环境准备、Element 组件库、Vue 路由、项目打包部署)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 环境准备 1.1 安装 NodeJs 1.2 验证 NodeJs 环境变量 1.3 配置 npm 的全局安装路径 1.4 切换 npm 的淘宝镜像( npm 使用国内淘宝镜像的方法(最新) ) 1.5 查看镜像…...

【通用人工智能AGI元年-各领域的精彩AI/LLM(持续更新)】

AI元年弄潮儿 通用人工智能AGI时代大模型LLM集成平台&#xff1a;Poe语言大模型&#xff1a;ChatGPT音乐&#xff1a;Suno文生图&#xff1a; [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的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

vue 控制窗口禁止缩放,已解决

注意&#xff1a;不是浏览器窗口禁止缩放 1.vue框架中&#xff0c;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 发展史呢&#xff1f; 唐太宗告诉我们: 以铜为镜&#xff0c;可以正衣冠&#xff1b;以史为镜&#xff0c;可以知兴替&#xff1b;以人为镜&#xff0c;可以明得失。 那了解了 HTML 的发展史&#xff0c;可以知道什么呢&#xff1f; 答案是兼容 国内在 淘宝…...

Java进阶—GC回收(垃圾回收)

1. 什么是垃圾回收 垃圾回收(Garbage Collection&#xff0c;GC)是Java虚拟机(JVM)的一项重要功能&#xff0c;用于自动管理程序中不再使用的内存。在Java中&#xff0c;程序员不需要手动释放内存&#xff0c;因为GC会自动检测并回收不再使用的对象&#xff0c;从而减少内存泄…...

C++默认构造函数(二)

目录 构造函数补充 构造函数初始化列表的使用 赋值运算符重载函数 运算符重载函数介绍 运算符重载函数的使用 赋值运算符重载函数 赋值运算符重载函数的使用 拷贝构造函数和赋值运算符重载函数 重载前置和后置 前置 后置 重载流插入<<与流提取>> 流插…...

云原生部署手册02:将本地应用部署至k8s集群

&#xff08;一&#xff09;部署集群镜像仓库 1. 集群配置 首先看一下集群配置&#xff1a; (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 对象表示语法)&#xff0c;…...

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 链接创建服务端和客户端进行通信&#xff0c;直接调用js代码中的加密方法 将结果通过浏览器客户端传入服务端。一种比较好实用的一种技术 https://blog.csdn.net/qq_36759224/article/details/123082574 &#xff08;搬运记录下&#xff…...

光速论文能用吗 #媒体#知识分享#学习方法

光速论文是一个非常有效的论文写作、查重降重工具&#xff0c;它的使用非常简单方便&#xff0c;而且功能强大&#xff0c;是每个写作者必备的利器。 首先&#xff0c;光速论文具有强大的查重降重功能&#xff0c;能够快速检测论文中的抄袭部分&#xff0c;帮助作者避免不必要的…...

智慧工地解决方案,智慧工地项目管理系统源码,支持大屏端、PC端、手机端、平板端

智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合&#xff0c;为工程项目管理提供先进技术手段&#xff0c;构建工地现场智能监控和控制体系&#xff0c;弥补传统方法在监管中的缺陷&#xff0c;最线实现项目对人、机、料、法、环的全…...

【前端寻宝之路】学习和使用label标签

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-2nm9oQQVtSL8hDS1 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...