Gateway路由配置实战前言Spring Cloud Gateway是Spring官方提供的API网关基于响应式编程性能优异。本文将详细介绍Gateway的路由配置、过滤器使用和最佳实践。一、快速集成1.1 依赖配置dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-gateway/artifactId /dependency dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-loadbalancer/artifactId /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency1.2 基础配置server: port: 8080 spring: application: name: gateway cloud: nacos: discovery: server-addr: ${NACOS_SERVER:localhost:8848} gateway: discovery: locator: enabled: true lower-case-service-id: true filters: - name: CircuitBreaker args: name: myCircuitBreaker fallbackUri: forward:/fallback routes: - id: order-service uri: lb://order-service predicates: - Path/order/** filters: - StripPrefix1 - id: product-service uri: lb://product-service predicates: - Path/product/** filters: - StripPrefix1 - id: user-service uri: lb://user-service predicates: - Path/user/** filters: - StripPrefix1二、路由配置2.1 静态路由spring: cloud: gateway: routes: - id: api-route uri: http://api.example.com predicates: - Hostapi.example.com - Path/v1/** filters: - RewritePath/v1(?segment/?.*), $\{segment}2.2 动态路由spring: cloud: nacos: discovery: enabled: true gateway: discovery: locator: enabled: true lower-case-service-id: true2.3 条件路由spring: cloud: gateway: routes: - id: header-route uri: lb://order-service predicates: - HeaderX-User-Version, v2\\d - id: weight-route uri: lb://order-service-v2 predicates: - Weightgroup1, 10三、过滤器3.1 内置过滤器spring: cloud: gateway: default-filters: - DedupeResponseHeaderVary Access-Control-Allow-Origin Access-Control-Allow-Credentials - RequestSize5M routes: - id: add-headers-route uri: lb://order-service filters: - AddRequestHeaderX-Request-First, first - AddRequestHeaderX-Request-Second, second - AddResponseHeaderX-Response-First, first - RemoveRequestHeaderX-Forwarded-For - SetStatus2003.2 自定义过滤器Component Slf4j public class LoggingFilter implements GlobalFilter, Ordered { Override public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request exchange.getRequest(); String path request.getPath().value(); String method request.getMethod().name(); String traceId request.getHeaders().getFirst(X-Trace-Id); log.info(Gateway request: {} {} traceId{}, method, path, traceId); long startTime System.currentTimeMillis(); return chain.filter(exchange) .then(Mono.fromRunnable(() - { long duration System.currentTimeMillis() - startTime; log.info(Gateway response: {} {} status{} duration{}ms, method, path, exchange.getResponse().getStatusCode(), duration); })); } Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE; } }四、安全配置4.1 认证过滤器Component public class AuthenticationFilter implements GlobalFilter { Autowired private JwtTokenProvider tokenProvider; Override public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { String path exchange.getRequest().getPath().value(); if (isPublicPath(path)) { return chain.filter(exchange); } String token extractToken(exchange.getRequest()); if (token null || !tokenProvider.validateToken(token)) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } // 添加用户信息到请求头 ServerHttpRequest mutatedRequest exchange.getRequest() .mutate() .header(X-User-Id, tokenProvider.getUserId(token)) .build(); return chain.filter( exchange.mutate().request(mutatedRequest).build()); } private boolean isPublicPath(String path) { return path.startsWith(/api/auth/) || path.startsWith(/api/public/); } private String extractToken(ServerHttpRequest request) { String bearerToken request.getHeaders() .getFirst(HttpHeaders.AUTHORIZATION); if (StringUtils.hasText(bearerToken) bearerToken.startsWith(Bearer )) { return bearerToken.substring(7); } return null; } }五、总结Spring Cloud Gateway提供了强大的路由和过滤能力是构建API网关的优秀选择。通过与Nacos的集成可以实现动态路由和负载均衡。