Gateway网关:路由、拦截、鉴权、过滤全局控制
Gateway网关路由、拦截、鉴权、过滤全局控制微服务架构里几十个服务各自暴露端口就像几十扇门同时敞开。网关就是那扇唯一的大门——所有请求都从这里进统一鉴权、统一路由、统一限流。一、API网关的角色微服务的门卫在微服务架构中如果没有网关客户端需要直接调用各个微服务没有网关 客户端 ──→ 设备服务8001 客户端 ──→ 商品服务8002 客户端 ──→ 订单服务8003 客户端 ──→ 支付服务8004这样会暴露出一堆问题服务地址暴露给客户端、没有统一鉴权入口、跨域配置散落各处、无法统一限流和日志。加一个网关后有网关 客户端 ──→ Gateway统一入口:9000 ├── /device/** → 设备服务 ├── /product/** → 商品服务 ├── /order/** → 订单服务 └── /pay/** → 支付服务网关的六大核心职责统一路由转发根据请求路径分发到不同微服务统一鉴权在网关层校验 Token没权限的直接挡回去统一限流配合 Sentinel 在网关层做全局限流统一日志记录所有请求的访问日志跨域处理集中配置 CORS不用每个服务单独配灰度发布通过请求头/Header 控制流量路由到新版本二、Gateway vs Zuul为什么选 Gateway特性Zuul 1.xSpring Cloud Gateway架构模型同步阻塞Servlet响应式异步Netty Reactor性能一般显著优于 ZuulSpring 生态支持逐渐边缘化Spring 官方亲儿子长连接/WebSocket支持差原生支持过滤器机制阻塞式非阻塞式Zuul 2.x 虽然也转了异步模型但 Spring Cloud 社区已经选择了 Gateway 作为官方网关方案Zuul 基本告别历史舞台。Gateway 基于 Spring WebFlux Reactor Netty 构建天生响应式。这意味着它不占用线程等待每个请求完成而是用事件循环处理高并发在同样的机器资源下吞吐量远超 Zuul。坑点提醒Gateway 基于 WebFlux不能和传统 Servlet 容器Tomcat混用。如果你在 Gateway 工程里引入了spring-boot-starter-web启动直接报错。三、Gateway 核心概念Route / Predicate / Filter理解这三个概念Gateway 就学会了 80%。┌─────────────────────────────────────────────────────┐ │ Route路由 │ │ 组成ID URI Predicate Filter │ │ 作用定义一条路由规则请求从哪来到哪去 │ ├─────────────────────────────────────────────────────┤ │ Predicate断言 │ │ 作用判断请求是否匹配某条路由 │ │ 比如Path/product/** 匹配 /product/ 开头的请求 │ ├─────────────────────────────────────────────────────┤ │ Filter过滤器 │ │ 作用对匹配的请求做加工处理 │ │ 比如加请求头、改路径、限流、鉴权 │ └─────────────────────────────────────────────────────┘三者的协作流程客户端请求 ↓ Gateway 接收 ↓ ┌──────────────────────────────────────────────────┐ │ Predicate 断言匹配 │ │ 请求 /product/detail → 匹配 Path/product/** 路由 │ └──────────────┬───────────────────────────────────┘ ↓ ┌──────────────────────────────────────────────────┐ │ Pre Filter 前置过滤器链 │ │ 鉴权 → 加请求头 → 限流检查 │ └──────────────┬───────────────────────────────────┘ ↓ 转发到商品服务 ↓ ┌──────────────────────────────────────────────────┐ │ Post Filter 后置过滤器链 │ │ 改响应头 → 记录日志 → 统一响应格式 │ └──────────────┬───────────────────────────────────┘ ↓ 返回客户端四、路由配置方式4.1 yml 配置方式推荐spring:cloud:gateway:routes:# 商品服务路由-id:product-service-routeuri:lb://product-service# lb:// 表示负载均衡后跟服务名predicates:-Path/product/**# 匹配 /product/ 开头的路径filters:-StripPrefix1# 去掉第一层路径前缀# 订单服务路由-id:order-service-routeuri:lb://order-servicepredicates:-Path/order/**filters:-StripPrefix1StripPrefix1是一个常用过滤器请求/product/detail会被转成/detail发给商品服务。因为/product只是给 Gateway 用的路由前缀商品服务自己的 Controller 映射的是/detail。4.2 编程式配置RouteLocatorConfigurationpublicclassGatewayRouteConfig{BeanpublicRouteLocatorcustomRouteLocator(RouteLocatorBuilderbuilder){returnbuilder.routes().route(device-service-route,r-r.path(/device/**).filters(f-f.stripPrefix(1)).uri(lb://device-service)).build();}}实际开发中 90% 用 yml 配置编程式适合动态路由场景。五、断言Predicate路由匹配规则Gateway 内置了丰富的断言工厂可以组合使用断言含义示例Path匹配请求路径Path/product/**Method匹配 HTTP 方法MethodGET,POSTHeader匹配请求头HeaderX-Request-Id, \dHost匹配域名Host**.vending.comAfter指定时间之后After2026-01-01T00:00:0008:00Before指定时间之前Before2026-12-31T23:59:5908:00Between时间范围内Between2026-01-01T...,2026-06-01T...Query匹配请求参数QueryproductId, \dCookie匹配 CookieCookietoken, .RemoteAddr匹配 IPRemoteAddr192.168.1.0/24组合使用示例spring:cloud:gateway:routes:-id:product-service-routeuri:lb://product-servicepredicates:-Path/product/**-MethodGET,POST# 只允许 GET 和 POST-HeaderX-Api-Version,v2# 必须带 X-Api-Version: v2 头六、内置过滤器请求加工工具箱Gateway 内置了大量过滤器常用的有过滤器作用AddRequestHeader给请求加头AddRequestParameter给请求加参数StripPrefix去掉路径前缀常用RewritePath重写路径PrefixPath加路径前缀SetStatus设置响应状态码RequestRateLimiter请求限流配合 RedisAddResponseHeader给响应加头RewritePath 示例正则重写路径filters:-RewritePath/product/(?segment.*),/$\{segment}# /product/detail → /detail等价于 StripPrefix1七、自定义全局过滤器鉴权拦截内置过滤器是针对单条路由的如果你需要对所有请求做统一处理比如鉴权就用全局过滤器GlobalFilter。以 JWT 鉴权为例实现一个全局认证过滤器ComponentOrder(-100)// 优先级数字越小优先级越高。鉴权要最先执行publicclassAuthGlobalFilterimplementsGlobalFilter{// 不需要鉴权的白名单路径privatestaticfinalListStringWHITE_LISTList.of(/auth/login,/auth/register);OverridepublicMonoVoidfilter(ServerWebExchangeexchange,GatewayFilterChainchain){Stringpathexchange.getRequest().getURI().getPath();// 白名单直接放行if(WHITE_LIST.stream().anyMatch(path::startsWith)){returnchain.filter(exchange);}// 获取 TokenStringtokenexchange.getRequest().getHeaders().getFirst(Authorization);// Token 为空 → 401 未认证if(tokennull||token.isEmpty()){returnunauthorized(exchange,缺少认证信息);}// 校验 Tokentry{if(!token.startsWith(Bearer )){returnunauthorized(exchange,Token 格式错误);}Stringjwttoken.substring(7);// 这里调用 JWT 工具类校验简化示例StringuserIdJwtUtil.verify(jwt);if(userIdnull){returnunauthorized(exchange,Token 已失效);}// 校验通过把用户 ID 放到请求头传给下游服务ServerWebExchangemutatedExchangeexchange.mutate().request(r-r.header(X-User-Id,userId)).build();returnchain.filter(mutatedExchange);}catch(Exceptione){returnunauthorized(exchange,Token 校验失败);}}/** * 统一返回 401 未授权响应 */privateMonoVoidunauthorized(ServerWebExchangeexchange,Stringmessage){ServerHttpResponseresponseexchange.getResponse();response.setStatusCode(HttpStatus.UNAUTHORIZED);response.getHeaders().setContentType(MediaType.APPLICATION_JSON);Stringbody{\code\: 401, \message\: \message\};DataBufferbufferresponse.bufferFactory().wrap(body.getBytes());returnresponse.writeWith(Mono.just(buffer));}}这个过滤器的工作原理所有请求进来先经过它因为Order(-100)优先级高白名单路径直接放行其他路径检查Authorization头中的 JWT Token校验通过后把用户 ID 塞到请求头X-User-Id中传给下游服务校验失败返回 401 JSON 响应下游服务可以直接从请求头取用户 ID不用再重复解析 Token// 商品服务中GetMapping(/detail)publicStringgetProductDetail(RequestHeader(valueX-User-Id,requiredfalse)StringuserId){// userId 是网关传过来的已认证return用户 userId 查看商品详情;}八、网关整合 Nacos动态路由Gateway 整合 Nacos 后路由可以通过服务名自动发现不用写死 IPspring:cloud:gateway:discovery:locator:enabled:true# 开启服务发现自动路由lower-case-service-id:true# 服务名转小写开启后Gateway 会自动为每个注册到 Nacos 的服务创建路由http://网关地址/PRODUCT-SERVICE/product/detail ↓ 自动路由到 product-service 的某个实例 开启 lower-case-service-id 后 http://网关地址/product-service/product/detail但实际开发中一般不用自动路由而是用lb://服务名手动配置路由因为自动路由无法灵活配置 filters 和 predicates。动态路由指的是路由规则可以动态变更。可以通过 Nacos 配置中心管理路由 JSON监听变更后刷新路由表RefreshScopeConfigurationProperties(spring.cloud.gateway)publicclassDynamicRouteConfig{// 路由配置从 Nacos 读取变更时自动刷新}九、网关整合 Sentinel网关层限流在网关层做限流比在服务层做更高效——挡在门口总比放进来了再限要好。!-- Gateway 整合 Sentinel --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-sentinel-gateway/artifactId/dependencyspring:cloud:sentinel:transport:dashboard:127.0.0.1:8080filter:enabled:false# 关闭默认 Web 过滤器用 Gateway 专属适配ConfigurationpublicclassGatewayConfig{PostConstructpublicvoidinit(){// 自定义网关限流响应GatewayCallbackManager.setBlockHandler((exchange,ex)-{MapString,ObjectresultnewHashMap();result.put(code,429);result.put(message,请求太频繁请稍后再试);returnServerResponse.status(HttpStatus.TOO_MANY_REQUESTS).contentType(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(result));});}}在 Sentinel Dashboard 中可以看到 Gateway 专属的API 分组和网关路由维度的限流规则。十、网关最佳实践10.1 跨域配置spring:cloud:gateway:globalcors:cors-configurations:[/**]:allowed-origins:https://vending.example.comallowed-methods:*allowed-headers:*allow-credentials:truemax-age:3600在网关层统一配置 CORS 后下游服务就不用再单独配了。如果下游也配了 CORS 会导致Access-Control-Allow-Origin重复浏览器报错。10.2 超时配置spring:cloud:gateway:httpclient:connect-timeout:3000# 连接超时 3 秒response-timeout:10s# 响应超时 10 秒10.3 灰度发布通过自定义断言或过滤器根据请求头中的版本标记路由到不同版本的服务实例ComponentpublicclassGrayReleaseFilterimplementsGlobalFilter,Ordered{OverridepublicMonoVoidfilter(ServerWebExchangeexchange,GatewayFilterChainchain){Stringversionexchange.getRequest().getHeaders().getFirst(X-Gray-Version);if(v2.equals(version)){// 灰度流量路由到 v2 版本服务exchange.getAttributes().put(gray,true);}returnchain.filter(exchange);}OverridepublicintgetOrder(){return-90;}}配合 Nacos 给不同版本服务打标签Gateway 根据 Tag 路由到对应版本。十一、总结Gateway 是微服务的统一门卫掌握三个核心概念就够用了Route路由定义请求去哪、Predicate断言定义匹配条件、Filter过滤器定义加工逻辑。鉴权用自定义 GlobalFilter 统一处理限流交给 Sentinel 在网关层挡住跨域在网关统一配。守住这扇门后面的微服务群就安全了一大半。

