1. 为什么需要API网关
在微服务架构中,随着服务数量的增加,直接暴露所有服务端点会带来诸多问题。想象一下,一个电商系统可能有用户服务、商品服务、订单服务、支付服务等数十个微服务,如果客户端需要直接与每个服务通信,将面临以下挑战:
- 客户端需要维护大量服务地址
- 每个服务都需要实现鉴权、限流等重复功能
- 难以统一监控和管理API调用
- 服务版本升级时客户端需要同步修改
Spring Cloud Gateway正是为解决这些问题而生的API网关实现。它就像微服务架构的"前台接待",所有外部请求先经过网关,由网关负责路由转发、权限校验、流量控制等横切关注点(cross-cutting concerns)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心架构解析
2.1 三大核心概念
路由(Route):网关的基本构建块,包含ID、目标URI、谓词集合和过滤器集合。例如:
yaml复制routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- StripPrefix=2
谓词(Predicate):Java 8的Predicate,用于匹配HTTP请求的各种属性(路径、方法、头等)。常用谓词包括:
- Path:路径匹配
- Method:HTTP方法匹配
- Header:请求头匹配
- Query:查询参数匹配
过滤器(Filter):可以修改请求和响应的工厂类,分为:
- GatewayFilter:作用于单个路由
- GlobalFilter:全局生效,对所有路由有效
2.2 请求处理流程
- 网关接收客户端请求
- 遍历所有路由的谓词,找到第一个匹配的路由
- 执行该路由关联的过滤器链(pre过滤器)
- 代理请求到目标服务
- 收到响应后执行post过滤器
- 将最终响应返回客户端
提示:过滤器执行顺序由
Order注解或getOrder()方法决定,值越小优先级越高
3. 实战配置指南
3.1 基础项目搭建
- 创建Spring Boot项目,添加依赖:
xml复制<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 启用服务发现(如使用Eureka):
yaml复制spring:
cloud:
gateway:
discovery:
locator:
enabled: true
lower-case-service-id: true
- 配置路由规则(YAML方式示例):
yaml复制spring:
cloud:
gateway:
routes:
- id: product-service
uri: lb://product-service
predicates:
- Path=/api/products/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
3.2 自定义过滤器开发
实现全局鉴权过滤器示例:
java复制@Component
public class AuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest()
.getHeaders()
.getFirst("Authorization");
if(!validateToken(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -1; // 高优先级
}
}
4. 高级功能实现
4.1 动态路由配置
默认静态配置无法满足生产环境需求,可通过以下方式实现动态路由:
- 基于数据库的动态路由:
java复制@RefreshScope
@Configuration
public class RouteConfig {
@Autowired
private RouteRepository routeRepository;
@Bean
public RouteLocator dynamicRouteLocator(RouteDefinitionLocator locator) {
return new
