老姜博客了解更多:Response约定
1 Response定义
推荐使用如下格式:
package cn.com.bestpay;
public class Response<T> implements Serializable{
private Boolean success;
private String errorCode;
private String errorMsg;
private T body;
// 原错误码
private String primaryErrorCode;
// 原错误信息
private String primaryErrorMsg;
// 错误ip
private String primaryErrorIp;
}
2 Response设值规范
2.1 success
success = true
: 业务正常受理成功
success = false
: 业务受理失败情况,包括如下场景:业务数据异常(脏数据等)、配置异常、执行异常、网络异常、数据库异常,中间件异常以及外部异常等等.
2.2 errorCode
当success=false
时设置,errorCode由各应用自己定义当前错误分配的错误码.
建议各系统定义唯一的BusiEnum枚举进行统一维护,示例代码:
import lombok.Getter;
public enum BusiError {
REQUEST_ARGS_INVALID("00001", "请求参数无效,请重新确认后重试"),
SYSTEM_CONFIG_WRONG("00002", "系统配置错误"),
INNER_ERROR("10000", "系统内部错误"),
RISK_ENGINE_EXECUTE_ERROR("10001", "风控决策引擎执行错误"),
@Getter
private String errorCode;
@Getter
private String errorMsg;
BusiError(String errorCode,String errorMsg){
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
}
2.3 errorMsg
当success=false
时设置,同errorCode,各应用自己定义当前错误码应该提示的错误描述
2.4 primaryError*
这块大家要注意:primaryErrorCode、primaryErrorMsg, primaryErrorIp这三个的使用场景和目的.
场景:分布式微服务应用下,一个应用请求往往整个链路经过多个系统,任何环节都会出现问题,为了快速暴露出现问题的节点,设置以上三个字段用来向上传递最根源的问题.
目的:快速定位请求调用链路哪个环节出现问题
示例:
A —> B —> C —> D(发生异常)
说明:A应用是面向客户的接口,整个请求调用链上经过B、C、D应用,在D应用发生验证异常了,导致请求无法处理,报错给前端,那错误码设置流程为:
D
:该应用是问题发生的最初的位置,所以对于D应用
primaryErrorCode = errorCode(D应用当前错误对外约定的错误码)
primaryErrorMsg = errorMsg(D应用当前错误对外约定的错误信息)
primaryErrorIp = IPUtil.getServerIp()
C
: C应用拿到D应用的错误信息返回值后,根据自己的业务规则,设置当前异常情况下Response的errorCode, errorMsg.
但是此时 primaryErrorCode、primaryErrorMsg、primaryErrorIp的值是D的Response里面的取值
B, A
: 同 C
的处理一致
3 Response处理规范
调用外部服务时,对Response的处理流程如下:
Response<XXXDTO> response = yyyFacade.xxApi(request);
if (response.isSuccess()) {
// 请求受理成功
XXXDTO data = response.getBody();
//需检查body内容是否为null,避免空指针
if (data == null) {
} else {
}
} else {
//请求失败处理
}
了解更多