spring-gateway配置详解

一、核心配置结构总览

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

二、全局配置详解

  1. 全局过滤器

    yaml 复制代码
    spring:
      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}"
  2. 全局CORS配置

    yaml 复制代码
    spring:
      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
  3. HTTP客户端配置

    yaml 复制代码
    spring:
      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
  4. WebFlux配置

    yaml 复制代码
    spring:
      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
  5. uri配置详解

    yaml 复制代码
    uri: lb://user-service       # 负载均衡到服务
    uri: http://localhost:8080   # 直接URL
    uri: https://example.com     # HTTPS地址
    uri: ws://service:8080       # WebSocket

三、路由配置详解

  1. 完整路由定义

    yaml 复制代码
    spring:
      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
  2. 断言工厂详细配置

    Path断言:

    yaml 复制代码
    predicates:
      - Path=/api/users/{id}/**, /api/orders/{segment}

    Header断言:

    yaml 复制代码
    predicates:
      - name: Header
        args:
          header: X-Request-Id
          regexp: '\d+'

    自定义断言:

    yaml 复制代码
    predicates:
      - name: Custom
        args:
          name: myCustomPredicate
          arg1: value1
          arg2: value2
  3. 过滤器工厂详细配置

    熔断器配置:

    yaml 复制代码
    filters:
      - 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"

    限流配置:

    yaml 复制代码
    filters:
      - 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);
    }

四、发现服务配置

  1. 服务发现自动路由

    yaml 复制代码
    spring:
      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}'"
  2. 服务发现元数据路由

    yaml 复制代码
    spring:
      cloud:
        gateway:
          discovery:
            locator:
              enabled: true
              include-expression: metadata['version']=='v1'
              url-expression: "'http://'+serviceId.toLowerCase()+'.example.com'"

五、监控和指标配置

  1. Micrometer指标

    yaml 复制代码
    management:
      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}"
  2. 跟踪配置

    yaml 复制代码
    spring:
      sleuth:
        gateway:
          enabled: true
        web:
          client:
            enabled: true
            
      zipkin:
        base-url: http://localhost:9411

六、安全配置

  1. SSL/TLS配置

    yaml 复制代码
    server:
      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
  2. 安全头配置

    yaml 复制代码
    spring:
      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'

七、缓存和性能优化

  1. 路由缓存配置

    yaml 复制代码
    spring:
      cloud:
        gateway:
          route:
            locator:
              cache:
                enabled: true
                initial-capacity: 100
                maximum-size: 1000
                ttl: 60s
  2. 连接池优化

    yaml 复制代码
    spring:
      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

九、自定义配置扩展

  1. 自定义过滤器

    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;
        }
    }
  2. 自定义断言工厂

    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限流
  • 可观测性:

    • 启用指标收集
    • 集成分布式跟踪
    • 配置详细日志
相关推荐
虹科网络安全5 小时前
艾体宝洞察 | Redis vs Valkey:解决 ElastiCache 的无序扩张与资源效率问题
数据库·redis·spring
此剑之势丶愈斩愈烈7 小时前
Spring获取URL信息
java·后端·spring
关于不上作者榜就原神启动那件事8 小时前
Spring Data Redis 使用详解
java·redis·spring
海南java第二人8 小时前
Spring事务传播行为完全指南:从原理到实战
spring
程序猿零零漆8 小时前
Spring之旅 - 记录学习 Spring 框架的过程和经验(一)BeanFactory和ApplicationContext入门和关系
java·学习·spring
Ahuuua9 小时前
Spring 事务传播行为详解
数据库·sql·spring
武子康9 小时前
Java-210 Spring AMQP 整合 RabbitMQ:JavaConfig 注解配置、RabbitTemplate 发送/同步接收与坑位速查
xml·java·spring·消息队列·rabbitmq·java-rabbitmq·mq
廋到被风吹走9 小时前
【Spring】ThreadLocal详解 线程隔离的魔法与陷阱
java·spring·wpf
古城小栈9 小时前
Java 响应式编程:Spring WebFlux+Reactor 实战
java·开发语言·spring