Spring Cloud Gateway 统一服务入口
2026/8/24 0:11:23 网站建设 项目流程

文章目录

  • Spring Cloud Gateway 统一服务入口
    • 一、依赖版本
      • Boot 4 与 Boot 3 差异
    • 二、为什么需要网关
    • 三、依赖与启动类
      • 3.1 gateway/pom.xml
      • 3.2 启动类
    • 四、配置文件
      • 4.1 application-dev.yml
      • 4.3 路由字段说明
    • 五、断言(Route Predicate)
    • 六、过滤器(Gateway Filter)
    • 七、总结

Spring Cloud Gateway 统一服务入口


一、依赖版本

组件版本说明
Java21
Spring Boot4.1.0父 POM 统一管理
Spring Cloud2025.1.2spring-cloud-dependencies
Spring Cloud Alibaba2025.1.0.0spring-cloud-alibaba-dependencies

父 POM 版本锁定:

<properties><java.version>21</java.version><spring-cloud.version>2025.1.2</spring-cloud.version><spring-cloud-alibaba.version>2025.1.0.0</spring-cloud-alibaba.version></properties>

Boot 4 与 Boot 3 差异

对比项Boot 3Boot 4(当前项目)
Gateway 依赖spring-cloud-starter-gatewayspring-cloud-starter-gateway-server-webflux
路由配置spring.cloud.gateway.routesspring.cloud.gateway.server.webflux.routes
默认过滤器spring.cloud.gateway.default-filtersspring.cloud.gateway.server.webflux.default-filters

旧 starter 在 Cloud 2025 BOM 中已移除,继续使用会报依赖无法加载。


二、为什么需要网关

微服务拆分后,Nacos 解决注册发现,LoadBalancer 解决负载均衡,OpenFeign 解决服务间调用。但接口仍分散在各服务端口上:

问题说明
入口分散客户端需分别访问 8080、8081 等
重复鉴权每个服务都要做权限校验

Gateway 作为统一入口:外部只访问9000,内部按路由转发到lb://order-service/lb://product-service

服务端口注册名
gateway9000gateway
order-service8080order-service
product-service8081 / 8082 / 8083product-service

网关是否和拦截器切面等重复冗余?

  • 网关过滤器(大门外):运行在请求进入微服务集群之前,是流量的大门。它属于WebFlux(Netty)层,不依赖 Servlet 容器。

  • 拦截器/切面(大门内):运行在请求已经进入具体的微服务应用之后。它属于 Spring MVC(Servlet) 容器,依赖具体的 Controller 或 Service。

  • 如果网关已经拦截(如 Token 过期),请求直接返回 401,根本不会到达拦截器和切面——这节省了内部服务的线程资源。

结论:网关管“能不能进门”,拦截器管“进门后坐哪”,切面管“坐下后具体怎么做”。三者配合,而不是互相替代。


三、依赖与启动类

3.1 gateway/pom.xml

<!-- Gateway WebFlux(Boot 4 新 starter,禁止引入 spring-boot-starter-web) --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway-server-webflux</artifactId></dependency><!-- lb://服务名 负载均衡(必须单独引入) --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><!-- Nacos 服务发现 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

3.2 启动类

@SpringBootApplication// Spring Boot 自动配置@EnableDiscoveryClient// 注册到 Nacos,服务名 gatewaypublicclassGatewayApplication{publicstaticvoidmain(String[]args){// 应用入口SpringApplication.run(GatewayApplication.class,args);}}

四、配置文件

4.1 application-dev.yml

