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

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: 3000readTimeout: 5000sentinel:scg:fallback:mode: responseresponse-body: '{"code":503,"msg":"服务降级"}'
  1. 自定义FallbackFactory:
@Component
public class OrderServiceFallbackFactory implements FallbackFactory<OrderServiceClient> {@Overridepublic OrderServiceClient create(Throwable cause) {return new OrderServiceClient() {@Overridepublic 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 {@Overridepublic 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时,我们的异常处理体系经受住了真实流量的考验。记住:好的异常处理方案,不是消灭异常,而是让系统优雅地与之共处。

相关文章:

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

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

Vue3 中使用 Sortablejs 实现拖拽排序功能 序号不更新问题

Vue3 中使用 Sortablejs 实现拖拽排序功能 序号不更新问题 安装依赖 npm install sortablejs --save简单使用 <template><div class"app-container"><div class"table-header"><el-button type"primary" click"hand…...

网络运维学习笔记(DeepSeek优化版) 024 HCIP-Datacom OSPF域内路由计算

文章目录 OSPF域内路由计算&#xff1a;单区域的路由计算一、OSPF单区域路由计算原理二、1类LSA详解2.1 1类LSA的作用与结构2.2 1类LSA的四种链路类型 三、OSPF路由表生成验证3.1 查看LSDB3.2 查看OSPF路由表3.3 查看全局路由表 四、2类LSA详解4.1 2类LSA的作用与生成条件4.2 2…...

【云馨AI-大模型】自动化部署Dify 1.1.2,无需科学上网,Linux环境轻松实现,附Docker离线安装等

Dify介绍 官网&#xff1a;https://dify.ai/zh生成式 AI 应用创新引擎开源的 LLM 应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力&#xff0c;轻松构建和运营生成式 AI 原生应用。 Dify安装脚本 目录创建 mkdir -p /data/yunxinai &&a…...

Android 简化图片加载与显示——使用Coil和Kotlin封装高效工具类

为了简化使用Coil加载网络图片和GIF的过程&#xff0c;我们可以封装一个工具类。这个工具类将包括初始化ImageLoader的方法、加载图片到ImageView的方法&#xff0c;以及可能的其他便捷方法&#xff0c;如加载圆形图片、设置占位图等。下面是一个示例&#xff1a; 首先&#x…...

CUDA 学习(2)——CUDA 介绍

GeForce 256 是英伟达 1999 年开发的第一个 GPU&#xff0c;最初用作显示器上渲染高端图形&#xff0c;只用于像素计算。 在早期&#xff0c;OpenGL 和 DirectX 等图形 API 是与 GPU 唯一的交互方式。后来&#xff0c;人们意识到 GPU 除了用于渲染图形图像外&#xff0c;还可以…...

棱镜七彩受邀出席“供应链安全国家标准贯标应用深度行”活动并做主题分享

近日&#xff0c;“供应链安全国家标准贯标应用深度行”活动在北京顺利举办&#xff0c;此次活动汇聚了行业内的众多专家和企业代表&#xff0c;深入探讨了供应链安全国家标准的制定与实施路径。棱镜七彩副总裁黄浩东受邀出席&#xff0c;并发表了题为《国家标准实施路径下的企…...

Vue3项目中的.vscode文件夹

.vscode 文件夹主要用于存放与 Visual Studio Code&#xff08;VS Code&#xff09;编辑器相关的项目配置文件&#xff0c;这些文件能让项目在 VS Code 里的开发体验更加个性化和高效。 extensions.json 在 .vscode 文件夹中&#xff0c;extensions.json 文件的作用是列出项目…...

系统转换、系统维护、净室软件工程、构件软件工程(高软51)

系列文章目录 系统转换、系统维护、净室软件工程、构件软件工程 文章目录 系列文章目录前言一、系统转换二、系统维护三、净室软件工程四、基于构件的软件工程总结 前言 本节讲明遗留系统的系统转换、系统维护、净室软件工程、基于构件软件工程相关知识。 一、系统转换 就是讲…...

K8S学习之基础四十四:k8s中部署Kibana

在Kubernetes集群中安装Kibana通常涉及使用Helm Chart或直接使用Kubernetes Manifest文件。以下是使用Helm Chart安装Kibana的步骤&#xff1a; 添加Elastic Helm仓库 首先&#xff0c;添加Elastic的Helm仓库&#xff1a; bash 复制 helm repo add elastic https://helm.ela…...

联核防爆无人叉车:高危环境中的安全搬运守护者

联核防爆AGV无人叉车是专为易燃易爆环境设计的智能搬运设备&#xff0c;其特点、功能与应用场景均围绕“安全”与“智能”核心展开&#xff1a;联核科技官网-AGV叉车十大品牌-无人叉车厂家-自动化叉车-智能搬运码垛机器人-智能叉车系统解决方案专家 一、核心特点 防爆设计电气…...

23种设计模式-责任链(Chain of Responsibility)设计模式

责任链设计模式 &#x1f6a9;什么是责任链设计模式&#xff1f;&#x1f6a9;责任链设计模式的特点&#x1f6a9;责任链设计模式的结构&#x1f6a9;责任链设计模式的优缺点&#x1f6a9;责任链设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…...

Linux使用集群服务器查看已安装conda环境,且环境名无显示、系统环境混乱等问题

一、问题 在使用集群服务器前可以查看导入&#xff0c;module load不需要安装。我都是自己重新下载Anaconda3-2024.10-1-Linux-x86_64.sh&#xff0c;然后安装&#xff0c;导致混乱。下面是情况 1.创建的环境名跑到目录下了 2.多个base,且有个base无显示 二、解决办法 1.删…...

python蓝桥杯刷题的重难点知识笔记

1、datetime模块 datetime.date&#xff1a;代表日期&#xff0c;包含年、月、日信息。datetime.time&#xff1a;代表时间&#xff0c;包含时、分、秒、微秒信息。datetime.datetime&#xff1a;结合了日期和时间&#xff0c;包含年、月、日、时、分、秒、微秒信息。datetime.…...

Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现

一、前言 在移动互联网蓬勃发展的今天&#xff0c;视频播放功能已成为众多Android应用的核心特性之一。面对多样化的视频格式和传输协议&#xff0c;开发一款高效、稳定的视频播放器是许多开发者追求的目标。FLV&#xff08;Flash Video&#xff09;格式&#xff0c;尽管随着H…...

Redmi Note 11 T pro + 刷入 LinegaOs 22.1 记录 手机已经解锁bl.

Redmi Note 11 T pro 刷入 LinegaOs 22.1 记录 手机已经解锁bl. 获取LIneagaOS源码&#xff0c; 以及https://github.com/xiaomi-mediatek-devs 这个组织提供的代码&#xff0c;非常感谢 环境要求&#xff1a; ubuntu 22.04 需要准备的依赖 sudo apt install git curl vim…...

《Operating System Concepts》阅读笔记:p483-p488

《Operating System Concepts》学习第 40 天&#xff0c;p483-p488 总结&#xff0c;总计 6 页。 一、技术总结 1.object storage (1)object storage 管理软件 Hadoop file system(HDFS)、Ceph。 二、英语总结(生词&#xff1a;1) 1.commodity (1)commodity: com-(“tog…...

极光优化PLO-Transformer-LSTM多变量时序

极光优化算法(PLO)于2024年8月发表于SCI期刊《Neurocomputing》&#xff0c;利用算法极光优化算法PLO优化Transformer-LSTM模型&#xff0c;同时提供与未优化模型的对比&#xff0c;包含柱状图、两张雷达图、二维散点图等等。 &#xff08;一&#xff09;LSTM模型LSTM是一种在时…...

Android开发:基于 Kotlin 协程的设备指令控制工具类设计与实现

在安卓开发中&#xff0c;设备控制是一个常见的需求。本文将介绍如何使用 Kotlin 协程实现一个高效、健壮的设备指令控制工具类。该工具类支持指令队列、重试机制、状态管理等功能&#xff0c;并适配安卓平台&#xff0c;确保生命周期管理和主线程安全性。通过本文&#xff0c;…...

SQL Server 中常见的数据类型及其详细解释、内存占用和适用场景

以下是 SQL Server 中常见的数据类型及其详细解释、内存占用和适用场景&#xff1a; 数据类型类别数据类型解释内存占用适用场景整数类型bigint用于存储范围较大的整数&#xff0c;范围是 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807)8 字节需要…...

Android Kotlin 权限工具类封装:简化动态权限管理

在 Android 开发中&#xff0c;动态权限管理是一个常见的需求&#xff0c;尤其是在高版本 Android 系统中&#xff0c;权限管理变得更加严格和复杂。为了简化权限申请的流程&#xff0c;减少重复代码&#xff0c;本文将介绍如何使用 Kotlin 封装一个高效、易用的权限工具类。 权…...

数据结构每日一题day3(顺序表)★★★★★

题目描述&#xff1a;顺序表L的元素递增有序排列&#xff0c;设计一个算法在插入元素x后保持该顺序表仍然递增有序排列,插入成功后返回插入元素所在位置,不成功返回-1 算法思想&#xff1a;在递增有序的顺序表中插入元素 x 并保持有序性&#xff0c;步骤如下&#xff1a; 合法…...

Git合并删除原理

如果有 A 分支&#xff0c;从 A 分支上新建 B 分支&#xff0c;B 分支做出修改合并到 A 分支&#xff0c;然后删除 B 分支&#xff0c;A 分支还有没有 B 分支修改的内容 关键原理&#xff1a; 合并的本质是提交历史的整合 1. 合并操作会将 B 的修改永久写入 A 的历史 当 …...

Git 是什么

第一步&#xff1a;想象一个场景——写作文的烦恼 假设你在电脑上写一篇作文&#xff0c;反复修改了好几次。突然发现 ​改错了 想回到之前的某版&#xff0c;但你已经覆盖保存了。这时候你可能会想&#xff1a; &#x1f62d; “要是能回到昨天的版本就好了&#xff01;”&a…...

基于javaweb的SpringBoot智能无人仓库管理设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...

python处理音频相关的库

1 音频信号采集与播放 pyaudio import sys import pyaudio import wave import timeCHUNK 1024 FORMAT pyaudio.paInt16 CHANNELS 1#仅支持单声道 RATE 16000 RECORD_SECONDS 3#更改录音时长#录音函数&#xff0c;生成wav文件 def record(file_name):try:os.close(file_…...

JNI 本地方法调用 Java 静态方法 和 实例方法对比;通过本地方法创建 Java 对象;本地方法访问 Java 数组元素;本地方法错误返回给 Java

以下是针对 Java JNI 的详细代码示例和对比分析&#xff1a; 一、调用 Java 静态方法 vs 实例方法 Java 示例类 public class JNIExample {public static void staticMethod(int value) {System.out.println("Static Method: " value);}public void instanceMetho…...

AWS Lambda 深度解析:构建高效无服务器应用的实战指南

在2025年的云计算生态中&#xff0c;AWS Lambda 作为无服务器计算的代表&#xff0c;以其按需执行、高可扩展性和零运维成本的优势&#xff0c;成为开发者构建现代应用的首选。无论是快速原型开发还是生产级系统&#xff0c;Lambda 都能大幅提升效率。然而&#xff0c;如何充分…...

网络爬虫-2:基础与理论

一.同步加载与异步加载 1.1同步加载定义: 页面所有内容一起加载出来,当某一个数据加载有问题,整个页面就不会加载出来(如HiFiNi音乐网站),所以又叫阻塞模式 1.2爬取步骤: 看netword->document 2.1异步加载定义: 数据是分开加载的,当某一份数据有异常时,不影响其他数据…...

从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.1.2多头注意力扩展与掩码机制(因果掩码与填充掩码)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 2.1.2 多头注意力扩展与掩码机制(`因果掩码与填充掩码`)1. 多头注意力机制:分治策略的数学实现1.1 多头注意力核心公式2. 逐行代码实现2.1 多头拆分与合并3. 掩码机制:注意力控制的核心技术3.1 因果…...