前言
记录Dubbo对于自定义异常的处理方式.
实现目标服务层异常,直接向上层抛出,web层统一捕获处理
如果是系统自定义异常,则返回{"code":xxx,"msg":yyy} 其中code对应为错误码,msg对应为异常信息
如果非系统自定义异常,返回{"code":-1,"msg":"未知错误"},同时将异常堆栈信息输出到日志,便于定位问题
项目架构
先来张系统架构图吧,这张图来源自网络,相信现在大部分中小企业的分布式集群架构都是类似这样的设计:
简要说明下分层架构:通常情况下会有专门一台堡垒机做统一的代理转发,客户端(pc,移动端等)访问由nginx统一暴露的入口
nginx反向代理,负载均衡到web服务器,由tomcat组成的集群,web层仅仅是作为接口请求的入口,没有实际的业务逻辑
web层再用rpc远程调用注册到zookeeper的dubbo服务集群,dubbo服务与数据层交互,处理业务逻辑
前后端分离,使用json格式做数据交互,格式可以统一如下:1 {
2 "code": 200, //状态码:200成功,其他为失败
3 "msg": "success", //消息,成功为success,其他为失败原因
4 "data": object //具体的数据内容,可以为任意格式
5 }
映射为javabean可以统一定义为:1/**
2 * @program: easywits
3 * @description: http请求 返回的最外层对象
4 * @author: zhangshaolin
5 * @create: 2018-04-27 10:43
6 **/
7@Data
8@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
9public class BaseResult implements Serializable{
10
11 private static final long serialVersionUID = -6959952431964699958L;
12
13 /**
14 * 状态码:200成功,其他为失败
15 */
16 public Integer code;
17
18 /**
19 * 成功为success,其他为失败原因
20 */
21 public String msg;
22
23 /**
24 * 具体的内容
25 */
26 public T data;
27}
返回结果工具类封装:1/**
2 * @program: easywits
3 * @description: http返回结果工具类
4 * @author: zhangshaolin
5 * @create: 2018-07-14 13:38
6 **/
7public class ResultUtil {
8
9 /**
10 * 访问成功时调用 包含data
11 * @param object
12 * @return
13 */
14 public static BaseResult success(Object object){
15 BaseResult result = new BaseResult();
16 result.setCode(200);
17 result.setMsg("success");
18 result.setData(object);
19 return result;
20 }
21
22 /**
23 * 访问成功时调用 不包含data
24 * @return
25 */
26 public static BaseResult success(){
27 return success(null);
28 }
29
30 /**
31 * 返回异常情况 不包含data
32 * @param code
33 *