Java接口降级流程规范
降级策略分层设计
// 降级级别定义
public enum DegradeLevel {
NONE(0, "不降级"),
PARTIAL(1, "部分降级"), // 非核心功能降级
BASIC(2, "基础降级"), // 核心功能精简
FULL(3, "完全降级"); // 全部降级
private int level;
private String desc;
}
标准降级流程
1 触发条件判断
@Component
public class DegradeManager {
// 降级触发条件
public boolean shouldDegrade(DegradeRule rule) {
// 1. 异常率阈值
if (errorRate > rule.getErrorThreshold()) return true;
// 2. 响应时间超阈值
if (avgResponseTime > rule.getResponseTimeThreshold()) return true;
// 3. 并发数超阈值
if (currentConcurrency > rule.getConcurrencyThreshold()) return true;
// 4. 资源使用率
if (resourceUtilization > rule.getResourceThreshold()) return true;
return false;
}
}
2 降级执行流程
@Slf4j
@Component
public class DegradeExecutor {
public <T> T executeWithDegrade(Callable<T> callable, DegradeConfig config) {
// 1. 检查是否触发降级
if (isDegradeTriggered(config.getResource())) {
// 2. 获取当前降级级别
DegradeLevel level = getCurrentDegradeLevel(config.getResource());
// 3. 执行对应级别的降级逻辑
return executeDegradeLogic(level, config);
}
// 4. 正常执行 - 带熔断保护
return executeWithCircuitBreaker(callable, config);
}
private <T> T executeDegradeLogic(DegradeLevel level, DegradeConfig config) {
switch (level) {
case PARTIAL:
return partialDegrade(config);
case BASIC:
return basicDegrade(config);
case FULL:
return fullDegrade(config);
default:
return null;
}
}
}
降级实现模式
1 返回值降级
public class ResultDegradeStrategy implements DegradeStrategy {
@Override
public <T> T degrade(DegradeConfig config) {
// 返回默认值
return (T) config.getDefaultValue();
}
}
// 使用示例
@Degrade(level = DegradeLevel.PARTIAL, fallback = "getDefaultUser")
public User getUser(String userId) {
// 正常业务逻辑
}
2 缓存降级
@Component
public class CacheDegradeStrategy {
@Cacheable(value = "users", unless = "#result == null")
public User getUserFromCache(String userId) {
// 降级时从缓存读取
return cacheManager.get(userId);
}
@CacheEvict(value = "users", key = "#userId")
public void refreshCache(String userId) {
// 缓存刷新逻辑
}
}
3 异步降级
@Component
public class AsyncDegradeStrategy {
@Async("degradeExecutor")
public CompletableFuture<Result> asyncDegrade(DegradeRequest request) {
// 异步降级处理
return CompletableFuture.supplyAsync(() -> {
// 降级逻辑
return processDegrade(request);
});
}
}
降级配置管理
# application-degrade.yml
degrade:
enabled: true
rules:
- resource: userService
level: PARTIAL
threshold:
errorRate: 0.5
responseTime: 2000
concurrency: 100
fallback:
strategy: RESULT
defaultValue: "{}"
recovery:
interval: 60000
testRequest: true
降级监控与告警
@Component
public class DegradeMonitor {
@Autowired
private MetricsCollector metricsCollector;
@Scheduled(fixedRate = 10000)
public void monitorDegradeStatus() {
// 1. 收集降级指标
DegradeMetrics metrics = collectMetrics();
// 2. 记录降级事件
if (metrics.isDegraded()) {
log.warn("接口降级触发: resource={}, level={}, reason={}",
metrics.getResource(), metrics.getLevel(), metrics.getReason());
}
// 3. 发送告警
if (metrics.getDegradeCount() > threshold) {
alertService.sendAlert(buildAlert(metrics));
}
// 4. 记录到监控系统
metricsCollector.record(metrics);
}
}
降级恢复机制
@Component
public class DegradeRecovery {
// 半开状态探测
@Scheduled(fixedDelay = 30000)
public void checkRecovery() {
for (DegradedResource resource : degradedResources) {
// 发送探测请求
boolean recovered = testResource(resource);
if (recovered) {
// 逐步恢复
recoverGradually(resource);
}
}
}
private void recoverGradually(DegradedResource resource) {
// 1. 流量逐渐恢复
resource.setRecoveryRate(0.3); // 初始30%流量
// 2. 监控恢复情况
if (isStable(resource)) {
resource.setRecoveryRate(0.6);
}
// 3. 完全恢复
if (isStable(resource)) {
completeRecovery(resource);
}
}
}
规范要求总结
| 阶段 |
规范要求 |
实现方式 |
| 触发 |
明确降级条件 |
多维度阈值判断 |
| 执行 |
降级级别清晰 |
分层降级策略 |
| 实现 |
优雅降级 |
返回值/缓存/异步模式 |
| 监控 |
全链路监控 |
指标采集+告警 |
| 恢复 |
逐步恢复 |
半开探测+流量控制 |
| 治理 |
动态配置 |
配置中心+热更新 |
最佳实践
- 降级粒度:接口级 > 服务级 > 业务线级
- 降级顺序:非核心 → 核心简化 → 全部降级
- 降级时间:避免高峰期降级,优先限流
- 恢复策略:慢启动、逐步放开、灰度验证
- 数据一致性:降级期间保证最终一致性
- 全链路标记:降级请求增加标记便于排查
