Spring Cloud Gateway 网关
TIP
Spring Cloud Gateway 是一个基于 Spring WebFlux 的 API 网关,提供路由、过滤、鉴权、限流等功能。
核心概念
| 概念 | 说明 |
|---|---|
| Route(路由) | 网关的基本构建块,包含 ID、目标 URI、断言和过滤器 |
| Predicate(断言) | 匹配 HTTP 请求的条件 |
| Filter(过滤器) | 对请求和响应进行修改的拦截器 |
引入依赖
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 注意:不要引入 spring-boot-starter-web,会冲突 -->路由配置
yaml
spring:
cloud:
gateway:
routes:
# 用户服务路由
- id: user-service
uri: lb://user-service
predicates:
- Path=/user/**
filters:
- StripPrefix=0
- name: RequestRateLimiter
args:
key-resolver: "#{@userKeyResolver}"
redis-rate-limiter.replenishRate: 100
redis-rate-limiter.burstCapacity: 200
# 订单服务路由
- id: order-service
uri: lb://order-service
predicates:
- Path=/order/**
filters:
- StripPrefix=0全局过滤器
java
@Component
@Order(-1) // 优先级
public class AuthGlobalFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String path = request.getURI().getPath();
// 白名单路径跳过鉴权
if (path.contains("/auth/login") || path.contains("/auth/register")) {
return chain.filter(exchange);
}
// 获取 Token
String token = request.getHeaders().getFirst("Authorization");
if (token == null || !token.startsWith("Bearer ")) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
// 鉴通过,继续路由
return chain.filter(exchange);
}
}自定义过滤器
java
@Component
public class LoggingGatewayFilterFactory
extends AbstractGatewayFilterFactory<LoggingGatewayFilterFactory.Config> {
public LoggingGatewayFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
long start = System.currentTimeMillis();
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
long duration = System.currentTimeMillis() - start;
System.out.println("Request: " + exchange.getRequest().getURI()
+ " took " + duration + "ms");
}));
};
}
@Data
public static class Config {
private boolean enableLog = true;
}
}限流
java
@Bean
public KeyResolver userKeyResolver() {
return exchange -> Mono.just(
exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()
);
}TIP
Gateway 基于 WebFlux 响应式编程,天然支持高并发。注意不要在过滤器中使用阻塞操作。