一、核心配置结构总览
yaml
spring:
cloud:
gateway:
# 1. 全局配置
default-filters: []
globalcors: {}
httpclient: {}
metrics: {}
# 2. 路由配置
routes:
- id:
uri:
predicates: []
filters: []
metadata: {}
order: 0
# 3. 发现服务配置
discovery:
locator:
enabled: false
# 4. 路由定义存储
route:
locator:
cache:
enabled: true
二、全局配置详解
-
全局过滤器
yamlspring: cloud: gateway: default-filters: - AddRequestHeader=X-Request-Global, Global-Value - AddResponseHeader=X-Response-Global, Global-Value - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 10 redis-rate-limiter.burstCapacity: 20 key-resolver: "#{@ipKeyResolver}" -
全局CORS配置
yamlspring: cloud: gateway: globalcors: cors-configurations: '[/**]': allowed-origins: "https://example.com" allowed-methods: - GET - POST - PUT - DELETE - OPTIONS allowed-headers: - Content-Type - Authorization exposed-headers: - X-Custom-Header allow-credentials: true max-age: 3600 -
HTTP客户端配置
yamlspring: cloud: gateway: httpclient: # 连接池配置 pool: type: ELASTIC # 连接池类型: ELASTIC, FIXED max-connections: 1000 # 最大连接数 acquire-timeout: 45000 # 获取连接超时(ms) # SSL配置 ssl: use-insecure-trust-manager: false trusted-x509-certificates: [] handshake-timeout: 10000 close-notify-flush-timeout: 3000 close-notify-read-timeout: 0 # 代理配置 proxy: host: proxy.example.com port: 8080 username: user password: pass # 响应压缩 compression: true -
WebFlux配置
yamlspring: cloud: gateway: # WebFlux配置 httpclient: # 响应式客户端配置 response-timeout: 60s connect-timeout: 30s max-header-size: 65536 max-chunk-size: 65536 max-initial-line-length: 4096 # WebSocket支持 websocket: max-frame-payload-length: 65536 -
uri配置详解
yamluri: lb://user-service # 负载均衡到服务 uri: http://localhost:8080 # 直接URL uri: https://example.com # HTTPS地址 uri: ws://service:8080 # WebSocket
三、路由配置详解
-
完整路由定义
yamlspring: cloud: gateway: routes: - id: user-service-v1 uri: lb://user-service predicates: # 多重条件 - Path=/api/v1/users/** - Method=GET,POST - Header=X-API-Version, v1 - Query=type,internal - Cookie=session,.* - After=2024-01-01T00:00:00+08:00 - Weight=user-group, 80 filters: # 请求预处理 - StripPrefix=2 - PrefixPath=/internal - SetPath=/api/users/{segment} - RewritePath=/old/(?<path>.*), /new/$\{path} # 参数处理 - AddRequestParameter=key,value - AddRequestHeader=X-Request-Id,12345 - RemoveRequestHeader=Cookie # 响应处理 - AddResponseHeader=X-Response-Time,${took} - DedupeResponseHeader=Set-Cookie # 熔断降级 - name: CircuitBreaker args: name: userServiceCB fallbackUri: forward:/fallback/user statusCodes: - 500 - 502 - 503 # 重试机制 - name: Retry args: retries: 3 statuses: SERVICE_UNAVAILABLE methods: GET backoff: firstBackoff: 10ms maxBackoff: 50ms factor: 2 basedOnPreviousValue: false # 请求大小限制 - name: RequestSize args: maxSize: 5MB # 修改响应体 - name: ModifyResponseBody args: in-class: String out-class: String rewrite-function: "#{@modifyResponseBody}" metadata: # 自定义元数据 version: "1.0" timeout: 5000 connect-timeout: 3000 response-timeout: 10000 max-auto-retries-next-server: 2 max-auto-retries: 1 order: 1 -
断言工厂详细配置
Path断言:
yamlpredicates: - Path=/api/users/{id}/**, /api/orders/{segment}Header断言:
yamlpredicates: - name: Header args: header: X-Request-Id regexp: '\d+'自定义断言:
yamlpredicates: - name: Custom args: name: myCustomPredicate arg1: value1 arg2: value2 -
过滤器工厂详细配置
熔断器配置:
yamlfilters: - name: CircuitBreaker args: name: myCircuitBreaker fallbackUri: forward:/fallback statusCodes: - 500 - "BAD_GATEWAY" - "5xx" args: failureRateThreshold: 50 slowCallDurationThreshold: "2s" permittedNumberOfCallsInHalfOpenState: 10 slidingWindowSize: 100 minimumNumberOfCalls: 10 waitDurationInOpenState: "60s"限流配置:
yamlfilters: - name: RequestRateLimiter args: key-resolver: "#{@userKeyResolver}" rate-limiter: "#{@redisRateLimiter}" deny-empty-key: true empty-key-status: 403 # Redis限流器配置 @Bean public RedisRateLimiter redisRateLimiter() { return new RedisRateLimiter(10, 20, 1); }
四、发现服务配置
-
服务发现自动路由
yamlspring: cloud: gateway: discovery: locator: enabled: true lower-case-service-id: true predicates: - name: Path args: pattern: "'/service/'+serviceId.toLowerCase()+'/**'" filters: - name: RewritePath args: regexp: "'/service/' + serviceId.toLowerCase() + '/(?<remaining>.*)'" replacement: "'/${remaining}'" -
服务发现元数据路由
yamlspring: cloud: gateway: discovery: locator: enabled: true include-expression: metadata['version']=='v1' url-expression: "'http://'+serviceId.toLowerCase()+'.example.com'"
五、监控和指标配置
-
Micrometer指标
yamlmanagement: endpoints: web: exposure: include: health,info,gateway,metrics,prometheus metrics: tags: application: ${spring.application.name} spring: cloud: gateway: metrics: enabled: true # 自定义标签 tags: path: "${routeId}" method: "${request.method}" status: "${response.status}" -
跟踪配置
yamlspring: sleuth: gateway: enabled: true web: client: enabled: true zipkin: base-url: http://localhost:9411
六、安全配置
-
SSL/TLS配置
yamlserver: ssl: enabled: true key-store: classpath:keystore.p12 key-store-password: changeit key-store-type: PKCS12 key-alias: gateway key-password: changeit spring: cloud: gateway: httpclient: ssl: use-insecure-trust-manager: false handshake-timeout: 10000 -
安全头配置
yamlspring: cloud: gateway: default-filters: - name: SecureHeaders args: xss-protection-header: 1; mode=block strict-transport-security: max-age=31536000 ; includeSubDomains x-frame-options: DENY content-type-options: nosniff referrer-policy: no-referrer content-security-policy: default-src 'self'
七、缓存和性能优化
-
路由缓存配置
yamlspring: cloud: gateway: route: locator: cache: enabled: true initial-capacity: 100 maximum-size: 1000 ttl: 60s -
连接池优化
yamlspring: cloud: gateway: httpclient: pool: type: FIXED max-connections: 500 max-idle-time: 30s max-life-time: 60s pending-acquire-timeout: 60s pending-acquire-max-count: 1000 eviction-interval: 10s
八、完整配置示例
生产环境配置示例
yaml
spring:
application:
name: api-gateway
cloud:
gateway:
# 全局配置
default-filters:
- AddRequestHeader=X-Gateway-Request-ID, ${random.uuid}
- AddResponseHeader=X-Gateway-Response-Time, ${took}
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
# 全局CORS
globalcors:
cors-configurations:
'[/**]':
allowed-origins: "*"
allowed-methods: "*"
allowed-headers: "*"
max-age: 3600
# HTTP客户端配置
httpclient:
pool:
type: ELASTIC
max-connections: 1000
acquire-timeout: 45000
connect-timeout: 5000
response-timeout: 30000
compression: true
# 路由配置
routes:
- id: auth-service
uri: lb://auth-service
predicates:
- Path=/auth/**
- Method=POST
filters:
- StripPrefix=1
- name: RequestRateLimiter
args:
key-resolver: "#{@ipKeyResolver}"
redis-rate-limiter.replenishRate: 5
redis-rate-limiter.burstCapacity: 10
- CircuitBreaker=authService
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
- Header=X-API-Token, .+
filters:
- StripPrefix=2
- AddRequestHeader=X-Service-Version, v2
- Retry=3
- id: product-service
uri: lb://product-service
predicates:
- Path=/api/products/**
- Query=category
filters:
- StripPrefix=2
- SetStatus=401, POST
# 服务发现
discovery:
locator:
enabled: true
lower-case-service-id: true
# 指标
metrics:
enabled: true
# 监控端点
management:
endpoints:
web:
exposure:
include: health,info,gateway,metrics
metrics:
export:
prometheus:
enabled: true
endpoint:
health:
show-details: always
九、自定义配置扩展
-
自定义过滤器
java@Component public class CustomGlobalFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 前置处理 ServerHttpRequest request = exchange.getRequest().mutate() .header("X-Custom-Header", "custom-value") .build(); return chain.filter(exchange.mutate().request(request).build()) .then(Mono.fromRunnable(() -> { // 后置处理 Long startTime = exchange.getAttribute("startTime"); if (startTime != null) { Long endTime = System.currentTimeMillis(); System.out.println("请求耗时: " + (endTime - startTime) + "ms"); } })); } @Override public int getOrder() { return -1; } } -
自定义断言工厂
java@Component public class CustomRoutePredicateFactory extends AbstractRoutePredicateFactory<CustomRoutePredicateFactory.Config> { public CustomRoutePredicateFactory() { super(Config.class); } @Override public Predicate<ServerWebExchange> apply(Config config) { return exchange -> { // 自定义断言逻辑 return config.getValue().equals(exchange.getRequest().getHeaders().getFirst("X-Custom")); }; } public static class Config { private String value; // getters and setters } }
十、配置优化建议
-
性能调优:
- 根据负载调整连接池大小
- 启用响应压缩
- 合理设置超时时间
-
高可用:
- 配置多个相同服务实例
- 设置合理的熔断和重试策略
- 启用健康检查
-
安全性:
- 启用HTTPS
- 配置安全响应头
- 实施API限流
-
可观测性:
- 启用指标收集
- 集成分布式跟踪
- 配置详细日志