server:port:9000# 网关监听端口spring:cloud:nacos:discovery:server-addr:127.0.0.1:8848# Nacos 注册中心地址loadbalancer:nacos:enabled:true# 启用 Nacos 权重/集群负载均衡策略gateway:server:webflux:default-filters:-AddResponseHeader=X-Gateway,spring-cloud-gateway# 全局响应头routes:-id:order-route# 路由 IDuri:lb://order-service# 负载均衡转发到 order-servicepredicates:-Path=/order/**# 路径断言-Method=GET,POST# 方法断言filters:-AddRequestHeader=X-Request-Source,gateway# 添加请求头-id:product-route# 路由 IDuri:lb://product-service# 负载均衡转发到 product-servicepredicates:-Path=/product/**# 路径断言-Method=GET,POST# 方法断言filters:-AddRequestHeader=X-Request-Source,gateway# 添加请求头-id:product-by-id-route# 带 Query 断言的路由uri:lb://product-service# 目标服务predicates:-Path=/product/getProductById# 精确路径-Query=id,\d+# id 必须为数字-Method=GET# 仅 GETfilters:-AddRequestHeader=X-Matched-Route,product-by-id# 标记命中的路由-id:order-api-route# StripPrefix 示例路由uri:lb://order-service# 目标服务predicates:-Path=/api/order/**# /api/order/xxxfilters:-StripPrefix=1# 去掉 /api 前缀,转发为 /order/xxx-id:product-legacy-route# RewritePath 示例路由uri:lb://product-service# 目标服务predicates:-Path=/legacy/product/**# 旧路径filters:-RewritePath=/legacy/product/(?<segment>.*),/product/${segment}# 重写为新路径logging:level:org.springframework.cloud.gateway:debug# Gateway 调试日志org.springframework.cloud.loadbalancer:debug# 负载均衡调试日志

4.3 路由字段说明

字段说明
id路由唯一标识
uri目标地址;lb://服务名从 Nacos 取实例并负载均衡
predicates断言,全部满足才匹配(AND)
filters匹配后对请求/响应的处理

五、断言(Route Predicate)

yml 中的断言字符串由Route Predicate Factory解析,多个断言默认AND关系。

名称说明配置示例
Path路径匹配Path=/product/**
MethodHTTP 方法匹配Method=GET,POST
QueryQuery 参数正则匹配Query=id, \d+
After指定时间之后的请求After=2024-01-01T00:00:00.000+08:00[Asia/Shanghai]
Before指定时间之前的请求Before=2025-12-31T23:59:59.000+08:00[Asia/Shanghai]
Between两个时间之间的请求Between=开始时间, 结束时间
HeaderHeader 值正则匹配Header=X-Request-Id, \d+
CookieCookie 值正则匹配Cookie=token, .+
Host请求 Host 匹配Host=**.example.com
RemoteAddr请求 IP 段匹配RemoteAddr=192.168.1.1/24

时间断言设为未来时间时,当前请求会 404(路由不匹配)。


六、过滤器(Gateway Filter)

Predicate 决定走哪条路由,Filter 决定路上做什么。Filter 分Pre(转发后端前)和Post(响应返回前)。

名称类型说明配置示例
AddResponseHeaderGatewayFilter / default-filters添加响应 HeaderAddResponseHeader=X-Gateway, spring-cloud-gateway
AddRequestHeaderGatewayFilter添加请求 HeaderAddRequestHeader=X-Request-Source, gateway
AddRequestParameterGatewayFilter添加 Query 参数AddRequestParameter=userName, bite
RemoveRequestHeaderGatewayFilter删除请求 HeaderRemoveRequestHeader=X-Request-Foo
RemoveResponseHeaderGatewayFilter删除响应 HeaderRemoveResponseHeader=X-Response-Foo
StripPrefixGatewayFilter去掉路径前缀段StripPrefix=1
RewritePathGatewayFilter正则重写路径RewritePath=/legacy/product/(?<segment>.*), /product/${segment}
PrefixPathGatewayFilter添加路径前缀PrefixPath=/api
RequestRateLimiterGatewayFilter限流(需 Redis)name: RequestRateLimiter+ redis 参数
RetryGatewayFilter失败重试name: Retry+retries: 3
RequestSizeGatewayFilter限制请求体大小name: RequestSize+maxSize: 5000000
LoadBalancerClientFilterGlobalFilter解析lb://并负载均衡内置,无需 yml
Gateway Metrics FilterGlobalFilter监控指标需 actuator

执行顺序:order 越小越先执行;order 相同时defaultFilter>GatewayFilter>GlobalFilter


七、总结

主题要点
版本Boot 4.1.0 + Cloud 2025.1.2 + Alibaba 2025.1.0.0 + Java 21
依赖gateway-server-webflux+loadbalancer+nacos-discovery
配置前缀spring.cloud.gateway.server.webflux.*
入口gateway:9000 →lb://order-service/lb://product-service
负载均衡loadbalancer.nacos.enabled: true
断言多条件 AND;Path / Method / Query 等
过滤器default-filters 全局;StripPrefix / RewritePath 路径变换

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询