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

相关推荐
IT_陈寒5 分钟前
Vite 5个隐藏技巧让你的项目构建速度提升50%,第3个太香了!
前端·人工智能·后端
用户4099322502127 分钟前
复杂查询总拖后腿?PostgreSQL多列索引+覆盖索引的神仙技巧你get没?
后端·ai编程·trae
孤廖8 分钟前
吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比
java·开发语言·数据结构·c++·人工智能·深度学习·算法
我命由我1234511 分钟前
Android 对话框 - 对话框全屏显示(设置 Window 属性、使用自定义样式、继承 DialogFragment 实现、继承 Dialog 实现)
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
Full Stack Developme21 分钟前
java.net 包详解
java·python·.net
一叶飘零_sweeeet39 分钟前
深入 Spring 内核:解密 15 种设计模式的实战应用与底层实现
java·spring·设计模式
凤山老林43 分钟前
排序算法:详解插入排序
java·开发语言·后端·算法·排序算法
彦楠1 小时前
IDEA实用快捷键
java·ide·intellij-idea
豆沙沙包?1 小时前
2025年--Lc197-077. 排序链表(链表,尾插法)--Java版
java·数据结构·链表
m0_651593911 小时前
深入理解软件设计中的协议与规范:从理论到Java实践
java·软件工程·代码规范·设计规范