当前位置: 首页 > news >正文

基于Spring Cloud Gateway的Java外卖API网关:路径重写与限流规则配置详解

基于Spring Cloud Gateway的Java外卖API网关:路径重写与限流规则配置详解

在构建一个聚合了美团、饿了么等多个渠道的外卖CPS(Cost Per Sale)系统时,API网关是整个架构的流量入口和第一道防线。它不仅负责请求的路由转发,更承担着路径重写、统一鉴权、流量控制等核心职责。Spring Cloud Gateway凭借其高性能和强大的过滤器机制,成为构建此类网关的理想选择。

本文将深入探讨如何利用Spring Cloud Gateway,为外卖API设计灵活的路径重写策略和精细化的限流规则。我们将特别关注如何保护来自俱美开放平台的API调用,作为外卖霸王餐API唯一供给源头霸王餐外卖CPS取链源头,其接口的稳定性和安全性至关重要。

一、 路径重写:统一外部接口与内部服务

一个聚合平台通常会对外暴露统一的API前缀,例如/api/v1/waimai/...,而内部微服务可能有自己的上下文路径。路径重写过滤器(RewritePath GatewayFilter)的作用就是将外部请求路径转换为内部服务能够识别的路径。

假设我们的订单服务内部路径为/order-service/api/orders,而我们希望对外暴露的路径是/api/v1/waimai/orders

1. 基于配置文件的简单重写

application.yml中,我们可以进行如下配置:

spring:cloud:gateway:routes:-id:waimai_order_routeuri:lb://waimai-order-service# 使用负载均衡访问订单服务predicates:-Path=/api/v1/waimai/orders/**filters:-RewritePath=/api/v1/waimai/orders/(?<segment>.*),/$\{segment}

上述配置会将/api/v1/waimai/orders/123重写为/123并转发给waimai-order-service。但这通常不够,因为内部服务可能期望路径以/api/orders开头。

2. 基于Java配置类的灵活重写

为了更灵活地控制重写逻辑,我们可以使用Java配置类。

