curl -i -X POST http://127.0.0.1:8080/api/users -d @no_name.json
curl -s -o /dev/null -w '%{http_code}\n' -X POST http://127.0.0.1:8080/api/users -d @no_name.json

前端反馈保存失败,抓包看到 HTTP 状态是 200,响应体是 code 500 和 name 不能为空,网关的成功率和错误率监控一周都没动静。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:全局异常处理把所有异常都包成 200 返回,业务码放在 body 里。HTTP 层看不出失败,监控、重试和告警全部失效。前端拦截器只按 status 判断,也只能弹通用错误。

「校验失败状态码」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

处理上按这个顺序:校验异常统一返回 400 业务异常按语义映射 404 409 422;响应体里保留 code 作为细分 但不再承担状态表达;改前端拦截器按 status 范围判断;用空 name 请求确认状态行是 400。

确认没问题再收工,同样请求返回 HTTP 400 网关错误率面板能看到这次失败。

作者 9823189