Spring Cloud网关
外观
Spring Cloud网关(Spring Cloud Gateway)是Spring Cloud生态系统中的一个核心组件,用于构建基于Spring Boot的API网关服务。它提供了一种高效、灵活的方式来路由请求、执行过滤操作(如认证、限流、日志记录等),并支持与微服务架构的无缝集成。
概述[编辑 | 编辑源代码]
Spring Cloud网关作为反向代理服务器,其主要功能包括:
- 动态路由:根据规则将请求转发到不同的微服务实例。
- 请求过滤:通过预定义的过滤器链对请求和响应进行处理。
- 负载均衡:集成Spring Cloud LoadBalancer实现服务实例的负载均衡。
- 断路器支持:与Resilience4j或Hystrix集成实现熔断机制。
网关的核心优势在于其非阻塞式Reactor编程模型(基于Project Reactor和Spring WebFlux),适合高并发场景。
核心概念[编辑 | 编辑源代码]
路由(Route)[编辑 | 编辑源代码]
路由是网关的基本构建块,包含以下属性:
- ID:唯一标识符。
- 目标URI:请求转发的目标地址。
- 断言(Predicate):匹配请求的条件(如路径、Header、方法等)。
- 过滤器(Filter):处理请求和响应的逻辑。
示例路由配置(YAML格式):
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service # 负载均衡目标服务
predicates:
- Path=/api/users/**
filters:
- StripPrefix=1 # 移除路径前缀/api
断言(Predicate)[编辑 | 编辑源代码]
断言用于定义请求的匹配规则。常用内置断言包括:
- `Path`:匹配URL路径(支持Ant风格和正则表达式)。
- `Method`:匹配HTTP方法(如GET、POST)。
- `Header`:检查请求头是否符合条件。
过滤器(Filter)[编辑 | 编辑源代码]
过滤器分为两类:
- 全局过滤器(Global Filter):作用于所有路由。
- 路由过滤器(Route Filter):仅作用于特定路由。
示例:添加请求头的自定义过滤器(Java代码):
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("test_route", r -> r.path("/test/**")
.filters(f -> f.addRequestHeader("X-Custom-Header", "gateway"))
.uri("http://localhost:8081"))
.build();
}
实际案例[编辑 | 编辑源代码]
场景:统一认证与授权[编辑 | 编辑源代码]
通过网关集中处理JWT验证,避免在每个微服务中重复实现: 1. 客户端发送请求至网关,携带`Authorization`头。 2. 网关使用全局过滤器验证JWT有效性。 3. 验证通过后,转发请求至目标服务。
代码示例(JWT验证过滤器):
public class JwtAuthenticationFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (token != null && validateToken(token)) {
return chain.filter(exchange);
}
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
}
场景:请求限流[编辑 | 编辑源代码]
使用Redis和RateLimiter实现接口限流:
spring:
cloud:
gateway:
routes:
- id: rate-limited-route
uri: http://backend-service
predicates:
- Path=/api/public/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10 # 每秒10个请求
redis-rate-limiter.burstCapacity: 20 # 峰值容量20
架构图[编辑 | 编辑源代码]
数学公式(限流算法)[编辑 | 编辑源代码]
令牌桶算法的速率计算公式:
总结[编辑 | 编辑源代码]
Spring Cloud网关是微服务架构中的关键组件,通过动态路由、过滤器和集成Spring Cloud生态功能,简化了API管理和安全控制。初学者可从基础路由配置入手,逐步掌握高级功能如自定义过滤器和限流策略。