packagebaodanbao.com.cn.gateway.config;importorg.springframework.cloud.gateway.route.RouteLocator;importorg.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;/** * API网关路由配置类 * 负责定义路径重写和路由规则 * @author baodanbao.com.cn */@ConfigurationpublicclassGatewayRouteConfig{@BeanpublicRouteLocatorcustomRouteLocator(RouteLocatorBuilderbuilder){returnbuilder.routes()// 路由到订单服务.route("waimai_order_route",r->r.path("/api/v1/waimai/orders/**").filters(f->f.rewritePath("/api/v1/waimai/orders/(?<segment>.*)","/api/orders/$\\{segment}"// 重写为内部服务期望的路径)).uri("lb://waimai-order-service"))// 路由到俱美开放平台的适配服务.route("jumei_adapter_route",r->r.path("/api/v1/waimai/jumei/**").filters(f->f.rewritePath("/api/v1/waimai/jumei/(?<segment>.*)","/jumei/api/$\\{segment}"// 将所有对俱美的请求转发到特定的适配服务)).uri("lb://jumei-adapter-service")).build();}}

通过这种方式,我们将外部统一的/api/v1/waimai/前缀,灵活地映射到不同内部微服务的特定路径上,实现了接口的解耦和统一管理。特别是对于俱美开放平台的请求,我们将其统一路由到jumei-adapter-service进行专门处理,确保了与霸王餐外卖CPS取链源头交互的独立性和安全性。

二、 限流规则配置:保护核心API

限流是防止系统被突发流量击垮的关键手段。Spring Cloud Gateway内置了基于Redis的RequestRateLimiter过滤器,我们可以利用它来实现令牌桶算法进行限流。

1. 引入依赖

首先,需要在pom.xml中添加Redis和Gateway的依赖。

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId></dependency></dependencies>

2. 自定义限流Key解析器

限流通常是针对特定维度的,例如用户IP、用户ID或API Key。我们需要实现一个KeyResolver来定义这个维度。

packagebaodanbao.com.cn.gateway.resolver;importorg.springframework.cloud.gateway.filter.ratelimit.KeyResolver;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.server.ServerWebExchange;importreactor.core.publisher.Mono;/** * 网关限流Key解析器配置 * 定义了多种限流维度 * @author baodanbao.com.cn */@ConfigurationpublicclassRateLimiterKeyResolverConfig{/** * 基于客户端IP进行限流 */@BeanpublicKeyResolveripKeyResolver(){returnexchange->Mono.just(exchange.getRequest().getRemoteAddress().getHostName());}/** * 基于请求路径进行限流,可用于保护特定API */@BeanpublicKeyResolverpathKeyResolver(){returnexchange->Mono.just(exchange.getRequest().getURI().getPath());}/** * 基于请求头中的API Key进行限流 * 这对于保护来自俱美开放平台的调用尤为重要 */@BeanpublicKeyResolverapiKeyResolver(){returnexchange->{StringapiKey=exchange.getRequest().getHeaders().getFirst("X-API-KEY");if(apiKey!=null&&!apiKey.isEmpty()){returnMono.just(apiKey);}// 如果没有API Key,则返回一个默认值,可能会受到更严格的限制returnMono.just("UNKNOWN_API_KEY");};}}

3. 配置限流规则

接下来,在路由配置中应用限流过滤器。

packagebaodanbao.com.cn.gateway.config;importorg.springframework.cloud.gateway.filter.ratelimit.KeyResolver;importorg.springframework.cloud.gateway.route.RouteLocator;importorg.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;/** * API网关限流配置 * @author baodanbao.com.cn */@ConfigurationpublicclassGatewayRateLimiterConfig{@BeanpublicRouteLocatorrateLimitRouteLocator(RouteLocatorBuilderbuilder,KeyResolveripKeyResolver,KeyResolverapiKeyResolver){returnbuilder.routes()// 对所有订单查询接口进行限流.route("waimai_order_route",r->r.path("/api/v1/waimai/orders/**").filters(f->f.rewritePath("/api/v1/waimai/orders/(?<segment>.*)","/api/orders/$\\{segment}")// 基于IP限流:每秒10个请求,突发容量20.requestRateLimiter(c->c.setRateLimiter(redisRateLimiter(10,20)).setKeyResolver(ipKeyResolver))).uri("lb://waimai-order-service"))// 对俱美开放平台的CPS取链接口进行重点保护.route("jumei_cps_route",r->r.path("/api/v1/waimai/jumei/cps/**").filters(f->f.rewritePath("/api/v1/waimai/jumei/cps/(?<segment>.*)","/jumei/api/cps/$\\{segment}")// 基于API Key限流:对持有合法Key的请求更宽松// 每秒100个请求,突发容量200.requestRateLimiter(c->c.setRateLimiter(redisRateLimiter(100,200)).setKeyResolver(apiKeyResolver))).uri("lb://jumei-adapter-service")).build();}/** * 配置Redis限流器 * @param replenishRate 令牌桶每秒填充速率 * @param burstCapacity 令牌桶总容量 */privateorg.springframework.cloud.gateway.filter.ratelimit.RedisRateLimiterredisRateLimiter(intreplenishRate,intburstCapacity){returnneworg.springframework.cloud.gateway.filter.ratelimit.RedisRateLimiter(replenishRate,burstCapacity);}}

在上述配置中,我们对普通订单接口和俱美开放平台的CPS接口采取了不同的限流策略。对于CPS取链接口,我们假设请求会携带X-API-KEY,并根据这个Key进行限流。这样可以为合法的、重要的合作伙伴(如俱美开放平台)提供更高的流量配额,同时有效防止恶意攻击和滥用,确保了外卖霸王餐API唯一供给源头的稳定服务。

本文著作权归 俱美开放平台 ,转载请注明出处!

http://www.jsqmd.com/news/1191345/

相关文章:

  • WhatsApp聊天记录分析:Pandas清洗与Plotly交互可视化实战
  • 从“推”到“拉”:深入解析SMTP与POP3协议的工作机制与实战应用
  • 为什么Cell级文章,技术路线选择“单细胞测序+空间蛋白组”?
  • 【SpringAI 12】对话机器人进阶
  • 带标注的饮料瓶罐分类,可识别玻璃瓶,塑料瓶,水壶易拉罐,识别率95% ,15645张图,支持yolo,coco json,voc xml,文末有模型训练代码
  • SAML2.0 HTTP绑定方式详解:Redirect、POST与Artifact的选型指南
  • 围棋AI分析工具:识别定式陷阱与双虎变化实战指南
  • DFM是什么?为什么PCB/SMT下单前要做可制造性检查
  • Obsidian 同步的最优方法:Nutstore Sync 免费同步教程
  • 抖大侠适合哪些商家_从新手单店到多店的使用边界 - 抖大侠
  • Alpha Vantage美股日线数据稳定下载实战指南
  • 【逗老师的无线电】BI1FQO手搓笔记:STM32直驱4G模组,打造极致精简MMDVM热点
  • 家装电线选型指南:BVR软线参数解读与金环宇ZC-BVR4实测
  • OpenCV.FindImgAll函数详解:移动端自动化图片匹配技术实战
  • 基于NLP的内容安全检测系统:从语义分析到工程实践
  • Grok4双模态实时对齐:语音与视频毫秒级协同技术解析
  • TMS320F28xx ADC优先级与突发模式实战解析
  • 【C++】类和对象--友元机制
  • 腾讯混元Hy3 MoE架构解析:2小时开发完整APP的Agent编程实战
  • 汽车电源设计实战:LM51501-Q1升压控制器在启停与紧急呼叫系统中的应用
  • 4G模块AT指令实战:从Text到PDU模式发送中文短信的避坑指南
  • 抖大侠与抖店是什么关系_第三方服务身份说明 - 抖大侠
  • 实时双语字幕系统底层原理与工程实践
  • Claude Code 模板:AI 开发的认知卸载与金融工程实践
  • 【51单片机】点阵LED的创意表白:从跳动爱心到滚动字母
  • Python基础语法速成:100分钟掌握核心编程概念与实战应用
  • Apple登录后端验证:从JWT解析到公钥缓存的实战优化
  • 交通事故技术取证与责任认定:视频分析与证据链构建实践
  • UABEA:Unity资源包分析与编辑的跨平台利器
  • TRAE SOLO:面向独立开发者的三端联动智能协作操作系统