Spring Cloud Gateway 详解,包含:配置路由规则(Routes)、提供过滤器(Filter)、Gateway所有的过滤器工厂、使用Sentinel管控Gateway

06-01 1251阅读

Spring Cloud Gateway 详解

Spring Cloud Gateway 详解,包含:配置路由规则(Routes)、提供过滤器(Filter)、Gateway所有的过滤器工厂、使用Sentinel管控Gateway

Spring Cloud Gateway 详解,包含:配置路由规则(Routes)、提供过滤器(Filter)、Gateway所有的过滤器工厂、使用Sentinel管控Gateway


1. Spring Cloud Gateway 安装与配置

(1) 依赖管理

    org.springframework.cloud
    spring-cloud-starter-gateway



    org.springframework.cloud
    spring-cloud-starter-alibaba-sentinel

(2) 启动类配置
@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

2. 核心配置文件与注解详解

(1) 核心配置项(application.yml)
spring:
  cloud:
    gateway:
      routes:
        - id: user-service  # 路由ID
          uri: lb://user-service  # 目标服务(负载均衡)
          predicates:
            - Path=/users/**  # 路由条件:匹配/users路径
          filters:
            - StripPrefix=1  # 去除路径前缀/users
            - AddRequestHeader=X-Request-Id, "12345"  # 添加请求头
      globalcors: # 全局CORS配置
        allowed-origins: "http://localhost:3000"
    sentinel:
      enabled: true  # 启用Sentinel集成

3. Gateway 工作原理

核心流程
  1. 路由匹配:根据请求URL、Header等条件匹配路由规则。
  2. 过滤器执行:在请求/响应阶段执行预定义的过滤器(如限流、日志)。
  3. 转发请求:将请求转发到目标服务(URI)。
  4. 响应处理:返回响应给客户端。

4. 路由规则配置

(1) YAML配置示例
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/users/**
            - Method=GET  # 仅匹配GET方法
          filters:
            - AddRequestParameter=traceId, "GATEWAY-TRACE-123"
        - id: admin-service
          uri: http://localhost:8081
          predicates:
            - Query=admin  # 匹配包含?admin参数的请求
(2) Java配置示例
@Configuration
public class GatewayConfig {
    @Bean
    public RouteLocator customRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("user-service", r -> r.path("/users/**")
                .uri("lb://user-service")
                .filters(f -> f.stripPrefix(1)
                    .addRequestHeader("X-Gateway", "Enabled"))
            )
            .build();
    }
}

5. 过滤器工厂(Filter Factories)

内置常用过滤器工厂
过滤器工厂功能参数示例
AddRequestHeader添加请求头X-Request-Id, "12345"
AddRequestParameter添加请求参数traceId, "GATEWAY-TRACE"
ModifyResponseBody修改响应体(需指定转换器,如Jackson2JsonConverter)*, org.springframework.cloud.gateway.filter.factory.RemoveResponseHeaderFilter
RequestRateLimiter限流(需配置限流策略)key-resolver: SpringCloud维恩KeyResolver
RewritePath重写路径(正则匹配)/users/\\d+/?(.*), “/$1”

6. 使用 Sentinel 管控 Gateway

(1) 依赖与配置
 
(2) Sentinel规则配置
@Configuration
public class SentinelGatewayConfig {
    @Bean
    public SentinelGatewayFilterFactory sentinelGatewayFilterFactory() {
        return new SentinelGatewayFilterFactory();
    }
    @Bean
    public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
        return new SentinelGatewayBlockExceptionHandler();
    }
}
(3) 在路由中集成Sentinel限流
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/users/**
          filters:
            - name: Sentinel  # 应用Sentinel过滤器
              args:
                resources: user-service  # 资源名
                entryType: INCOME       # 入口类型
(4) 控制台配置限流规则
  1. 在Sentinel控制台为资源user-service配置流控规则:
    • Metric Type:QPS
    • Count:10(每秒最大请求量)
    • Grade:直接拒绝

7. 完整代码示例

(1) 定义路由与过滤器
@Configuration
public class GatewayConfig {
    @Bean
    public RouteLocator customRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
            // 基础路由
            .route("user-service", r -> r.path("/users/**")
                .uri("lb://user-service")
                .filters(f -> f.stripPrefix(1)
                    .addRequestHeader("X-Gateway", "Enabled")
                    .addRequestParameter("traceId", "GATEWAY-TRACE"))
            )
            // Sentinel限流路由
            .route("admin-service", r -> r.path("/admin/**")
                .uri("lb://admin-service")
                .filters(f -> f.sentinel()
                    .arg("resource", "admin-service")
                    .arg("entryType", "IN"))
            )
            .build();
    }
}
(2) 自定义过滤器工厂
@Component
public class TraceIdFilter implements GlobalFilter, Ordered {
    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String traceId = UUID.randomUUID().toString();
        exchange.getRequest().mutate().header("X-Trace-Id", traceId).build();
        return chain.filter(exchange);
    }
    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
}
(3) 启动类集成过滤器
@Configuration
public class FilterConfig {
    @Autowired
    private TraceIdFilter traceIdFilter;
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
            .route(r -> r.path("/users/**")
                .filters(f -> f.filter(traceIdFilter))
                .uri("lb://user-service"))
            .build();
    }
}

8. 总结对比表格

功能Spring Cloud Gateway 实现方式配置/注解
路由规则通过YAML或Java代码定义路由(RouteLocator)spring.cloud.gateway.routes 配置项或 @Bean RouteLocator
过滤器内置过滤器工厂(如AddRequestHeader)或自定义全局过滤器(GlobalFilter)filters 配置项或实现 GlobalFilter 接口
限流(Sentinel)通过SentinelGatewayFilter集成,基于资源名配置限流规则filters: Sentinel 配置项 + Sentinel控制台规则
工作原理路由匹配 → 执行过滤器 → 转发请求 → 处理响应无注解,依赖配置文件和Java配置类
动态路由支持通过RefreshableRouteDefinitionRepository实现动态更新需配合Spring Cloud Config或Nacos配置中心

9. 注意事项

  1. 性能优化:避免在路由中使用复杂的正则表达式,优先使用Path的简单匹配。
  2. Sentinel集成:确保资源名与控制台规则一致,否则限流无效。
  3. 过滤器顺序:通过Ordered接口控制全局过滤器执行顺序。
  4. 日志监控:通过logging.level.org.springframework.cloud.gateway=DEBUG开启详细日志。

通过以上配置和代码示例,可快速实现路由管理、过滤器扩展及Sentinel限流,构建高可用的API网关。

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码