一、为什么要限流大模型API的限流Rate Limiting是生产环境中最容易被忽视的风险点。超过限制后轻则请求被拒重则账户被封。限流的两重意义保护你的应用不被突发流量冲垮保护你的钱包不被意外耗尽二、分层限流架构┌─────────────────────────────────────────────────────────────┐ │ 分层限流架构 │ ├─────────────────────────────────────────────────────────────┤ │ 第一层客户端限流控制对模型API的调用频率 │ │ ↓ │ │ 第二层应用层限流控制业务逻辑触发AI调用的条件 │ │ ↓ │ │ 第三层兜底降级模型不可用时的保底方案 │ └─────────────────────────────────────────────────────────────┘三、第一层客户端限流使用Resilience4j实现令牌桶限流ConfigurationpublicclassRateLimiterConfig{BeanpublicRateLimiterrateLimiter(){returnRateLimiter.of(ai-api,RateLimiterConfig.custom().limitRefreshPeriod(Duration.ofSeconds(1))// 每秒刷新.limitForPeriod(10)// 每秒10个请求.timeoutDuration(Duration.ofMillis(500))// 等待超时.build());}}ServicepublicclassAiService{AutowiredprivateRateLimiterrateLimiter;AutowiredprivateChatClientchatClient;publicStringchat(Stringprompt){// 尝试获取令牌rateLimiter.acquirePermission();returnchatClient.prompt().user(prompt).call().content();}}四、第二层应用层限流不是所有请求都需要调用大模型4.1 意图识别前置publicStringchat(Stringmessage){// 先用规则判断是否需要调用大模型StringintentintentClassifier.classify(message);if(greeting.equals(intent)){return你好有什么可以帮你的;}if(faq.equals(intent)){// 查FAQ缓存StringcachedfaqCache.get(message);if(cached!null){returncached;}}// 只有必要时才调用大模型returncallAiModel(message);}4.2 语义缓存ServicepublicclassSemanticCacheService{privateMapString,CachedResponsecachenewConcurrentHashMap();publicOptionalStringget(Stringprompt){// 计算语义相似度for(Map.EntryString,CachedResponseentry:cache.entrySet()){if(semanticSimilarity(prompt,entry.getKey())0.95){log.info(命中语义缓存: {},entry.getKey());returnOptional.of(entry.getValue().response);}}returnOptional.empty();}publicvoidput(Stringprompt,Stringresponse){if(cache.size()10000){// LRU淘汰evictOldest();}cache.put(prompt,newCachedResponse(response,System.currentTimeMillis()));}}五、第三层兜底降级ServicepublicclassAiServiceWithFallback{publicStringchatWithFallback(Stringmessage){try{returnchatClient.prompt().user(message).call().content();}catch(RateLimitExceptione){log.warn(触发限流尝试降级方案);returngetFallbackResponse(message);}catch(ApiExceptione){log.error(API调用失败: {},e.getMessage());returngetFallbackResponse(message);}catch(Exceptione){log.error(未知错误: {},e.getMessage());return服务暂时繁忙请稍后重试;}}privateStringgetFallbackResponse(Stringmessage){// 返回预设的友好提示return当前服务繁忙请稍后重试或联系客服。;}}六、高可用架构设计6.1 多模型供应商ConfigurationpublicclassMultiModelConfig{BeanPrimarypublicChatClientprimaryChatClient(ChatModelprimaryModel){returnChatClient.builder(primaryModel).build();}BeanpublicChatClientbackupChatClient(ChatModelbackupModel){returnChatClient.builder(backupModel).build();}}ServicepublicclassResilientAiService{AutowiredQualifier(primaryChatClient)privateChatClientprimaryClient;AutowiredQualifier(backupChatClient)privateChatClientbackupClient;publicStringchat(Stringmessage){try{returnprimaryClient.prompt().user(message).call().content();}catch(Exceptione){log.warn(主模型调用失败切换到备用模型);returnbackupClient.prompt().user(message).call().content();}}}6.2 消息队列异步处理ServicepublicclassAsyncAiService{AutowiredprivateMessageQueuemq;AutowiredprivateChatClientchatClient;publicStringsubmitTask(Stringmessage){StringtaskIdUUID.randomUUID().toString();// 异步提交mq.send(ai-tasks,newTask(message,taskId));returntaskId;}KafkaListener(topicsai-tasks)publicvoidprocessTask(Tasktask){StringresultchatClient.prompt().user(task.getMessage()).call().content();// 推送结果mq.send(ai-results,newResult(task.getTaskId(),result));}}七、监控与告警ComponentpublicclassAiMetrics{// 调用成功率MetricprivateDoublesuccessRate;// P99响应延迟Timed(valueai.call.latency,percentiles{0.5,0.95,0.99})publicStringcallAi(Stringmessage){returnchatClient.prompt().user(message).call().content();}// Token消耗Counted(nametoken.consumed)privatevoidrecordToken(inttokens){metrics.record(token.total,tokens);}}企业级集成建议在实际项目中通过API聚合平台如weelinking等可以简化多模型供应商的管理这类平台通常提供统一的限流策略、熔断机制和监控告警有助于构建高可用的AI服务架构。总结层次作用实现方式客户端限流控制对API的调用频率Resilience4j令牌桶应用层限流减少不必要的AI调用缓存意图识别兜底降级保证服务可用性预设回复备用模型异步处理削峰填谷消息队列#SpringAI #架构设计 #限流 #高可用 #企业级 推荐阅读如果这篇对你有帮助以下文章你也会喜欢VS Code 安装配置 Claude Code 插件教程3分钟搞定2026全网首个企业级claude中转服务平台使用说明2026年度亚洲大模型API中转平台评优weelinking获评综合表现最佳平台