相关新闻

Sentinel熔断限流:容错、降级、热点防护

Sentinel熔断限流:容错、降级、热点防护

Sentinel熔断限流:容错、降级、热点防护微服务调用链就像多米诺骨牌,一个服务倒下,后面的跟着全躺。Sentinel 就是那个在关键位置挡住连锁反应的守门员。一、雪崩效应:为什么需要熔断限流 微服务架构下,服务之间存在大…

2026/7/31 21:55:53 阅读更多 →
跨语言知识迁移:LLaMA-Factory实现多语言模型的无缝迁移技术

跨语言知识迁移:LLaMA-Factory实现多语言模型的无缝迁移技术

跨语言知识迁移:LLaMA-Factory实现多语言模型的无缝迁移技术 【免费下载链接】LlamaFactory Unified Efficient Fine-Tuning of 100 LLMs & VLMs (ACL 2024) 项目地址: https://gitcode.com/GitHub_Trending/ll/LlamaFactory 你是否还在为训练多语言模型…

2026/7/31 21:54:53 阅读更多 →
ai免费写论文好用吗?实测3款AI写作辅助网站,结果有好有坏!

ai免费写论文好用吗?实测3款AI写作辅助网站,结果有好有坏!

宝子们,有没有人跟我一样,一提到写论文就头皮发麻? 熬夜熬到凌晨三点,结果导师一句"逻辑不通"打回重写,谁懂啊! 说真的,我之前也以为 AI 写论文是智商税,直到自己踩了无数…

