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

Spring Boot分布式项目异常处理实战:从崩溃边缘到优雅恢复

当单体应用拆分成分布式系统,异常就像被打开的潘多拉魔盒:RPC调用超时、分布式事务雪崩、第三方接口突然罢工…在最近的电商大促中,我们的系统就经历了这样的至暗时刻。本文将用真实代码示例,展示如何构建分布式异常处理体系。

一、全局异常拦截:最后的防线

@RestControllerAdvice
public class GlobalExceptionHandler {
    
    // 处理业务异常
    @ExceptionHandler(BizException.class)
    public Result handleBizException(BizException e) {
        log.error("业务异常: {}", e.getErrorMsg());
        return Result.fail(e.getErrorCode(), e.getErrorMsg());
    }

    // 处理Feign调用异常
    @ExceptionHandler(FeignException.class)
    public Result handleFeignException(FeignException e) {
        log.error("服务调用异常: {}", e.contentUTF8());
        return Result.fail(ErrorCode.SERVICE_UNAVAILABLE);
    }

    // 兜底异常处理
    @ExceptionHandler(Exception.class)
    public Result handleException(Exception e) {
        log.error("系统异常: {}", e.getMessage());
        return Result.fail(ErrorCode.SYSTEM_ERROR);
    }
}

关键点:通过@ControllerAdvice实现三层防护,特别注意对Feign异常的单独处理,保留原始错误信息

二、服务间调用异常处理

  1. Feign+Sentinel双保险配置:
feign:
  client:
    config:
      default:
        connectTimeout: 3000
        readTimeout: 5000

sentinel:
  scg:
    fallback:
      mode: response
      response-body: '{"code":503,"msg":"服务降级"}'
  1. 自定义FallbackFactory:
@Component
public class OrderServiceFallbackFactory implements FallbackFactory<OrderServiceClient> {
    @Override
    public OrderServiceClient create(Throwable cause) {
        return new OrderServiceClient() {
            @Override
            public Result<OrderDTO> getOrder(String orderId) {
                if(cause instanceof BizException){
                    return Result.fail(((BizException) cause).getErrorCode(), "订单服务异常");
                }
                return Result.fail(ErrorCode.SERVICE_DEGRADE);
            }
        };
    }
}

实战经验:在双十一大促中,这种组合策略帮助我们拦截了70%以上的级联故障

三、分布式事务异常处理

使用Seata的TCC模式示例:

@LocalTCC
public interface OrderTccAction {

    @TwoPhaseBusinessAction(name = "prepareCreateOrder", commitMethod = "commit", rollbackMethod = "rollback")
    boolean prepare(BusinessActionContext actionContext,
                   @BusinessActionContextParameter(paramName = "order") Order order);

    boolean commit(BusinessActionContext actionContext);

    boolean rollback(BusinessActionContext actionContext);
}

补偿策略:

  1. 自动重试:对网络抖动等临时性错误
  2. 人工干预:对数据不一致等严重问题
  3. 事务日志:记录关键操作节点

四、流量洪峰应对策略

  1. Resilience4j熔断配置:
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
    .failureRateThreshold(50)
    .waitDurationInOpenState(Duration.ofMillis(1000))
    .ringBufferSizeInHalfOpenState(2)
    .ringBufferSizeInClosedState(2)
    .build();
  1. 自适应限流算法:
@Slf4j
public class AdaptiveLimiter {
    private AtomicInteger currentLimit = new AtomicInteger(100);
    
    public boolean tryAcquire() {
        int current = currentLimit.get();
        if(current <= 0) return false;
        
        // 根据RT和成功率动态调整
        double successRate = getRecentSuccessRate();
        long avgRT = getAvgResponseTime();
        
        if(successRate < 90% || avgRT > 500ms) {
            currentLimit.updateAndGet(x -> Math.max(x/2, 10));
        } else if(successRate > 99% && avgRT < 100ms) {
            currentLimit.updateAndGet(x -> Math.min(x*2, 1000));
        }
        return true;
    }
}

五、异常追踪三板斧

  1. 全链路追踪:
@Slf4j
public class TraceInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        MDC.put("traceId", UUID.randomUUID().toString());
    }
}
  1. 异常画像系统:
@Aspect
@Component
public class ExceptionMonitor {
    @AfterThrowing(pointcut = "execution(* com..*.*(..))", throwing = "ex")
    public void monitorException(Exception ex) {
        ExceptionMetric metric = new ExceptionMetric(
            ex.getClass().getSimpleName(),
            Thread.currentThread().getName(),
            System.currentTimeMillis()
        );
        KafkaTemplate.send("exception_metrics", metric);
    }
}
  1. 智能告警:基于ELK的异常模式识别

总结

在分布式系统中,异常处理不是简单的try-catch,而是需要建立完整的防御体系:

  1. 全局异常拦截:统一异常出口
  2. 服务治理:熔断/限流/降级三板斧
  3. 事务补偿:最终一致性保障
  4. 智能监控:快速定位问题根源

当系统吞吐量从100TPS提升到5000TPS时,我们的异常处理体系经受住了真实流量的考验。记住:好的异常处理方案,不是消灭异常,而是让系统优雅地与之共处。

相关文章:

  • AF3 identity_rot_mats函数解读
  • CMS网站模板设计与用户定制化实战评测
  • Excel第41套全国人口普查
  • 【免费】2000-2019年各省地方财政房产税数据
  • c++第二课(基础)
  • Redis集群搭建和高可用方案(Java实现)
  • Docker与Ollama强强联合!deepseek-r1部署实践
  • FreeRTOS从入门到实战精通指南(一)
  • mne溯源后的数据初步处理方法
  • ubuntu系统/run目录不能执行脚本问题解决
  • 从单任务到多任务:进程与线程如何实现并发?
  • python 标准库之 functools 模块
  • 豪越科技:融合低空经济的消防一体化安全管控解决方案
  • openai agent实践
  • 什么是MCP|工作原理是什么|怎么使用MCP|图解MCP
  • 六十天前端强化训练之第二十七天之Pinia 状态管理全解与购物车实战案例
  • 【Linux】I/O 多路转接:select epoll 技术剖析
  • 安卓 vs iOS 文件系统深度解析:开放自由与封闭安全的终极博弈
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例10,TableView15_10带搜索的导出表格示例
  • [DDD架构]不同数据模型DTO、VO、PO、DAO、DO的含义
  • 据报特斯拉寻找新CEO,马斯克财报会议上表态:把更多时间投入特斯拉
  • 网警查处编造传播“登顶泰山最高可得3万奖金”网络谣言者
  • 专访 | 杜普兰蒂斯:爱上中国文化,下一步努力提升速度
  • 新型算法助力听障人士听得更清晰
  • “80后”杨占旭已任辽宁阜新市副市长,曾任辽宁石油化工大学副校长
  • 事关广大农民利益,农村集体经济组织法5月1日起施行