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 的工作流程图:

客户端发送请求
Gateway 接收请求
匹配路由规则
执行全局过滤器
转发请求到目标服务
目标服务处理请求
返回响应到 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-1USER-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 的核心概念、配置方式以及如何实现请求分发。以下是关键点总结:

  1. 核心组件:Route、Predicate 和 Filter 是 Gateway 的三大核心组件。
  2. 动态路由:通过 Path 断言实现请求分发。
  3. 负载均衡:结合 Eureka 注册中心实现服务发现和负载均衡。
  4. 自定义过滤器:扩展 Gateway 功能,实现日志记录、鉴权等需求。

希望本文能帮助您快速上手 Spring Cloud Gateway,并将其应用到实际项目中。如果您有任何问题或建议,请随时留言交流!


参考资料

  • Spring Cloud Gateway 官方文档
  • Spring Cloud Netflix Eureka 文档

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

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

相关文章

打造高功率、高电流和高可靠性电路板的厚铜PCB生产

厚铜PCB生产是指制作一种具有较厚铜层的PCB&#xff08;Printed Circuit Board&#xff0c;印刷电路板&#xff09;。这种PCB通常用于高功率、高电流和高可靠性的电子设备中。厚铜PCB的生产过程包括以下几个 主要步骤&#xff1a; 1. 基材准备 厚铜PCB的基材通常采用FR4或CEM-…

软考高级-系统架构设计师 论文范文参考(一)

文章目录 论SOA技术的应用论SOA在企业信息化中的应用论UP&#xff08;统一过程方法&#xff09;的应用论分布式数据库的设计与实现论改进Web服务器性能的有关技术论基于UML的需求分析论基于构件的软件开发论基于构件的软件开发(二) 论SOA技术的应用 摘要&#xff1a;  本人于…

京东平台关键字搜索接口开发指南:Python实现与代码详解

一、接口概述 京东关键字搜索接口允许开发者通过HTTP请求获取平台商品的关键字搜索结果&#xff0c;常用于商品比价、数据分析等场景。本文基于Python演示如何调用京东搜索接口&#xff0c;解析返回数据并实现基础功能。 二、技术实现步骤 接口地址分析‌ 京东未完全公开API…

浅析锁的应用与场景

锁的应用与场景&#xff1a;从单机到分布式 摘要&#xff1a;在多线程和分布式系统中&#xff0c;“锁”是避免资源竞争、保障数据一致性的核心机制。但你真的了解锁吗&#xff1f;什么时候该用锁&#xff1f;用哪种锁&#xff1f;本文通过通俗的比喻和代码示例&#xff0c;带…

30天通过软考高项-第三天

30天通过软考高项-第三天 任务&#xff1a;项目范围管理 思维导图阅读 知识点集锦阅读 知识点记忆 章节习题练习 知识点练习 手写回忆ITTO 听一遍喜马拉雅关于范围的内容 范围管理-背 1. 过程定义 规划变瘦订份缺孔 规划范围管理&#xff1a;为了记录如何定…

文字过长使用省略号展示,text-overflow 的使用和不生效场景的解决办法,flex 布局中文字省略展示的坑

在前端开发过程中【单行文本内容过长使用省略号展示】这是一个特别常见的功能&#xff0c;大家都知道要使用 text-overflow 这个 css 属性。 关于这个属性&#xff0c;我们可以先看一下官方文档怎么说。 text-overflow CSS 属性用于确定如何提示用户存在隐藏的溢出内容。其形式…

(二)读写分离架构、冷热分离架构

文章目录 读写分离架构什么是读写分离结构架构模型优缺点优点缺点 技术案例写情况读情况 冷热分离架构什么是冷热分离架构?架构模型优缺点优点 缺点技术案例读数据写数据 读写分离架构 什么是读写分离结构 读写分离架构针对于数据库。数据库原本负责读写两个功能。 读写分离架…

windows中kafka4.0集群搭建

参考文献 Apache Kafka windows启动kafka4.0&#xff08;不再需要zookeeper&#xff09;_kafka压缩包-CSDN博客 Kafka 4.0 KRaft集群部署_kafka4.0集群部署-CSDN博客 正文 注意jdk需要17版本以上的 修改D:\software\kafka_2.13-4.0.0\node1\config\server.properties配置文…

无线通信网