2026/7/31 21:54:53 阅读更多 →

最新新闻

并发日志策略:Loguru多线程与异步日志安全实践指南

并发日志策略:Loguru多线程与异步日志安全实践指南

并发日志策略:Loguru多线程与异步日志安全实践指南 【免费下载链接】loguru Python logging made (stupidly) simple 项目地址: https://gitcode.com/gh_mirrors/lo/loguru 在现代Python应用开发中,并发编程已成为常态。无论是Web服务器处理海量请…

2026/7/31 22:40:07 阅读更多 →
MarkItDown终极指南:如何一键将PDF、Word、Excel等文件转换为AI友好的Markdown格式

MarkItDown终极指南:如何一键将PDF、Word、Excel等文件转换为AI友好的Markdown格式

MarkItDown终极指南:如何一键将PDF、Word、Excel等文件转换为AI友好的Markdown格式 【免费下载链接】markitdown Python tool for converting files and office documents to Markdown. 项目地址: https://gitcode.com/GitHub_Trending/ma/markitdown 还在为…

2026/7/31 22:40:07 阅读更多 →
容器镜像优化终极指南:使用awesome-container-tinkering工具减少90%体积

容器镜像优化终极指南:使用awesome-container-tinkering工具减少90%体积

容器镜像优化终极指南:使用awesome-container-tinkering工具减少90%体积 【免费下载链接】awesome-container-tinkering List of awesome tools to tinker with containers. 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-container-tinkering 容器技…

