微服务异常需统一管控:定义baseexception基类及业务子类,错误码元数据由配置中心集中管理,全局处理器按请求语言翻译并返回标准响应体,跨服务调用须透传原始错误语义并注入链路追踪。

在微服务架构中,自定义异常不能只靠每个服务各自定义几个类来应付,必须从编码规范、传播机制、响应格式、配置管理四个层面统一管控,否则很快会出现错误码重复、语言不一致、下游无法识别等问题。
分层设计异常类体系
所有微服务共用一套抽象基类和模块化子类,避免各写各的:
- 定义 BaseException(抽象):含
errorCode(如"USER_NOT_FOUND")、httpStatus、zhMessage、enMessage字段,不直接实例化 - 按业务域划分子类:如 UserException、OrderException,内部预置静态常量码(
USER_001、ORDER_002),并提供带参构造工厂方法(如UserException.notFound(userId)) - 禁止在 service 或 controller 层 new RuntimeException 或拼接字符串异常——所有抛出必须走这些类型
错误码元数据集中配置
错误码含义、多语言文案、HTTP 状态码不能硬编码在 Java 类里,而应由配置中心统一托管:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在 Nacos 或 Spring Cloud Config 中以 YAML 形式维护:
USER_NOT_FOUND: { code: 404001, zh: "用户不存在", en: "User not found", httpStatus: 404 } - 各服务启动时加载该配置,构建内存级 ErrorCodeRegistry,供异常构造时动态查文案
- 配合注解(如
@ErrorCode("USER_NOT_FOUND"))或工具类(ExceptionFactory.of("USER_NOT_FOUND"))自动注入,杜绝字符串字面量散落
全局处理器统一拦截与翻译
每个服务都复用同一套 @RestControllerAdvice 实现,但翻译逻辑需感知上下文:
- 拦截所有继承自 BaseException 的异常,提取
errorCode,再通过ErrorCodeRegistry拿到对应语言文案 - 语言选择依据请求头
Accept-Language(如zh-CN→ 返回中文提示),未匹配则 fallback 到默认语言 - 响应体结构强制统一:
{ "code": "USER_NOT_FOUND", "status": 404, "message": "用户不存在", "timestamp": "2026-09-25T01:28:00Z" }
跨服务调用时保留语义透传
Feign 或 Dubbo 调用失败后,不能简单包装成 RuntimeException,必须还原原始错误码语义:
- 下游返回标准错误响应体,Feign Client 解析后封装为 RemoteServiceException,携带原始
code和message - 上游服务捕获该异常后,可选择原样透传(网关层做统一翻译),或按自身规则映射(如将支付服务的
PAY_TIMEOUT映射为订单服务的ORDER_PAYMENT_TIMEOUT) - 链路追踪中需把
errorCode打入 MDC 或 Sleuth 的 trace context,便于日志聚合与问题定位
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










