Spring Cloud Gateway:构建高效微服务网关的利器
引言:为什么需要API网关?
在微服务架构中,一个系统往往由数十甚至上百个服务组成。客户端直接与各个服务通信会面临诸多挑战:
-
复杂的路由管理:不同请求需动态路由到对应服务实例。
-
安全与认证:每个服务单独处理身份验证会增加重复代码和安全风险。
-
流量控制与熔断:缺乏统一的限流和容错机制可能导致系统雪崩。
-
监控与日志:分散的日志难以追踪问题。
API网关作为系统的统一入口,能够高效解决上述问题。而Spring Cloud Gateway凭借其高性能和灵活性,成为Spring生态中网关的首选方案。
与Zuul的对比:为什么选择Spring Cloud Gateway?
特性 | Spring Cloud Gateway | Zuul 1.x |
---|---|---|
架构模型 | 异步非阻塞(WebFlux) | 同步阻塞(Servlet) |
性能 | 高吞吐,低延迟 | 受限于线程池 |
扩展性 | 灵活的过滤器链 | 过滤器粒度较粗 |
维护状态 | 官方持续更新 | 已停止维护 |
注意事项与最佳实践
-
避免阻塞操作:Gateway基于Netty,若使用阻塞式代码(如JDBC),需在单独线程池执行。
-
合理设计路由规则:按业务模块划分路径,避免过于复杂的断言逻辑。
-
监控与健康检查:集成Actuator暴露端点,结合Prometheus监控流量。
一、Spring Cloud Gateway核心特性
-
异步非阻塞模型
基于Project Reactor和WebFlux构建,支持高并发场景,性能远超传统同步网关(如Zuul 1.x)。 -
动态路由
支持通过配置或代码动态调整路由规则,实时生效无需重启。 -
强大的断言(Predicate)和过滤器(Filter)
-
断言:匹配HTTP请求的任意属性(如路径、Header、请求方法)。
-
过滤器:在请求前后修改内容,支持全局过滤和路由级过滤。
-
-
集成Spring Cloud生态
无缝对接Eureka、Nacos等服务发现组件,支持Hystrix、Sentinel等熔断限流工具。
二、快速入门:搭建一个网关服务
1. 添加依赖
<!--网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--负载均衡-->
<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-config</artifactId>
</dependency>
2. 配置路由规则(yaml)
spring:
cloud:
gateway:
routes:
- id: user-service # 路由ID
uri: lb://user-service # 目标服务地址(lb表示负载均衡)
predicates:
- Path=/api/user/** # 匹配路径,就是controller上的
filters:
- StripPrefix=1 # 去除前缀“/api/user”
3. 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
三、其它
1. 自定义全局过滤器(实现JWT认证)
@Component
public class AuthFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (StringUtils.isEmpty(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
// 验证Token合法性(伪代码)
if (!JwtUtil.validateToken(token)) {
exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
}
2. 集成Sentinel实现限流
spring:
cloud:
gateway:
routes:
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/order/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10 # 每秒10个令牌
redis-rate-limiter.burstCapacity: 20 # 令牌桶容量
key-resolver: "#{@userKeyResolver}" # 按用户限流
@Bean
KeyResolver userKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("userId"));
}