配置方式實現SpringCloudGateway相關功能
- Spring Cloud Gateway 核心功能與實戰實現指南
- 一、核心功能架構
- 二、六大核心功能實現
- 1. 動態路由配置
- 2. 斷言(Predicate)配置
- 3. 過濾器(Filter)配置
- 4. 負載均衡配置
- 5. 熔斷降級配置
- 6. 限流配置
- 三、高級配置技巧
- 1. 跨域配置
- 2. 重試機制
- 3. 請求/響應修改
- 四、監控與調試
- 1. Actuator端點配置
- 2. 日志記錄配置
- 五、安全最佳實踐
- 1. JWT驗證過濾器
- 2. 敏感頭過濾
- 關聯知識
Spring Cloud Gateway 核心功能與實戰實現指南
一、核心功能架構
二、六大核心功能實現
1. 動態路由配置
application.yml 配置示例:
spring:cloud:gateway:routes:? id: user-serviceuri: lb://user-service # 服務注冊中心名稱predicates:? Path=/api/users/**filters:? StripPrefix=1 # 去掉/api前綴
代碼增強(Java DSL方式):
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("auth-service", r -> r.path("/auth/**").filters(f -> f.rewritePath("/auth/(?<segment>.*)", "/${segment}")).uri("lb://auth-service")).build();
}
2. 斷言(Predicate)配置
常用斷言類型:
routes:? id: time-routeuri: http://example.orgpredicates:? After=2023-01-20T17:42:47.789-07:00[America/Denver] # 時間斷言? Header=X-Request-Id, \d+ # 請求頭正則匹配? Method=GET,POST # HTTP方法? Query=name, .+ # 查詢參數
自定義斷言實現:
public class CustomPredicate implements RoutePredicateFactory<Config> {@Overridepublic Predicate<ServerWebExchange> apply(Config config) {return exchange -> {// 實現自定義邏輯return exchange.getRequest().getHeaders().containsKey("X-Special");};}
}
3. 過濾器(Filter)配置
內置過濾器示例:
filters:? AddRequestHeader=X-Request-color, blue # 添加請求頭? AddResponseHeader=X-Response-Rate, 1000 # 添加響應頭? Retry=3 # 重試機制? CircuitBreaker=myCircuitBreaker # 熔斷器
自定義全局過濾器:
@Component
public class AuthFilter implements GlobalFilter, Ordered {@Overridepublic 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);}@Overridepublic int getOrder() {return -1; // 執行順序}
}
4. 負載均衡配置
自動集成負載均衡:
spring:cloud:loadbalancer:ribbon:enabled: truegateway:routes:? id: product-serviceuri: lb://product-service # lb://表示啟用負載均衡predicates:? Path=/products/**
5. 熔斷降級配置
Resilience4J熔斷配置:
spring:cloud:gateway:routes:? id: inventory-serviceuri: lb://inventory-servicepredicates:? Path=/inventory/**filters:? name: CircuitBreakerargs:name: inventoryCBfallbackUri: forward:/fallback/inventorystatusCodes: 500,503
Fallback控制器:
@RestController
public class FallbackController {@GetMapping("/fallback/inventory")public Mono<Map<String, Object>> inventoryFallback() {return Mono.just(Map.of("status", 503,"message", "服務暫時不可用","timestamp", Instant.now()));}
}
6. 限流配置
Redis令牌桶限流:
spring:redis:host: localhostcloud:gateway:routes:? id: order-serviceuri: lb://order-servicepredicates:? Path=/orders/**filters:? name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10 # 每秒10個令牌redis-rate-limiter.burstCapacity: 20 # 桶容量key-resolver: "#{@userKeyResolver}" # SpEL表達式
Key解析器實現:
@Bean
KeyResolver userKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("userId"));
}
三、高級配置技巧
1. 跨域配置
spring:cloud:gateway:globalcors:cors-configurations:'[/**]':allowedOrigins: "*"allowedMethods:? GET? POST? PUTallowedHeaders:? Content-Type
2. 重試機制
filters:? name: Retryargs:retries: 3statuses: BAD_GATEWAY,INTERNAL_SERVER_ERRORmethods: GET,POSTbackoff:firstBackoff: 10msmaxBackoff: 100msfactor: 2
3. 請求/響應修改
filters:? RewritePath=/api/v1/(?<segment>.*), /$\{segment} # 路徑重寫? SetRequestHeader=X-Request-From, Gateway # 設置請求頭? RemoveResponseHeader=Server # 移除響應頭
四、監控與調試
1. Actuator端點配置
management:endpoints:web:exposure:include: gatewayendpoint:gateway:enabled: true
訪問端點:
/actuator/gateway/routes
- 查看所有路由/actuator/gateway/globalfilters
- 查看全局過濾器/actuator/gateway/routefilters
- 查看路由過濾器
2. 日志記錄配置
logging:level:org.springframework.cloud.gateway: DEBUGreactor.netty.http.client: DEBUG
五、安全最佳實踐
1. JWT驗證過濾器
public class JwtFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token = exchange.getRequest().getHeaders().getFirst("Authorization");if (token != null && JwtUtil.validateToken(token)) {String username = JwtUtil.getUsernameFromToken(token);exchange.getRequest().mutate().header("X-User-Name", username).build();return chain.filter(exchange);}exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}
}
2. 敏感頭過濾
spring:cloud:gateway:default-filters:? RemoveRequestHeader=Cookie,Set-Cookie # 禁止傳遞Cookie
通過以上配置和代碼示例,您可以快速搭建具備完整功能的API網關。建議根據實際業務需求組合不同的路由策略和過濾器鏈。
關聯知識
【Spring知識】Spring cloud gateway使用詳解