Spring Cloud Gateway 如何将请求分发到各个服务
前言
在微服务架构中,API 网关(API Gateway)扮演着非常重要的角色。它负责接收客户端请求,并根据预定义的规则将请求路由到对应的后端服务。Spring Cloud Gateway 是 Spring 官方推出的一款高性能网关,支持动态路由、负载均衡、限流等功能。本文将详细介绍 Spring Cloud Gateway 的工作原理、配置方式以及如何实现请求分发,并附带源码和 UML 图示。
一、Spring Cloud Gateway 的核心概念
1.1 核心组件
- Route(路由):网关的基本构建块,包含一个 ID、目标 URI 和一组断言(Predicate)和过滤器(Filter)。只有当请求满足断言条件时,才会被路由到指定的目标服务。
- Predicate(断言):用于匹配 HTTP 请求中的特定条件,例如路径、方法、头信息等。
- Filter(过滤器):对请求和响应进行处理,如修改请求头、添加日志、鉴权等。
1.2 工作流程图
以下是 Spring Cloud Gateway 的工作流程图:
二、配置 Spring Cloud Gateway
2.1 引入依赖
在 pom.xml
文件中添加以下依赖:
<dependencies><!-- Spring Cloud Gateway --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- Spring Boot WebFlux --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><!-- Spring Cloud Load Balancer (用于负载均衡) --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
</dependencies>
2.2 配置路由规则
在 application.yml
中定义路由规则。以下是一个简单的示例:
spring:cloud:gateway:routes:- id: user_service_routeuri: lb://USER-SERVICEpredicates:- Path=/user/**filters:- AddRequestHeader=X-Gateway-Version, v1.0- id: order_service_routeuri: lb://ORDER-SERVICEpredicates:- Path=/order/**filters:- AddResponseHeader=X-Gateway-Version, v1.0
配置说明:
id
:路由的唯一标识符。uri
:目标服务地址,lb://
表示使用负载均衡器(Load Balancer)。predicates
:定义匹配条件,例如路径/user/**
。filters
:定义请求或响应的处理逻辑,例如添加请求头或响应头。
三、实现请求分发的核心逻辑
3.1 动态路由匹配
Spring Cloud Gateway 使用 Predicate
来匹配请求。以下是一个基于路径的分发逻辑示例:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.ServerResponse;@Configuration
public class GatewayConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("user_service_route", r -> r.path("/user/**").filters(f -> f.addRequestHeader("X-Gateway-Version", "v1.0")).uri("lb://USER-SERVICE")).route("order_service_route", r -> r.path("/order/**").filters(f -> f.addResponseHeader("X-Gateway-Version", "v1.0")).uri("lb://ORDER-SERVICE")).build();}
}
代码解析:
RouteLocatorBuilder
用于构建路由规则。.path("/user/**")
匹配以/user/
开头的路径。.uri("lb://USER-SERVICE")
将请求转发到注册中心的服务USER-SERVICE
。
3.2 负载均衡
Spring Cloud Gateway 内置了对负载均衡的支持,通过 lb://
协议可以实现服务发现和负载均衡。
示例场景:
假设有两个用户服务实例 USER-SERVICE-1
和 USER-SERVICE-2
注册到了 Eureka 注册中心,Gateway 会根据负载均衡策略自动选择一个实例来处理请求。
3.3 自定义过滤器
除了内置过滤器,您还可以自定义过滤器来实现特定功能,例如鉴权、日志记录等。
以下是一个自定义过滤器的示例:
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;@Component
public class LoggingFilter extends AbstractGatewayFilterFactory<LoggingFilter.Config> {public LoggingFilter() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) -> {System.out.println("请求路径:" + exchange.getRequest().getPath());return chain.filter(exchange).then(Mono.fromRunnable(() -> {System.out.println("响应状态码:" + exchange.getResponse().getStatusCode());}));};}public static class Config {// 可以在这里定义配置参数}
}
使用自定义过滤器:
在 application.yml
中引用自定义过滤器:
spring:cloud:gateway:routes:- id: user_service_routeuri: lb://USER-SERVICEpredicates:- Path=/user/**filters:- LoggingFilter
四、完整示例
以下是一个完整的 Spring Cloud Gateway 示例,包括服务注册与发现、负载均衡和自定义过滤器。
4.1 项目结构
gateway-service/
├── src/main/java/com/example/gateway/
│ ├── GatewayApplication.java
│ ├── GatewayConfig.java
│ └── LoggingFilter.java
├── src/main/resources/
│ └── application.yml
└── pom.xml
4.2 启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}
4.3 配置文件
server:port: 8080spring:application:name: gateway-servicecloud:gateway:routes:- id: user_service_routeuri: lb://USER-SERVICEpredicates:- Path=/user/**filters:- LoggingFilter- id: order_service_routeuri: lb://ORDER-SERVICEpredicates:- Path=/order/**filters:- AddResponseHeader=X-Gateway-Version, v1.0eureka:client:service-url:defaultZone: http://localhost:8761/eureka/
五、总结
通过本文,我们详细介绍了 Spring Cloud Gateway 的核心概念、配置方式以及如何实现请求分发。以下是关键点总结:
- 核心组件:Route、Predicate 和 Filter 是 Gateway 的三大核心组件。
- 动态路由:通过
Path
断言实现请求分发。 - 负载均衡:结合 Eureka 注册中心实现服务发现和负载均衡。
- 自定义过滤器:扩展 Gateway 功能,实现日志记录、鉴权等需求。
希望本文能帮助您快速上手 Spring Cloud Gateway,并将其应用到实际项目中。如果您有任何问题或建议,请随时留言交流!
参考资料
- Spring Cloud Gateway 官方文档
- Spring Cloud Netflix Eureka 文档
相关文章:
Spring Cloud Gateway 如何将请求分发到各个服务
前言 在微服务架构中,API 网关(API Gateway)扮演着非常重要的角色。它负责接收客户端请求,并根据预定义的规则将请求路由到对应的后端服务。Spring Cloud Gateway 是 Spring 官方推出的一款高性能网关,支持动态路由、…...
解释器体系结构风格-笔记
解释器(Interpreter)是一种软件设计模式或体系结构风格,主要用于为语言(或表达式)定义其语法、语义,并通过解释器来解析和执行语言中的表达式。解释器体系结构风格广泛应用于编程语言、脚本语言、规则引擎、…...

线程函数库
pthread_create函数 pthread_create 是 POSIX 线程库(pthread)中的一个函数,用于创建一个新的线程。 头文件 #include <pthread.h> 函数原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*s…...

[C]基础13.深入理解指针(5)
博客主页:向不悔本篇专栏:[C]您的支持,是我的创作动力。 文章目录 0、总结1、sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对比 2、数组和指针笔试题解析2.1 一维数组2.2 字符数组2.2.1 代码12.2.2 代码22.2.3 代码32.2.4 …...

OpenCV 图形API(60)颜色空间转换-----将图像从 YUV 色彩空间转换为 RGB 色彩空间函数YUV2RGB()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 YUV 色彩空间转换为 RGB。 该函数将输入图像从 YUV 色彩空间转换为 RGB。Y、U 和 V 通道值的常规范围是 0 到 255。 输出图像必须是 8…...
11.原型模式:思考与解读
原文地址:原型模式:思考与解读 更多内容请关注:7.深入思考与解读设计模式 引言 在软件开发中,尤其是当需要创建大量相似对象时,你是否遇到过这样的情况:每次创建新对象时,是否都需要重新初始化一些复杂的…...
深度解析 Java 泛型通配符 `<? super T>` 和 `<? extends T>`
Java 泛型中的通配符 ? 与 super、extends 关键字组合形成的 <? super T> 和 <? extends T> 是泛型系统中最重要的概念之一,也是许多开发者感到困惑的地方。本文将全面剖析它们的语义、使用场景和设计原理。 一、基础概念回顾 1. 泛型通配符 ? ?…...

hbuilderx云打包生成的ipa文件如何上架
使用hbuilderx打包,会遇到一个问题。开发的ios应用,需要上架到app store,因此,就需要APP store的签名证书,并且还需要一个像xcode那样的工具来上架app store。 我们这篇文章说明下,如何在windows电脑&…...

Golang | 位运算
位运算比常规运算快,常用于搜索引擎的筛选功能。例如,数字除以二等价于向右移位,位移运算比除法快。...
天能资管(SkyAi):大数据洞察市场,引领投资新风向
在金融市场的浩瀚海洋中,信息如同灯塔,指引着投资者前行的方向。谁能更准确地把握市场动态和趋势,谁就能在激烈的市场竞争中占据先机。天能资管(SkyAi),作为卡塔尔投资局(QIA)旗下的科技先锋,凭借其强大的大数据处理能力与前沿的技术架构,为全球投资者提供了前所未有的市场洞察…...

产品动态|千眼狼sCMOS科学相机捕获单分子荧光信号
单分子荧光成像技术,作为生物分子动态研究的关键工具,对捕捉微弱信号要求严苛。传统EMCCD相机因成本高昂,动态范围有限,满阱容量低等问题,制约单分子研究成果产出效率。 千眼狼精准把握科研需求与趋势,自研…...
基于大牛直播SDK的Android屏幕扬声器采集推送RTMP技术解析
在移动互联网时代,直播技术的应用越来越广泛,而屏幕采集推送作为直播内容源的重要获取方式之一,也备受关注。本文将基于大牛直播SDK,深入剖析如何实现Android屏幕采集推送RTMP的完整流程,带你领略其背后的技术细节与魅…...
Linux防火墙工具UFW介绍
UFW(Uncomplicated Firewall)是 Ubuntu、Debian 等 Debian 系 Linux 发行版默认的防火墙管理工具,基于 iptables 开发,旨在通过简化的命令行接口(CLI)降低防火墙配置门槛,适合新手和简单场景。 核心目标:让用户无需深入理解 iptables 的 “表 - 链” 结构,通过直观的命…...
k8s 手动续订证书
注意:如果是高可用环境,本文的操作需要在所有控制节点都执行。 查看证书是否过期 kubeadm certs check-expirationkubeadm certs renew可以续订任何特定证书,或者使用子命令all可以续订所有证书: kubeadm certs renew all使用 kubeadm 构建的集群通常会将admin.conf证书复…...
vc++ 如何调用poco库
1. 下载并安装 Poco 库 你可以从 Poco 的官方网站(POCO C Libraries - Simplify C Development )下载其源代码压缩包。下载完成后,按照下面的步骤进行编译和安装: 解压源代码:把下载的压缩包解压到指定目录。配置编译…...

Hot100方法及易错点总结2
本文旨在记录做hot100时遇到的问题及易错点 五、234.回文链表141.环形链表 六、142. 环形链表II21.合并两个有序链表2.两数相加19.删除链表的倒数第n个节点 七、24.两两交换链表中的节点25.K个一组翻转链表(坑点很多,必须多做几遍)138.随机链表的复制148.排序链表 N…...

网络:手写HTTP
目录 一、HTTP是应用层协议 二、HTTP服务器 三、HTTP服务 认识请求中的uri HTTP支持默认首页 响应 功能完善 套接字复用 一、HTTP是应用层协议 HTTP下层是TCP协议,站在TCP的角度看,要提供的服务是HTTP服务。 这是在原来实现网络版计算器时&am…...
C++[类和对象][3]
C[类和对象][3] 赋值运算符的重载(operator) 1.是一个默认成员函数,重载必须为成员函数,用于两个已经存在的对象,(d1d3赋值重载)(Stack d4d1拷贝构造(因为d4未存在,初始化)) 2.建议写成引用返回提高效率,可以连续赋值重载 3.没有写的时候会自动生成,完成值拷贝/浅拷贝对(对于…...

【计算机视觉】CV实战项目 - 基于YOLOv5的人脸检测与关键点定位系统深度解析
基于YOLOv5的人脸检测与关键点定位系统深度解析 1. 技术背景与项目意义传统方案的局限性YOLOv5多任务方案的优势 2. 核心算法原理网络架构改进关键点回归分支损失函数设计 3. 实战指南:从环境搭建到模型应用环境配置数据准备数据格式要求数据目录结构 模型训练配置文…...

【python】如何将python程序封装为cpython的库
python程序在发布时,往往会打包为cpython的库,并且根据应用服务器的不同架构(x86/aarch64),以及python的不同版本,封装的输出类型也是非常多。本文介绍不同架构指定python下的代码打包方式: 首…...
【人工智能】DeepSeek 的开源生态:释放 AI 潜能的社区协同与技术突破
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 DeepSeek 作为中国 AI 领域的先锋,以其高效的混合专家模型(MoE)和彻底的开源策略,在全球 AI 社区掀起波澜。本文深入剖析 DeepSeek 的开…...
【差分隐私】假设检验的视角(高斯差分隐私)
在差分隐私中,假设检验的框架被用来量化攻击者通过机制输出区分两个相邻数据集 S S S 和 S ′ S S′ 的难度。这种区分的根本困难直接反映了隐私保护强度。以下是对问题的详细解释: 1. 假设检验的基本设定 原假设 H 0 H_0 H0:数据集为 …...

计算机组成原理 课后练习
例一: 例二: 1. 原码一位乘 基本原理 原码是一种直接表示数值符号和大小的方式:最高位为符号位(0表示正,1表示负),其余位表示数值的绝对值。原码一位乘的核心思想是逐位相乘,并通…...
pytorch手动调整学习率
文章目录 1. 为什么引入学习率衰减?2. 针对不同层设置不一样的学习率3. 手动更新学习率4. 使用学习率调度器5. 推荐做法 在前面的文章中,介绍了各种学习率。在此,将进行拓展,学习如何手动更新学习率(即不使用pytorch自…...

SVN仓库突然没有权限访问
如果svn仓库突然出现无法访问的情况,提示没有权限,所有账号都是如此,新创建的账号也不行。 并且会突然提示要输入账号密码。 出现这个情况时,大概率库里面的文件有http或者https的字样,因为单独给该文件添加权限导致…...

【Qt】文件
🌈 个人主页:Zfox_ 🔥 系列专栏:Qt 目录 一:🔥 Qt 文件概述 二:🔥 输入输出设备类 三:🔥 文件读写类 四:🔥 文件和目录信息类 五&…...
7.DJI-PSDK:psdk负载应用固件升级(基于RTOS)
DJI-PSDK:psdk负载应用固件升级(基于RTOS): 在单片机应用程序开发阶段,我们可以借助keil5和J-LINK来直接下载应用程序进行开发和调试, 但在产品交付之后,我们对应用程序做了改动和升级,是断然不可能采用这种方式的,我们应该将新版本的程序固件打包发给客户, 能够方便用…...
ArrayUtils:数组操作的“变形金刚“——让你的数组七十二变
各位数组操控师们好!今天给大家带来的是Apache Commons Lang3中的ArrayUtils工具类。这个工具就像数组界的"孙悟空",能让你的数组随心所欲地变大、变小、变长、变短,再也不用对着原生数组的"死板"叹气了! 一…...
架构-系统可靠性分析与设计
一、可靠性相关基本概念 1. 可靠性与可用性 可靠性:软件系统在遇到错误、意外操作或系统故障时,仍能维持自身功能特性的能力。 举例:手机银行APP在用户误操作(如快速点击多次转账)时,仍能正确处理交易并避…...

【AI】[特殊字符]生产规模的向量数据库 Pinecone 使用指南
一、Pinecone 的介绍 Pinecone是一个完全托管的向量数据库服务,专为大规模机器学习应用设计。它允许开发者轻松存储、搜索和管理高维向量数据,为推荐系统、语义搜索、异常检测等应用提供强大的基础设施支持。 1.1 Pinecone的核心特性 1. 高性能向量搜…...