news 2026/2/28 21:58:07

Spring Cloud Gateway

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Cloud Gateway

zuul终究还是被时代淘汰了,spring基本上也逐渐放弃了Netflix平台,自己搞起了gateway。这不得不聊起一个人 Spencer Gibb,他是zuul的核心开发,带领一群有志青年,放弃zuul,转战spring cloud gateway。

应用搭建

其maven依赖如下:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>

之后,只需要写个简单的spring boot程序就可以了,与zuul不同的是,gateway没有@Enable开头的开关:

@SpringBootApplicationpublicclassGatewayApplication{publicstaticvoidmain(String[]args){SpringApplication.run(GatewayApplication.class,args);}}

这就是gateway与zuul设计哲学的不同。

网关配置

光完成上述代码肯定不够,因为没有配置转发。以下是配置文件的一个例子:

server:port:80# 网关端口spring:cloud:gateway:routes:-id:user_route# 直接写死目标服务的 IP 和端口uri:http://127.0.0.1:8001predicates:-Path=/user/**

之后就可以正常转发了。

谓词配置

配置中的predicates是gateway的谓词,这部分可谓非常复杂了。上述例子里用的是路径谓词。此外我还整理了其他比较好用的谓词.

谓词名称用途典型场景
Path匹配请求路径/api/转发给某个服务
Query匹配请求参数根据 URL 中的参数(如版本号)分流
Header匹配请求头根据User-Agent或自定义 Header 鉴权
Method匹配请求方法只允许 GET 或 POST 请求通过
Cookie匹配 Cookie针对特定用户群体的灰度发布
Host匹配域名基于域名的路由(如*.abc.com
RemoteAddr匹配客户端 IP黑白名单、IP 限流
After/Before匹配时间活动期间开启特定页面,或维护窗口

过滤器

除了谓词以外,gateway还提供了过滤器配置,以达到更精致的网关控制。以下是常见的过滤器:

分类过滤器名称 (Filter Name)核心作用
请求处理AddRequestHeader给请求头添加自定义信息
AddRequestParameter给请求添加参数
RewritePath重写请求路径(最常用)
StripPrefix截断请求路径前缀
RequestRateLimiter请求限流(令牌桶算法)
响应处理AddResponseHeader给响应头添加信息
DedupeResponseHeader去除响应头中重复的值
SetStatus修改返回的状态码
路由增强Hystrix熔断保护(旧版)
RequestSize限制请求包大小
Retry失败自动重试

转发实现

gateway是怎么转发的?gateway是基于WebFlux技术的。gateway写了一个RoutePredicateHandlerMapping,该类实现了HandlerMapping接口,所以充当了传统servlet里控制器的角色。核心方法在lookupRoute里。在追踪gateway源码时我们可以记录一下堆栈的变化。

  1. 线程Thread[reactor-http-nio-2,5,main]

at org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping.lookupRoute(RoutePredicateHandlerMapping.java:128)
at org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping.getHandlerInternal(RoutePredicateHandlerMapping.java:87)
at org.springframework.web.reactive.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:181)

  1. 线程Thread[reactor-http-nio-2,5,main]

at org.springframework.cloud.gateway.handler.FilteringWebHandler.handle(FilteringWebHandler.java:77)
at org.springframework.web.reactive.result.SimpleHandlerAdapter.handle(SimpleHandlerAdapter.java:45)
at org.springframework.web.reactive.DispatcherHandler.invokeHandler(DispatcherHandler.java:161)

  1. 线程Thread[reactor-http-nio-2,5,main]

at org.springframework.cloud.gateway.filter.NettyRoutingFilter.filter(NettyRoutingFilter.java:104)
at org.springframework.cloud.gateway.handler.FilteringWebHandler$GatewayFilterAdapter.filter(FilteringWebHandler.java:138)
at org.springframework.cloud.gateway.filter.OrderedGatewayFilter.filter(OrderedGatewayFilter.java:44)

NettyRoutingFilter这个类里终于找到了转发的代码了,我只贴一行代码,不过这行代码可够长的了:

Flux<HttpClientResponse>responseFlux=this.httpClient.headers(headers->{headers.add(httpHeaders);if(preserveHost){Stringhost=request.getHeaders().getFirst(HttpHeaders.HOST);headers.add(HttpHeaders.HOST,host);}else{// let Netty set it based on hostnameheaders.remove(HttpHeaders.HOST);}}).request(method).uri(url).send((req,nettyOutbound)->{if(log.isTraceEnabled()){nettyOutbound.withConnection(connection->log.trace("outbound route: "+connection.channel().id().asShortText()+", inbound: "+exchange.getLogPrefix()));}returnnettyOutbound.send(request.getBody().map(dataBuffer->((NettyDataBuffer)dataBuffer).getNativeBuffer()));}).responseConnection((res,connection)->{// 省略很多很多代码。。。。。。。returnMono.just(res);});
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/27 16:14:37

理解机器学习里的NFL定理

NFL定理Qwen3-max摘要&#xff1a;如果问题不确定&#xff0c;任何算法都没有优劣之分。换而言之&#xff0c;算法的优越性不是绝对的&#xff0c;而是相对于特定问题类而言的。没有“通用最优”算法&#xff0c;必须&#xff08;对应现实问题&#xff09;引入“归纳偏置”&…

作者头像 李华
网站建设 2026/2/28 8:16:57

项目风险预警:智能分析系统

项目风险预警:智能分析系统 关键词:项目风险预警、智能分析系统、风险评估、机器学习、数据分析 摘要:本文围绕项目风险预警智能分析系统展开,旨在为项目管理提供全面、高效且精准的风险预警解决方案。首先介绍了系统开发的背景、目的、预期读者和文档结构等内容,阐述了相…

作者头像 李华
网站建设 2026/2/26 15:43:53

论文AI率从高到低,这五佳工具更快

又到毕业季&#xff0c;毕业论文除了查重外&#xff0c;真的别忘记查ai率。 今天就告诉大家高重复率以及高ai率应该如何快速降低&#xff01;实测全网产品&#xff0c;无广&#xff01;&#xff01; 如果这篇整理能帮你少走点弯路&#xff0c;那就值了。 1、嘎嘎降AI 官网&…

作者头像 李华
网站建设 2026/2/21 22:49:46

五佳降AI工具排行,学生党怎么选

又到毕业季&#xff0c;毕业论文除了查重外&#xff0c;真的别忘记查ai率。 今天就告诉大家高重复率以及高ai率应该如何快速降低&#xff01;实测全网产品&#xff0c;无广&#xff01;&#xff01; 如果这篇整理能帮你少走点弯路&#xff0c;那就值了。 1、嘎嘎降AI 官网&…

作者头像 李华
网站建设 2026/2/25 14:36:20

【计算机毕业设计案例】基于SpringBoot的发动机零件、电器元件汽车配件仓储管理系统设计与实现(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/2/12 13:13:22

傲梅分区工具——无损调整分区、MBR/GPT转换的终极方案

在系统运维、数据迁移或解决C盘空间不足等日常场景中&#xff0c;一款功能强大、安全可靠的分区工具必不可少。相比Windows自带的磁盘管理功能&#xff0c;傲梅分区助手以其直观的图形界面和丰富的无损分区功能&#xff0c;成为了众多用户的首选。本次更新的便携版更是在易用性…

作者头像 李华