微服务中需统一前后端异常协议,定义标准JSON错误结构(含code、message、details等字段),各服务通过全局异常处理器转换异常,网关兜底收敛,前端用拦截器统一处理。
在微服务架构中,统一前后端交互的异常协议,核心是让所有服务返回结构一致、语义清晰的错误响应,前端能按约定解析,避免因各服务异常格式不一致导致的兼容问题和重复处理逻辑。
定义标准化错误响应体
前后端共同约定一个 JSON 错误结构,例如:
其中:
•
code
是业务语义明确的字符串码(非 HTTP 状态码),如
、
,便于前端做精准分支处理;
•
message
是面向用户的简明提示,由后端国际化或按 locale 动态生成;
•
details
可选,携带上下文数据(如失败字段、建议重试时间),供前端增强交互或上报日志;
• 避免直接暴露堆栈、内部类名、数据库错误等敏感信息。
在各服务中统一拦截并转换异常
每个微服务应配置全局异常处理器(如 Spring Boot 的
),将各类异常映射为标准错误响应:
捕获自定义业务异常(如
),转为
响应;
对受检异常(如远程调用超时)、系统异常(如
),统一降级为通用错误码(如
),并记录完整日志供排查;
HTTP 状态码仍需合理使用:4xx 表示客户端问题(如 400 Bad Request 对应参数校验失败),5xx 表示服务端问题(如 503 Service Unavailable),但不依赖它传递业务含义——
业务语义全由 response body 中的 code 承载
。
通过网关层做兜底与收敛
API 网关(如 Spring Cloud Gateway、Kong)是统一异常出口的关键节点:
若下游服务未按规范返回错误(如返回了原始 HTML 错误页或空响应),网关应拦截并重写为标准错误格式;
可集中处理跨服务共性错误,如鉴权失败统一返回
,屏蔽各服务内部实现差异;
添加请求 ID(
)到响应头,方便前后端联查问题,同时在错误体中透传,提升可观测性。
前端配合:封装统一错误处理模块
前端不应手动解析每个接口的 error response,而应建立拦截器(如 Axios interceptor)自动处理:
根据
触发对应提示策略:如
自动跳登录页;
显示倒计时重试;
对未知
,记录上报监控平台,并展示默认友好提示(如“操作失败,请稍后重试”);
结合
字段动态渲染表单错误(如后端返回
),避免前端硬编码校验逻辑。
{
"code": "USER_NOT_FOUND",
"message": "用户不存在",
"details": {"userId": "12345"},
"timestamp": "2024-06-15T10:22:33.123Z"
}ORDER_TIMEOUTINSUFFICIENT_STOCK@ControllerAdviceUserNotFoundExceptioncode="USER_NOT_FOUND"NullPointerExceptionSYSTEM_ERRORcode="UNAUTHORIZED"X-Request-IDresponse.data.code"TOKEN_EXPIRED""RATE_LIMIT_EXCEEDED"codedetails{"field": "email", "reason": "invalid_format"}