注意区分CA&#xff08;无线&#xff09;和CD&#xff08;有线&#xff09; 无线局域网扩频技术 FHSS/DSSS 无线频谱和信道&#xff1a;2.4G/5GHz,2.4GHz共13个信道&#xff0c;3个不重叠信道 CSMA/CA&#xff0c;隐藏节点 MANET 无线安全&#xff1a;WEP、WPA、WPA2、AES/TP…

嵌入式开发:基础知识介绍

一、嵌入式系统 1、介绍 以提高对象体系智能性、控制力和人机交互能力为目的&#xff0c;通过相互作用和内在指标评价的&#xff0c;嵌入到对象体系中的专用计算机系统。 2、分类 按其形态的差异&#xff0c;一般可将嵌入式系统分为&#xff1a;芯片级&#xff08;MCU、SoC&am…

uv包管理器如何安装依赖?

uv包管理器如何安装依赖? 输入 uv pip install 包名 uv pip install python-docx

大模型驱动智能服务变革:从全流程赋能到行业纵深落地

大模型技术的快速发展&#xff0c;正深刻改变着人工智能的研发与应用模式。作为"软硬协同、开箱即用"的智能化基础设施&#xff0c;大模型一体机通过整合计算硬件、部署平台和预置模型&#xff0c;重构了传统AI部署方式&#xff0c;成为推动AI普惠化和行业落地的重要…

【MQ篇】RabbitMQ之简单模式!

目录 引言一、 初识 RabbitMQ 与工作模式二、 简单模式 (Simple Queue) 详解&#xff1a;最直接的“点对点快递” &#x1f4ee;三、 Java (Spring Boot) 代码实战&#xff1a;让小兔子跑起来&#xff01; &#x1f430;&#x1f3c3;‍♂️四、 深入理解&#xff1a;简单模式的…

Lua 第7部分 输入输出

由于 Lua 语言强调可移植性和嵌入性 &#xff0c; 所以 Lua 语言本身并没有提供太多与外部交互的机制 。 在真实的 Lua 程序中&#xff0c;从图形、数据库到网络的访问等大多数 I/O 操作&#xff0c;要么由宿主程序实现&#xff0c;要么通过不包括在发行版中的外部库实现。 单就…

【开源】STM32HAL库移植Arduino OneWire库驱动DS18B20和MAX31850

项目开源链接 github主页https://github.com/snqx-lqh本项目github地址https://github.com/snqx-lqh/STM32F103C8T6HalDemo作者 VXQinghua-Li7 &#x1f4d6; 欢迎交流 如果开源的代码对你有帮助&#xff0c;希望可以帮我点个赞&#x1f44d;和收藏 项目说明 最近在做一个项目…

【合新通信】浸没式液冷光模块与冷媒兼容性测试技术报告

一、测试背景与核心挑战 行业需求驱动 随着800G/1.6T光模块功耗突破30W/端口&#xff0c;传统风冷已无法满足散热需求&#xff0c;浸没式液冷成为超算/AI数据中心的主流方案。冷媒兼容性是系统可靠性的关键指标&#xff0c;涉及材料腐蚀、光学性能、长期稳定性等维度。 核心…

Pandas中的日期时间date处理

Pandas提供了强大的日期和时间处理功能&#xff0c;这对于时间序列分析至关重要。本教程将介绍Pandas中处理日期时间的主要方法。包括&#xff1a; 日期时间数据的创建和转换日期时间属性的提取时间差计算和日期运算重采样和频率转换时区处理基于日期时间的索引操作 Pandas中…

Vue3文件上传组件实战:打造高效的Element Plus上传解决方案,可以对文件进行删除,查看,下载功能。

在现代Web开发中,文件上传功能是许多应用的核心需求之一。无论是企业管理系统、内容管理系统还是医疗信息系统,上传附件的功能都至关重要。本文将分享一个基于 Vue3 和 Element Plus 实现的文件上传组件,结合父子组件的协作,展示如何构建一个功能强大、用户体验友好的文件上…

AI 工程师崛起:科技浪潮下的新兴力量

在当今科技迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑是最热门的领域之一。随着基础模型的涌现和开源 / API 的普及&#xff0c;一种新兴的职业 ——AI 工程师&#xff0c;正逐渐崭露头角。他们在 AI 技术的应用和开发中扮演着关键角色&#xff0c;其崛…

人工智能与机器学习:Python从零实现逻辑回归模型

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…