网站首页 > 技术文章 正文
你在互联网大厂开发项目中,是不是经常遇到这样的问题?当需要搭建微服务架构的网关时,面对 Spring Boot3 全新的网关配置,总是一头雾水。配置完路由规则后,请求转发要么出错,要么达不到预期效果;想要添加自定义过滤器来处理请求响应,却不知道从何下手。别着急,今天就来帮你彻底解决 Spring Boot3 网关配置与实现的难题!
随着互联网技术的飞速发展,微服务架构逐渐成为大厂项目的主流架构模式。在微服务架构中,网关作为系统的统一入口,承担着路由转发、请求过滤、权限控制等重要功能。Spring Boot3 对网关模块进行了一系列的优化和升级,无论是性能还是功能都有了显著提升。但同时,也给开发人员带来了新的挑战,很多旧有的配置方式不再适用,需要我们重新学习和掌握新的配置方法和技巧。
Spring Boot3 网关核心原理剖析
在深入配置之前,先了解 Spring Cloud Gateway 的核心原理至关重要。Spring Cloud Gateway 是构建在 Spring 生态系统之上的 API 网关服务,基于 Spring 5、Spring Boot 2 和 Project Reactor 等技术,具备异步和非阻塞特性,这使得它在性能上相较于传统网关有显著优势。其核心概念主要包括路由(Route)、断言(Predicate)和过滤器(Filter)。
路由(Route)
路由是构建网关的基本模块,由唯一 ID、目标 URI、一系列断言和过滤器组成。当请求进来时,网关会遍历所有路由,一旦请求满足某个路由的断言条件,就会被转发到该路由对应的目标 URI。例如,一个简单的路由配置如下:
spring:
cloud:
gateway:
routes:
- id: user_route
uri: http://localhost:8081
predicates:
- Path=/user/**
上述配置中,id为user_route的路由,当请求路径以/user开头时(即满足Path=/user/**这个断言),请求会被转发到http://localhost:8081。
断言(Predicate)
断言可以理解为匹配条件,它能够匹配请求的任何属性,如请求头、请求参数、请求方法、请求路径等。Spring Cloud Gateway 提供了丰富的内置断言工厂,方便我们快速配置各种匹配规则。例如:
- Path断言:用于匹配请求路径,如Path=/user/**表示匹配以/user开头的路径。
- Method断言:用于匹配请求方法,如Method=GET表示只匹配 GET 请求。
- Header断言:用于匹配请求头,如Header=X-Request-Id, \d+表示匹配带有X-Request-Id请求头且值为数字的请求。
过滤器(Filter)
过滤器用于在请求被路由前后对请求和响应进行修改。Spring Cloud Gateway 中的过滤器分为全局过滤器(GlobalFilter)和 GatewayFilter。GatewayFilter 作用于特定路由,而 GlobalFilter 对所有路由生效。通过过滤器,我们可以实现诸如添加请求头、移除请求头、修改响应内容、限流、熔断等功能。例如,前面提到的StripPrefix过滤器,它可以移除请求路径中的前缀,方便目标服务处理请求。
了解了这些核心原理后,我们再进行配置就会更加得心应手。
Spring Boot3 网关配置核心步骤
添加依赖
首先,在你的项目pom.xml文件中,添加Spring Cloud Gateway依赖。比如,在一个基于 Maven 构建的项目中,添加以下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
同时,别忘了添加Spring Boot的依赖管理:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.x.x</version>
</parent>
这样就引入了 Spring Boot3 网关所需的基本依赖,为后续配置做好准备。此外,如果项目涉及服务发现(如 Eureka、Nacos 等),还需要添加相应的服务发现依赖。例如,若使用 Eureka 进行服务发现,需添加:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置文件设置
在application.yml文件中进行关键配置。启用Gateway功能,比如开启服务发现功能,方便动态发现和路由到服务实例:
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
接着配置路由规则,假设我们有一个名为user-service的服务,端口为 8081,想要通过网关访问该服务下/user路径的接口,配置如下:
spring:
cloud:
gateway:
routes:
- id: user_route
uri: http://localhost:8081
predicates:
- Path=/user/**
filters:
- StripPrefix=1
这里,id是路由的唯一标识;uri是目标服务地址;predicates定义了路由匹配条件,Path=/user/**表示当请求路径以/user开头时,该路由生效;filters定义了处理请求和响应的过滤器,StripPrefix=1表示移除请求路径的第一个前缀,也就是当请求/user/list时,转发到目标服务的路径为/list 。
在实际项目中,我们可能会有更复杂的路由配置需求。比如,同时匹配多个条件:
spring:
cloud:
gateway:
routes:
- id: complex_route
uri: http://backend-service
predicates:
- Path=/api/v1/**
- Method=POST
- Header=Content-Type,application/json
filters:
- AddRequestHeader=X-Request-From, Gateway
上述配置表示,当请求路径以/api/v1开头、请求方法为 POST 且请求头Content-Type为application/json时,请求会被转发到http://backend-service,并且在转发前会添加一个X-Request-From的请求头,值为Gateway。
动态路由配置
如果你的项目使用了服务发现组件,如Eureka,配置动态路由会让网关更加灵活。先在配置文件中开启相关功能:
spring:
cloud:
gateway:
discovery:
locator:
lowerCaseServiceId: true
lowerCaseServiceId: true表示将服务 ID 转换为小写,方便进行路由匹配。这样,网关就可以根据服务注册中心中注册的服务实例,自动进行路由转发,大大减少了静态配置的工作量。
以 Eureka 为例,当服务提供者向 Eureka 注册中心注册服务时,网关可以通过配置从 Eureka 获取服务列表,并根据服务名自动生成路由规则。假设我们有一个名为product-service的服务在 Eureka 中注册,那么可以配置如下动态路由:
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
lowerCaseServiceId: true
routes:
- id: product_route
uri: lb://product-service
predicates:
- Path=/product/**
这里的lb://product-service表示通过负载均衡(lb)的方式访问product-service服务,网关会自动从 Eureka 中获取product-service的实例列表,并进行负载均衡转发。
自定义过滤器
有时候,我们需要对请求和响应进行一些自定义处理,比如添加请求头、校验用户权限、记录请求日志等,这时就需要自定义过滤器。创建一个类,实现GatewayFilterFactory接口,例如:
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class CustomFilterFactory extends AbstractGatewayFilterFactory<CustomFilterFactory.Config> {
public CustomFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
ServerWebExchange newExchange = exchange.mutate()
.request(request -> request.header("Custom-Header", "Value"))
.build();
return chain.filter(newExchange);
};
}
public static class Config {
}
}
然后在配置文件中使用这个自定义过滤器:
spring:
cloud:
gateway:
routes:
- id: custom_route
uri: http://localhost:8081
predicates:
- Path=/custom/**
filters:
- CustomFilter
如此一来,当请求匹配到该路由时,自定义过滤器就会生效,按照我们定义的逻辑处理请求和响应。
在实际应用中,自定义过滤器还可以实现更复杂的功能。比如,实现一个用户权限校验过滤器,在请求进入网关时,校验用户是否有权限访问目标服务:
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class AuthFilterFactory extends AbstractGatewayFilterFactory<AuthFilterFactory.Config> {
public AuthFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
// 从请求头或其他地方获取用户信息,进行权限校验
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (token == null ||!isValidToken(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return Mono.empty();
}
return chain.filter(exchange);
};
}
private boolean isValidToken(String token) {
// 实际应用中,这里会调用认证服务进行校验
return "valid-token".equals(token);
}
public static class Config {
}
}
配置文件中使用该过滤器:
spring:
cloud:
gateway:
routes:
- id: auth_route
uri: http://protected-service
predicates:
- Path=/protected/**
filters:
- AuthFilter
Spring Boot3 网关高级配置与应用
限流配置
在高并发场景下,限流是保障系统稳定性的重要手段。Spring Cloud Gateway 提供了基于 Redis 的限流功能,使用令牌桶算法来控制请求速率。首先,添加 Redis 相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
然后,配置限流策略。例如,限制每个 IP 每秒最多只能发起 10 个请求,令牌桶容量为 20:
spring:
cloud:
gateway:
routes:
- id: rate_limit_route
uri: http://target-service
predicates:
- Path=/rate-limit/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
key-resolver: "#{@ipKeyResolver}"
这里的ipKeyResolver是一个自定义的KeyResolver,用于根据请求的 IP 地址生成限流的 Key,其实现如下:
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Configuration
public class RateLimitConfig {
@Bean
public KeyResolver ipKeyResolver() {
return new KeyResolver() {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}
};
}
}
熔断配置
为了防止某个服务故障导致整个系统雪崩,Spring Cloud Gateway 可以集成 Hystrix 实现熔断功能。添加 Hystrix 依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
配置熔断策略,例如,当请求/hystrix-route路由时,如果目标服务响应时间超过 500 毫秒或者错误率超过 50%,就触发熔断,调用降级方法:
spring:
cloud:
gateway:
routes:
- id: hystrix_route
uri: http://hystrix-service
predicates:
- Path=/hystrix/**
filters:
- name: Hystrix
args:
name: hystrixCommand
fallbackUri: forward:/fallback
execution.isolation.thread.timeoutInMilliseconds: 500
circuitBreaker.errorThresholdPercentage: 50
这里的fallbackUri指定了熔断后的降级处理路径,
execution.isolation.thread.timeoutInMilliseconds设置了超时时间,
circuitBreaker.errorThresholdPercentage设置了错误率阈值。
跨域配置
在前后端分离的项目中,跨域问题是常见的。Spring Cloud Gateway 可以很方便地进行跨域配置。在application.yml中添加如下配置:
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedMethods:
- GET
- POST
- PUT
- DELETE
- OPTIONS
上述配置表示允许所有来源的请求,支持常见的 HTTP 方法。在实际项目中,应根据安全需求合理配置allowedOrigins,避免安全风险。
总结
掌握了 Spring Boot3 网关从基础到高级的配置知识,相信你在后续的项目开发中,能够轻松应对网关配置的各种挑战。无论是简单的请求转发,还是复杂的限流、熔断等功能实现,都能游刃有余。如果你在配置过程中还有其他疑问,或者发现了更巧妙的配置技巧,欢迎在评论区留言分享,大家一起共同进步,打造更强大、稳定的互联网项目!
猜你喜欢
- 2025-07-14 BMS算法设计之SOC估算方法(二)(soc评估的几种方法)
- 2025-07-14 在iPhone里玩电路设计:3D版电子电路沙盒上线
- 2025-07-14 波音737NG系列飞机天空内饰LED窗灯总结,机务佬赶紧收藏
- 2025-07-14 概念篇:一篇文章让你彻底搞明白什么是微服务(值得收藏)
- 2025-07-14 什么是阻抗匹配?为什么要阻抗匹配?
- 2025-07-14 抓住毒枭儿子的墨西哥警察遭报复,停车场内被围堵射击155枪
- 2025-07-14 【规范申报】规范申报小课堂(第二讲)
- 2025-07-14 超级全的宝马模块缩写、常用缩写、中英对照,值得收藏
- 2025-07-14 大白话详解Spring Cloud服务降级与熔断
- 2025-07-14 什么是“断路器”?断路器主要功能?
- 07-27据说这是1000年以后的课本(一千年后的教科书)
- 07-27穿得好,你也可以很丁真!黑黄皮男生夏日色彩搭配指南
- 07-27进口大众贰则 丨 Volkswagen Multivan T5与CrossGolf
- 07-27《病娇模拟器》制作人让玩家投票决定游戏的发展之路
- 07-27《呻吟》内容过于真实,请谨慎阅读(四)
- 07-27汇编指令学习(ADD,SUB,MUL,DIV,XADD,INC,DEC,NEG)
- 07-27汇编语言mul乘法指令和模块化程序设计
- 07-27pycharm下module 'requests' has no attribute 'get'问题的解决
- 最近发表
-
- 据说这是1000年以后的课本(一千年后的教科书)
- 穿得好,你也可以很丁真!黑黄皮男生夏日色彩搭配指南
- 进口大众贰则 丨 Volkswagen Multivan T5与CrossGolf
- 《病娇模拟器》制作人让玩家投票决定游戏的发展之路
- 《呻吟》内容过于真实,请谨慎阅读(四)
- 汇编指令学习(ADD,SUB,MUL,DIV,XADD,INC,DEC,NEG)
- 汇编语言mul乘法指令和模块化程序设计
- pycharm下module 'requests' has no attribute 'get'问题的解决
- python委托定制超类getattr和getattribute管理属性
- 「按键精灵安卓版」界面多选框实现10选3(选中不超过3个)
- 标签列表
-
- axure 注册码 (25)
- exploit db (21)
- mutex_lock (30)
- oracleclient (27)
- nfs (25)
- springbatch (28)
- oracle数据库备份 (25)
- dir (26)
- connectionstring属性尚未初始化 (23)
- output (32)
- panel滚动条 (28)
- centos 5 4 (23)
- sql学习 (33)
- c 数组 (33)
- pascal语言教程 (23)
- ppt 教程 (35)
- java7 (24)
- 自适应网站制作 (32)
- server服务自动停止 (25)
- 超链接去掉下划线 (34)
- 什么是堆栈 (22)
- map entry (25)
- ubuntu装qq (25)
- outputstreamwriter (26)
- fill_parent (22)