统一错误码管理平台设计
目标
- 集中管理,本地缓存:错误码由平台统一录入,但SDK必须在本地缓存,绝不能因为错误码平台挂了导致业务服务不可用。
- 无侵入性:SDK接入应尽可能简单(Starter方式),对业务代码改动最小。
- 多语言(i18n)支持:设计之初就要考虑国际化,不同Locale返回不同Message。
- 动态热更新:修改错误文案后,服务无需重启即可生效。
错误码规范设计
推荐格式:A-BB-CCC (例如:1001004)
| 组成部分 | 长度 | 说明 | 示例 |
|---|---|---|---|
| 错误来源 | 1位/2位 | 区分错误类型 | 1: 系统级/通用错误 (NPE, DB链接失败)2: 业务级错误 (余额不足) |
| 服务/模块 | 2位/3位 | 对应具体微服务 | 01: 用户服务;02: 订单服务 |
| 具体编码 | 3位 | 具体错误场景 | 001: 参数为空;002: 记录不存在 |
管理平台设计 (The Platform)
管理平台(ErrorCode Center, ECC)负责数据的增删改查和持久化。
数据库设计
CREATE TABLE `error_code` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`app_name` varchar(64) NOT NULL COMMENT '服务名,如 user-service',
`code` varchar(32) NOT NULL COMMENT '错误码,如 201001',
`message` varchar(255) NOT NULL COMMENT '默认错误信息',
`type` varchar(20) DEFAULT 'BIZ' COMMENT '类型:SYS-系统, BIZ-业务',
`severity` varchar(20) DEFAULT 'INFO' COMMENT '严重等级',
`solution` text COMMENT '给开发看的排查建议',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`code`)
);
sdk设计
通用异常处理
@Data
public class BizException extends RuntimeException {
private String code;
private Object[] args; // 支持动态参数,如 "参数 {0} 不能为空"
public BizException(String code, Object... args) {
this.code = code;
this.args = args;
}
}