Spring Cloud Gateway 详解,包含:配置路由规则(Routes)、提供过滤器(Filter)、Gateway所有的过滤器工厂、使用Sentinel管控Gateway
Spring Cloud 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 工作原理
核心流程
- 路由匹配:根据请求URL、Header等条件匹配路由规则。
- 过滤器执行:在请求/响应阶段执行预定义的过滤器(如限流、日志)。
- 转发请求:将请求转发到目标服务(URI)。
- 响应处理:返回响应给客户端。
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) 控制台配置限流规则
- 在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. 注意事项
- 性能优化:避免在路由中使用复杂的正则表达式,优先使用Path的简单匹配。
- Sentinel集成:确保资源名与控制台规则一致,否则限流无效。
- 过滤器顺序:通过Ordered接口控制全局过滤器执行顺序。
- 日志监控:通过logging.level.org.springframework.cloud.gateway=DEBUG开启详细日志。
通过以上配置和代码示例,可快速实现路由管理、过滤器扩展及Sentinel限流,构建高可用的API网关。
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。