一、动态路由(基于配置中心或数据库)
✅ 实现方式
- 定义路由实体类:
java
@Data
public class GatewayRouteDefinition {
private String id;
private String uri;
private List<GatewayPredicateDefinition> predicates;
private List<GatewayFilterDefinition> filters;
}
- 自定义 RouteDefinitionLocator:
java
@Component
public class DynamicRouteLocator implements RouteDefinitionLocator {
@Override
public Flux<RouteDefinition> getRouteDefinitions() {
List<RouteDefinition> definitions = loadFromDBOrNacos(); // 加载数据
return Flux.fromIterable(definitions);
}
}
- 监听配置变更并刷新路由:
java
@Autowired
private ApplicationEventPublisher publisher;
public void refreshRoutes() {
publisher.publishEvent(new RefreshRoutesEvent(this));
}
二、请求日志记录(全链路日志 + 请求响应日志)
✅ 实现方式
- 定义全局过滤器 GlobalFilter:
java
@Component
public class LoggingGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String traceId = UUID.randomUUID().toString();
log.info("Incoming request: {}, traceId={}", exchange.getRequest().getURI(), traceId);
return chain.filter(exchange).then(Mono.fromRunnable(() ->
log.info("Response completed: traceId={}", traceId)
));
}
@Override
public int getOrder() {
return -1;
}
}
- 日志采集整合链路追踪系统(如 Sleuth + Zipkin)
yaml
spring:
sleuth:
sampler:
probability: 1.0
三、限流(基于 Redis + Token Bucket)
✅ Redis 限流实现方式
使用 RequestRateLimiterGatewayFilterFactory
:
yaml
spring:
cloud:
gateway:
routes:
- id: limited_route
uri: http://example.org
predicates:
- Path=/api/hello
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
✅ 自定义限流策略(IP维度)
java
@Component
public class IpKeyResolver implements KeyResolver {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(exchange.getRequest()
.getRemoteAddress().getAddress().getHostAddress());
}
}
四、灰度发布(Header 路由/版本控制)
✅ 基于请求 Header 的灰度路由
yaml
spring:
cloud:
gateway:
routes:
- id: gray_route
uri: http://gray-service
predicates:
- Header=version, v2
✅ 动态实现(版本匹配 + 权重控制)
java
@Component
public class GrayReleaseFilter implements GatewayFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String version = exchange.getRequest().getHeaders().getFirst("version");
if ("v2".equals(version)) {
// 重定向到新版服务
}
return chain.filter(exchange);
}
}
📌 总结
功能模块 | 核心技术点 | 建议方式 |
---|---|---|
动态路由 | RouteDefinitionLocator + 配置中心 | 推荐数据库 + 热刷新 |
请求日志 | 全局过滤器 + 链路追踪 | 推荐集成 Sleuth |
限流 | Redis 限流 + IP KeyResolver | 推荐统一限流组件 |
灰度发布 | Header/权重控制 + 路由分发 | 可结合配置中心控制 |