DeepSeek连续故障!Java侧多模型熔断降级+本地Ollama部署实战
文章目录
无意间发现了一个巨牛巨牛巨牛的人工智能教程,非常通俗易懂,对AI感兴趣的朋友强烈推荐去看看,传送门https://blog.csdn.net/HHX_01
开篇:当"服务器繁忙"成了常态
兄弟们,最近用DeepSeek是不是有种坐过山车的感觉?前脚还在愉快地让它帮你改代码,后脚就弹出来一个服务器繁忙,请稍后重试。
这还不算完,3月29号晚上到30号上午,DeepSeek直接来了个长达12小时的集体罢工,创下成立以来单次服务中断最长纪录。紧接着31号又崩一次,这频率实在太高。
说实话,这也不能全怪DeepSeek。月活1.45亿,和豆包并列中国AI应用第一梯队,流量压力极大。
但咱们打工人DDL不等人,代码写到一半断线、业务卡壳,老板不会听你解释DeepSeek又崩了。
核心道理:不能把鸡蛋放在一个篮子里。
今天以Java开发者视角,实战一套:多模型熔断降级 + 本地Ollama兜底,云端全崩也能正常跑AI。
为什么要搞熔断降级?血的教训
熔断降级原理很通俗:类似家电过载跳闸,保护主系统不被拖崩。
如果没有熔断:
- DeepSeek响应慢、报错、502
- 你的Java微服务线程一直阻塞等待
- 线程池耗尽,引发服务雪崩
- 最终AI接口挂了 → 把你整个业务系统带崩
所以必须一套组合拳:
- 熔断器:连续失败达到阈值,自动切断,不再请求
- 降级策略:主服务挂了,自动切备用模型/本地模型
- 限流:控制并发,防止打满带宽
- 超时控制:避免慢请求拖死整个服务
Java实战:Resilience4j多模型路由
Resilience4j:Java生态最轻量熔断框架,替代Hystrix,完美兼容Spring Boot3.x,支持注解开发。
第一步:引入依赖(pom.xml)
io.github.resilience4j
resilience4j-spring-boot3
2.1.0
org.springframework.boot
spring-boot-starter-aop
第二步:application.yml 熔断配置
resilience4j:
circuitbreaker:
configs:
default:
slidingWindowSize: 10
failureRateThreshold: 50
waitDurationInOpenState: 30s
permittedNumberOfCallsInHalfOpenState: 3
instances:
deepseekPrimary:
baseConfig: default
failureRateThreshold: 60
ollamaLocal:
baseConfig: default
failureRateThreshold: 80
timelimiter:
configs:
default:
timeoutDuration: 5s
第三步:多模型路由核心代码
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import io.github.resilience4j.timelimiter.annotation.TimeLimiter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;
@Service
@Slf4j
public class MultiModelAiService {
private final OpenAiChatModel deepSeekModel;
private final OllamaChatModel ollamaModel;
public MultiModelAiService(OpenAiChatModel deepSeekModel,
OllamaChatModel ollamaModel) {
this.deepSeekModel = deepSeekModel;
this.ollamaModel = ollamaModel;
}
/**
* 主入口:优先DeepSeek,失败自动降级到Ollama
*/
@CircuitBreaker(name = "deepseekPrimary", fallbackMethod = "fallbackToOllama")
@TimeLimiter(name = "deepseekPrimary")
public CompletableFuture generateCode(String requirement) {
return CompletableFuture.supplyAsync(() -> {
log.info("尝试调用DeepSeek主通道...");
Prompt prompt = new Prompt("请生成代码:" + requirement);
return deepSeekModel.call(prompt).getResult().getOutput().getContent();
});
}
/**
* 降级兜底:本地Ollama
*/
public CompletableFuture fallbackToOllama(String requirement, Exception ex) {
log.warn("DeepSeek异常,降级至本地Ollama: {}", ex.getMessage());
return CompletableFuture.supplyAsync(() -> {
try {
Prompt prompt = new Prompt("请生成代码:" + requirement);
return ollamaModel.call(prompt).getResult().getOutput().getContent();
} catch (Exception localEx) {
log.error("本地Ollama也异常", localEx);
return "AI服务暂时不可用,请稍后重试";
}
});
}
}
执行流程
- 请求优先走 DeepSeek 主通道
- 5秒超时 / 失败率超60% → 熔断器打开
- 自动进入
fallbackToOllama→ 切本地Ollama - 30秒后半开试探,恢复则自动切回主服务
第四步:Controller 接口
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.TimeUnit;
@RestController
@RequestMapping("/ai")
@RequiredArgsConstructor
public class AiController {
private final MultiModelAiService aiService;
@PostMapping("/code")
public ResponseEntity generateCode(@RequestBody String requirement) {
try {
String result = aiService.generateCode(requirement)
.get(8, TimeUnit.SECONDS);
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE)
.body("所有AI通道均不可用");
}
}
}
本地Ollama部署:最后的兜底保障
Ollama:开源本地大模型运行框架,一行命令部署,支持标准REST API,Java直接对接。
安装 Ollama
mac / Linux:
curl -fsSL https://ollama.com/install.sh | sh
Windows:
winget install --id Ollama.Ollama
修改模型存储目录(防止C盘爆满)
OLLAMA_MODELS=D:\ollama\models
拉取 DeepSeek 本地模型
根据显存选择:
# 4-6G显存
ollama pull deepseek-r1:1.5b
# 8-12G显存(推荐)
ollama pull deepseek-r1:7b
# 24G+显存
ollama pull deepseek-r1:14b
Spring AI 集成 Ollama
pom.xml
org.springframework.ai
spring-ai-starter-model-ollama
1.0.0
application.yml
spring:
ai:
ollama:
base-url: http://localhost:11434
chat:
model: deepseek-r1:7b
options:
temperature: 0.7
num-ctx: 4096
配置完成,Java即可直接调用本地模型。
生产级三级高可用架构
- 一级主力:DeepSeek 官方API(能力强、偶发不稳定)
- 二级备用:其他云厂商AI API(豆包、通义千问等)
- 三级兜底:本地Ollama部署(绝对稳定、自主可控)
优点:
- 成本极低:普通游戏本即可跑7B模型
- 可用性质变:云端全崩也不影响核心业务
- 完全自主:不受第三方服务商故障影响
真实踩坑经验
-
线程池必须隔离
不要用默认线程池,自定义独立线程池,避免OOM。 -
Ollama首次调用慢
模型加载需要时间,可设置常驻内存或项目启动预热。 -
按显存选模型
8G显存强行跑32B会极度卡顿,7B足够代码、文本场景。 -
必须加监控
Resilience4j + Actuator + Prometheus + Grafana,实时看熔断状态、降级次数。
结语:做自己的AI主人
DeepSeek连续故障,给所有AI开发者敲响警钟:依赖单一云AI = 极高风险。
Java生态有成熟的Resilience4j熔断,配合Ollama极简本地部署,完全可以搭建:
高可用 + 低成本 + 自主可控 的企业级AI架构。
下次再遇到云端AI罢工,你可以淡定看着系统自动切换本地模型,手里有粮,心里不慌,这才是高级工程师的底气。
无意间发现了一个巨牛巨牛巨牛的人工智能教程,非常通俗易懂,对AI感兴趣的朋友强烈推荐去看看,传送门https://blog.csdn.net/HHX_01
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)