【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使用详解

相关推荐
等等5431 小时前
Java EE初阶——定时器和线程池
java·java-ee
IDRSolutions_CN2 小时前
如何在Java中处理PDF文档(教程)
java·经验分享·pdf·软件工程·团队开发
忘了ʷºᵇₐ5 小时前
MapReduce-WordCount实现按照value降序排序、字符小写、识别不同标点
java·大数据·linux·intellij-idea·mapreduce
看到我,请让我去学习6 小时前
数据结构—排序(斐波那契数列,冒泡,选择,插入,快速,归并,图,广度优先算法)
c语言·开发语言·数据结构·后端
jian110586 小时前
java spring -framework -mvc
java·spring·mvc
程序员Bears6 小时前
JSP与JSTL:EL表达式与MVC分层模式的完美结合
java·开发语言·mvc
自我意识的多元宇宙7 小时前
Java List 接口知识点详解
java·开发语言
zhangxzq7 小时前
JVM 性能问题排查实战10连击
java·运维·jvm·经验分享·docker
linux-hzh7 小时前
第二章 Java语言基础
java·开发语言
qq_214225877 小时前
深入解析 Java GC 调优:减少 Minor GC 频率,优化系统吞吐
java·jvm·其他·性能优化