【springboot知识】配置方式实现SpringCloudGateway相关功能

配置方式实现SpringCloudGateway相关功能

  • [Spring Cloud Gateway 核心功能与实战实现指南](#Spring Cloud Gateway 核心功能与实战实现指南)
    • 一、核心功能架构
    • 二、六大核心功能实现
      • [1. 动态路由配置](#1. 动态路由配置)
      • [2. 断言(Predicate)配置](#2. 断言(Predicate)配置)
      • [3. 过滤器(Filter)配置](#3. 过滤器(Filter)配置)
      • [4. 负载均衡配置](#4. 负载均衡配置)
      • [5. 熔断降级配置](#5. 熔断降级配置)
      • [6. 限流配置](#6. 限流配置)
    • 三、高级配置技巧
      • [1. 跨域配置](#1. 跨域配置)
      • [2. 重试机制](#2. 重试机制)
      • [3. 请求/响应修改](#3. 请求/响应修改)
    • 四、监控与调试
      • [1. Actuator端点配置](#1. Actuator端点配置)
      • [2. 日志记录配置](#2. 日志记录配置)
    • 五、安全最佳实践
      • [1. JWT验证过滤器](#1. JWT验证过滤器)
      • [2. 敏感头过滤](#2. 敏感头过滤)
    • 关联知识

Spring Cloud Gateway 核心功能与实战实现指南

一、核心功能架构

客户端请求 路由匹配 过滤器链 负载均衡 服务实例

二、六大核心功能实现

1. 动态路由配置

application.yml 配置示例

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        ▪ id: user-service

          uri: lb://user-service  # 服务注册中心名称
          predicates:
            ▪ Path=/api/users/**

          filters:
            ▪ StripPrefix=1  # 去掉/api前缀

代码增强(Java DSL方式)

java 复制代码
@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)配置

常用断言类型

yaml 复制代码
routes:
  • id: time-route

    uri: http://example.org
    predicates:
      ◦ After=2023-01-20T17:42:47.789-07:00[America/Denver]  # 时间断言

      ◦ Header=X-Request-Id, \d+  # 请求头正则匹配

      ◦ Method=GET,POST  # HTTP方法

      ◦ Query=name, .+  # 查询参数

自定义断言实现

java 复制代码
public class CustomPredicate implements RoutePredicateFactory<Config> {
    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return exchange -> {
            // 实现自定义逻辑
            return exchange.getRequest().getHeaders().containsKey("X-Special");
        };
    }
}

3. 过滤器(Filter)配置

内置过滤器示例

yaml 复制代码
filters:
  • AddRequestHeader=X-Request-color, blue  # 添加请求头

  • AddResponseHeader=X-Response-Rate, 1000  # 添加响应头

  • Retry=3  # 重试机制

  • CircuitBreaker=myCircuitBreaker  # 熔断器

自定义全局过滤器

java 复制代码
@Component
public class AuthFilter implements GlobalFilter, Ordered {
    @Override
    public 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);
    }

    @Override
    public int getOrder() {
        return -1;  // 执行顺序
    }
}

4. 负载均衡配置

自动集成负载均衡

yaml 复制代码
spring:
  cloud:
    loadbalancer:
      ribbon:
        enabled: true
    gateway:
      routes:
        ▪ id: product-service

          uri: lb://product-service  # lb://表示启用负载均衡
          predicates:
            ▪ Path=/products/**

5. 熔断降级配置

Resilience4J熔断配置

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        ▪ id: inventory-service

          uri: lb://inventory-service
          predicates:
            ▪ Path=/inventory/**

          filters:
            ▪ name: CircuitBreaker

              args:
                name: inventoryCB
                fallbackUri: forward:/fallback/inventory
                statusCodes: 500,503

Fallback控制器

java 复制代码
@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令牌桶限流

yaml 复制代码
spring:
  redis:
    host: localhost
  cloud:
    gateway:
      routes:
        ▪ id: order-service

          uri: lb://order-service
          predicates:
            ▪ Path=/orders/**

          filters:
            ▪ name: RequestRateLimiter

              args:
                redis-rate-limiter.replenishRate: 10  # 每秒10个令牌
                redis-rate-limiter.burstCapacity: 20  # 桶容量
                key-resolver: "#{@userKeyResolver}"  # SpEL表达式

Key解析器实现

java 复制代码
@Bean
KeyResolver userKeyResolver() {
    return exchange -> Mono.just(
        exchange.getRequest().getQueryParams().getFirst("userId")
    );
}

三、高级配置技巧

1. 跨域配置

yaml 复制代码
spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "*"
            allowedMethods:
              ▪ GET

              ▪ POST

              ▪ PUT

            allowedHeaders:
              ▪ Content-Type

2. 重试机制

yaml 复制代码
filters:
  • name: Retry

    args:
      retries: 3
      statuses: BAD_GATEWAY,INTERNAL_SERVER_ERROR
      methods: GET,POST
      backoff:
        firstBackoff: 10ms
        maxBackoff: 100ms
        factor: 2

3. 请求/响应修改

yaml 复制代码
filters:
  • RewritePath=/api/v1/(?<segment>.*), /$\{segment}  # 路径重写

  • SetRequestHeader=X-Request-From, Gateway  # 设置请求头

  • RemoveResponseHeader=Server  # 移除响应头

四、监控与调试

1. Actuator端点配置

yaml 复制代码
management:
  endpoints:
    web:
      exposure:
        include: gateway
  endpoint:
    gateway:
      enabled: true

访问端点:

  • /actuator/gateway/routes - 查看所有路由
  • /actuator/gateway/globalfilters - 查看全局过滤器
  • /actuator/gateway/routefilters - 查看路由过滤器

2. 日志记录配置

yaml 复制代码
logging:
  level:
    org.springframework.cloud.gateway: DEBUG
    reactor.netty.http.client: DEBUG

五、安全最佳实践

1. JWT验证过滤器

java 复制代码
public class JwtFilter implements GlobalFilter {
    @Override
    public 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. 敏感头过滤

yaml 复制代码
spring:
  cloud:
    gateway:
      default-filters:
        ▪ RemoveRequestHeader=Cookie,Set-Cookie  # 禁止传递Cookie

通过以上配置和代码示例,您可以快速搭建具备完整功能的API网关。建议根据实际业务需求组合不同的路由策略和过滤器链。

关联知识

【Spring知识】Spring cloud gateway使用详解

相关推荐
红烧柯基2 小时前
解决redis序列号和反序列化问题
java·数据库·redis
KAI_KD3 小时前
自定义JackSon配置
java
运维@小兵3 小时前
SpringBoot获取用户信息常见问题(密码屏蔽、驼峰命名和下划线命名的自动转换)
java·spring boot·后端
新时代苦力工3 小时前
Java实现使用EasyExcel按模板导出文件
java
小陈093 小时前
Java后端图形验证码的使用
java·开发语言·状态模式
27669582923 小时前
得物 小程序 6宫格 分析
java·python·小程序·得物·得物小程序·得物六宫格·六宫格验证码
知了一笑3 小时前
通过IP计算分析归属地
java·ip·ip定位·ip计算
沃野_juededa3 小时前
uniapp自定义选项卡
java·前端·javascript
樽酒ﻬق4 小时前
打造美观 API 文档:Spring Boot + Swagger 实战指南
java·spring boot·后端