2026/7/31 22:40:07 阅读更多 →
业务安全实战:当机器学习遇见黑灰产——基于行为特征的异常挖掘

业务安全实战:当机器学习遇见黑灰产——基于行为特征的异常挖掘

业务安全实战:当机器学习遇见黑灰产——基于行为特征的异常挖掘 授权与合规声明:本文所有实验均在团队专属的隔离授权实验环境中进行(攻击机与目标靶场均为自有的云服务器)。其中暴力破解(hydra)演示仅针对…

2026/7/31 22:40:07 阅读更多 →
RegExtract路线图:3.0版本Source Generator支持前瞻

RegExtract路线图:3.0版本Source Generator支持前瞻

RegExtract路线图:3.0版本Source Generator支持前瞻 【免费下载链接】RegExtract Clean & simple idiomatic C# RegEx-based line parser that emits strongly typed results. 项目地址: https://gitcode.com/gh_mirrors/re/RegExtract RegExtract是一款…

2026/7/31 22:40:07 阅读更多 →
NETworkManager:提升网络管理效率的集成化工具

NETworkManager:提升网络管理效率的集成化工具

1. 为什么我们需要NETworkManager这样的网络管理工具在当今复杂的网络环境中,管理员和IT专业人员面临着前所未有的挑战。想象一下这样的场景:你负责维护一个拥有数百台设备的公司网络,突然接到用户报告说某个部门的网络连接异常。传统上&…

2026/7/31 22:39:07 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