springcloud中网关gateway总结

news/2025/10/23 10:05:27/文章来源:https://www.cnblogs.com/jelly12345/p/19159702
在 Spring Cloud 微服务架构中,网关(Gateway)是客户端与微服务集群之间的 "统一入口",负责处理跨服务的共性问题。以下从作用、实现原理、核心配置(含限流、鉴权详解)三方面展开说明。

一、网关的核心作用

微服务拆分后,客户端需与多个服务直接交互,会面临地址管理、权限混乱、流量失控等问题。网关的核心作用是统一管控这些共性问题,具体包括:
  1. 路由转发:根据请求路径、参数等规则,将请求转发到对应的微服务(如将/user/**转发到用户服务,/order/**转发到订单服务)。
  2. 负载均衡:集成服务发现(如 Nacos、Eureka),自动将请求分发到同一服务的不同实例,实现负载均衡。
  3. 统一鉴权:拦截所有请求,验证 Token、权限等,避免每个服务重复实现鉴权逻辑。
  4. 流量控制(限流):限制单位时间内的请求量,防止服务被高并发击垮。
  5. 熔断降级:当下游服务故障时,返回预设的降级响应(如 "服务暂时不可用"),避免级联失败。
  6. 日志监控:统一记录请求日志(路径、耗时、状态等),便于问题排查。
  7. 协议转换:如将 HTTP 请求转换为 RPC(如 Dubbo)请求,适配不同服务的通信协议。

二、实现原理(以 Spring Cloud Gateway 为例)

Spring Cloud Gateway 是目前主流的网关组件(替代了 Zuul),基于Netty 响应式编程(非阻塞),性能优于传统的 Servlet 阻塞式架构。其核心原理依赖三个核心概念:路由(Route)、断言(Predicate)、过滤器(Filter)。

1. 核心概念

  • 路由(Route):网关的基本单元,定义 "请求如何转发"。由三部分组成:
    • id:路由唯一标识;
    • uri:目标服务地址(如lb://user-servicelb表示负载均衡,user-service是服务名);
    • predicates:断言集合(判断请求是否匹配当前路由);
    • filters:过滤器集合(对请求 / 响应进行加工)。
  • 断言(Predicate):本质是 "条件判断规则",用于匹配请求的属性(如路径、方法、请求头、时间等)。例如:
    • Path=/user/**:匹配路径以/user/开头的请求;
    • Method=GET:只匹配 GET 请求;
    • Header=token, \d+:匹配请求头token的值为数字的请求。
  • 过滤器(Filter):对请求 / 响应进行拦截和处理,分为两类:
    • GatewayFilter:针对特定路由的过滤器(如某个路由的路径重写);
    • GlobalFilter:全局过滤器(对所有路由生效,如鉴权、日志)。

2. 工作流程

客户端请求到达网关后,处理流程如下:
  1. 请求接入:客户端请求被 Netty 服务器接收,进入网关处理流程。
  2. 路由匹配:网关通过断言(Predicate)判断请求是否匹配某个路由(如路径/user/1匹配Path=/user/**的路由)。
  3. 过滤器链执行:
    • 先执行 "前置过滤器"(如鉴权、限流),若不通过则直接返回错误(如 401 无权限);
    • 若通过,将请求转发到uri指定的目标服务(通过负载均衡选择具体实例)。
  4. 响应处理:目标服务返回响应后,执行 "后置过滤器"(如日志记录、响应头修改),最终将响应返回给客户端。

三、核心配置详解

Spring Cloud Gateway 的配置可通过application.yaml(或application.properties)和代码两种方式实现,以下重点说明常用配置。

1. 基础路由配置(必选)

通过配置文件定义路由规则,示例:
spring:cloud:gateway:routes:# 路由1:用户服务- id: user-service-route  # 唯一标识uri: lb://user-service  # 目标服务(lb表示负载均衡,依赖服务发现)predicates:  # 断言规则(满足所有条件才匹配)- Path=/user/**  # 匹配路径以/user/开头的请求- Method=GET,POST  # 只允许GET/POST方法filters:  # 路由专属过滤器- RewritePath=/user/(?<segment>.*), /api/user/$\{segment}  # 路径重写:/user/1 → /api/user/1# 路由2:订单服务- id: order-service-routeuri: lb://order-servicepredicates:- Path=/order/**
 
  • 说明:uri: lb://服务名需配合服务发现组件(如 Nacos),网关会自动从注册中心获取服务实例地址并实现负载均衡。

2. 限流配置(核心)

限流用于保护服务不被高并发击垮,Spring Cloud Gateway 基于令牌桶算法实现,需结合 Redis 存储令牌桶状态(依赖spring-boot-starter-data-redis-reactive)。
步骤 1:引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
步骤 2:配置限流规则
需定义限流键(KeyResolver)(如按 IP、用户 ID、接口路径限流),并在路由中启用限流过滤器。
  • 示例 1:按 IP 限流(同一 IP 单位时间内最多 N 个请求)① 定义 KeyResolver(获取客户端 IP): 
    @Configuration
    public class GatewayConfig {// 按IP限流的键解析器@Beanpublic KeyResolver ipKeyResolver() {return exchange -> Mono.just(// 获取客户端IP(注意:若有反向代理需处理X-Forwarded-For头)exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());}
    }
    
     
     
    ② 在路由中配置限流过滤器:
    spring:cloud:gateway:routes:- id: user-service-routeuri: lb://user-servicepredicates:- Path=/user/**filters:- name: RequestRateLimiter  # 启用限流过滤器args:redis-rate-limiter.replenishRate: 10  # 令牌填充速率(每秒10个令牌)redis-rate-limiter.burstCapacity: 20  # 令牌桶容量(最多存20个令牌)key-resolver: "#{@ipKeyResolver}"  # 引用上面定义的IP限流键
    
     
     
    说明:replenishRate=10表示每秒生成 10 个令牌,burstCapacity=20表示最多允许突发 20 个请求(超过则限流,返回 429 状态码)。
  • 示例 2:按接口路径限流(同一接口单位时间内最多 N 个请求)① 定义按路径的 KeyResolver:
    @Bean
    public KeyResolver pathKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getPath().toString()  // 以请求路径作为限流键);
    }
    
     
     
    ② 路由中引用pathKeyResolver即可。

3. 鉴权配置(核心)

鉴权是网关的重要职责,通常基于 Token(如 JWT)实现:客户端请求时携带 Token,网关验证 Token 有效性,无效则拒绝访问。
实现方式:自定义 GlobalFilter
全局过滤器对所有路由生效,步骤如下:
  1. 自定义鉴权过滤器:
@Component
@Order(-1)  // 优先级(数字越小越先执行,需在路由转发前执行)
public class AuthFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1. 获取请求头中的TokenString token = exchange.getRequest().getHeaders().getFirst("Authorization");// 2. 验证Token(忽略登录接口等白名单)String path = exchange.getRequest().getPath().toString();if (path.contains("/login")) {  // 登录接口放行return chain.filter(exchange);}if (token == null || !validateToken(token)) {  // Token无效exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);  // 401return exchange.getResponse().setComplete();  // 直接返回}// 3. Token有效:解析用户信息,放入请求头供下游服务使用String userId = parseUserIdFromToken(token);  // 从Token中解析用户IDServerHttpRequest request = exchange.getRequest().mutate().header("X-User-Id", userId)  // 向下游传递用户ID.build();exchange = exchange.mutate().request(request).build();// 4. 继续执行过滤器链(转发请求)return chain.filter(exchange);}// 验证Token有效性(实际中需调用认证服务或解析JWT签名)private boolean validateToken(String token) {// 示例:简化逻辑,实际需校验签名、过期时间等return token.startsWith("valid_");}// 从Token中解析用户IDprivate String parseUserIdFromToken(String token) {return token.split("_")[1];  // 示例:valid_123 → 123}
}
 
  1. 配置白名单:
     
    实际场景中,除了登录接口,可能还有健康检查、公开接口等需要放行,可在过滤器中通过路径匹配实现,或通过配置文件定义白名单:
    gateway:auth:white-list: /login,/health,/public/**  # 白名单路径
    
     
     
    过滤器中读取白名单并判断是否放行。

4. 其他常用配置

  • 跨域配置:解决前端跨域问题(浏览器限制不同域名的请求):
    spring:cloud:gateway:globalcors:cors-configurations:'[/**]':  # 对所有路径生效allowed-origins: "https://example.com"  # 允许的源(*表示所有,生产环境不建议)allowed-methods: GET,POST,PUT,DELETE  # 允许的方法allowed-headers: "*"  # 允许的请求头allow-credentials: true  # 允许携带Cookie
    
     
     
  • 熔断降级:结合 Resilience4j,当下游服务超时 / 异常时返回降级响应:
    spring:cloud:gateway:routes:- id: user-service-routeuri: lb://user-servicepredicates:- Path=/user/**filters:- name: CircuitBreaker  # 启用熔断过滤器args:name: userServiceCircuitBreaker  # 熔断实例名fallbackUri: forward:/fallback/user  # 降级路径(网关内的接口)
    
     
     
    需额外定义/fallback/user接口,返回降级响应(如{"code":503,"msg":"服务暂时不可用"})。

总结

Spring Cloud 网关通过路由转发连接客户端与微服务,通过断言匹配请求,通过过滤器实现限流、鉴权等共性功能。核心配置中,限流依赖 Redis 和令牌桶算法,鉴权依赖自定义全局过滤器验证 Token,二者共同保障微服务的安全性和稳定性。

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

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

相关文章

郑州短视频代运营公司口碑榜:TOP3企业权威推荐

在数字化营销浪潮中,短视频已成为企业品牌推广的核心渠道之一。郑州作为中原地区的重要经济中心,短视频代运营服务需求持续增长。据行业统计,2023年河南省短视频用户规模突破5000万,年均增长率超20%,代运营市场呈…

深入大模型-2-大模型微调之Windows10安装大语言模型Unsloth微调环境 - 教程

深入大模型-2-大模型微调之Windows10安装大语言模型Unsloth微调环境 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…

K.20

K.20K20ITU-T K.20建议书规定了安装在电信中心的电信设备的抗力要求和测试程序。本建议书所述的过电压或过电流是指包括发电厂上或附近发生雷击、相邻交流电源线或铁路系统造成短期导电、电源故障引发大地电位上升以及…

C#语法查缺补漏

C#语法补充 空条件运算符和空合并运算符var clientIp = context.HttpContext.Connection.RemoteIpAddress?.ToString() ?? "unknown";- 首先RemoteIpAddress允许为空 - 若这个表达式(context.HttpContext…

Docker 部署 Elasticsearch 全流程手册

Elasticsearch(简称 ES)是一款基于 Lucene 构建的分布式、高扩展、高实时的全文搜索引擎,也是 ELK(Elasticsearch + Logstash + Kibana)技术栈的核心组件,目前广泛应用于企业级数据检索与分析场景。在开始 Elast…

办公神器-好用的办公软件

整理分享几个好用的办公软件: 1、互联网资源下载软件:ndm 下载方式:edg浏览器下载下载地址:https://www.neatdownloadmanager.com/index.php/en/进行下载。 2、压缩工具:7-zip 下载方式:edg浏览器搜索:z-ziphtt…

基于TMS320F28034的全桥LLC电源控制

基于TMS320F28034的全桥LLC电源控制实现,包含400V→48V转换的稳定版方案一、核心参数配置 // 系统时钟配置 #define SYSCLK_FREQ 150e6 // 150MHz #define PWM_FREQ 100e3 // 100kHz开关频率 #define EPWM_CLKDI…

ORA-12154TNS-03505 案例分享2

ORA-12154&TNS-03505 案例分享22025-10-23 09:58 潇湘隐者 阅读(0) 评论(0) 收藏 举报前几天遇到了ORA-12154&TNS-03505这个错误, 因为对其数据库环境不了解, 远程登录过去检查的时候, 了解到一些大概情况…

2025年10月ai优化推荐:主流榜单对比与避坑指南

引言与现状分析 当企业在2025年第四季度制定明年预算时,“ai优化”已从可选项变成必答题。品牌部想抓住DeepSeek、豆包、通义千问等新生流量入口,市场部担心传统SEO失灵后线索断层,IT部则苦恼于多平台算法差异大、更…

QOJ#12181. abc

题意:给定包含 `a,b,c` 的字符串,长度 $n \leq 2 \times 10^5$,求所有区间权值和,区间权值为出现次数最多字母的个数减去出现次数最少字母的个数(出现次数不为0)。思路:先统一式子,包含3种字母区间 $val_{l,r}…

2025年10月ai优化推荐:全维度对比评价助你精准决策

正在写一份面向10月采购季的技术负责人小王的私人备忘:他需要在四周内把集团分布在DeepSeek、豆包、通义千问、元宝、Kimi五平台的品牌问答准确率提升30%,同时控制预算不超过去年SEM费用的80%。小王最怕的是“各家都…

行业配置策略

策略逻辑搭建框架:行业景气度、趋势和拥挤度 构建模型: 2.1 行业景气模型:高景气+强趋势,规避高拥挤 2.2 行业趋势模型:强趋势+低拥挤,规避低景气 组合优化:轮动型/配置型 设置不同约束 求解行业权重 落地ETF/个…

2025 年最新防火涂料厂家排行榜:膨胀型 / 非膨胀型 / 厚型 / 薄型钢结构涂料厂家最新推荐

引言 在建筑与工业安全领域,防火涂料是保障人员生命与财产安全的关键防线,但其市场现状却让选购者面临重重挑战。当前市场上品牌繁杂,部分产品为降低成本偷工减料,防火性能未达国家标准,存在严重安全隐患;同时,…

AI元人文:创新决策、“躺平懒人”与针砭机制

AI元人文:创新决策、“躺平懒人”与针砭机制 当人工智能开始从“生成内容”迈向“生成决策”,一个常见的梦魇是:人类将彻底躺平,将思考的主权拱手相让,退化为被算法饲养的“认知懒人”。然而,前沿的“AI元人文”…

Kubernetes 主流网络插件的关键差异对比 - 详解

Kubernetes 主流网络插件的关键差异对比 - 详解2025-10-23 09:55 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display:…

dokuwiki制作侧边栏

dokuwiki制作侧边栏找到siderbar====== 导航栏 ====== ===资源导航===* [[gts游戏]]* [[gts小说]]* [[gts漫画]]* [[gts音声]] ===攻略教程===* [[gts游戏疑难杂症]]* [[gts游戏攻略]]

MySQL的这6大雷区,大部分人都会踩中!

前言 有些小伙伴在工作中,可能经常遇到这样的场景:系统上线初期运行良好,随着数据量增长,突然某天接口超时、CPU飙升、甚至整个系统瘫痪。 排查半天,发现是某个SQL语句写的有问题,或者是数据库配置不当导致的。 …

实验台厂家哪家好?2025年度权威推荐榜单揭晓!

在实验室的建设中,实验台是使用频率最高、承载功能最多的基础装备。一个优质的实验台,不仅关系到实验人员的工作效率和舒适度,更直接影响到实验数据的准确性与操作的安全性。因此,选择一家专业、可靠的实验台厂家至…

ceph-csi

ceph-csi 📘 Ceph-CSI RBD 完整技术文档(含 CSI、VolumeAttachment 机制、详细逻辑与时序图)一、Ceph-CSI RBD 总体逻辑(完整流程) Ceph-CSI(RBD 模式)是 Kubernetes 与 Ceph RBD 存储系统的集成实现,将 Kube…