资讯专栏INFORMATION COLUMN

抛出dubbo中的异常

Travis / 530人阅读

摘要:以子模块的方式搭建部分通常我们会定义一系列业务错误码错误码是放在还是好呢当然是放在好呢因为不用每次一修改业务错误码就要更新版本但是又不能反过来依赖怎么办呢增强里面有一个抛出异常增强用它来转发一下和就行了加入依赖定义切面配置可以看到切面就

以maven子模块的方式搭建

    cn.theviper
    dubbo-exception
    pom
    1.0

    
        api
        server
    

api部分

public class APIException extends RuntimeException implements Serializable{

    public int code;
    public String msg;

    public APIException(String msg) {
        super(msg);
    }

    public APIException(int code, String msg) {
        super(msg);
        this.code = code;
        this.msg = msg;
    }
    ...
}

通常我们会定义一系列业务错误码

public enum APICode {

    OK(Integer.valueOf(0), "success"),
    PARAM_INVALID(4100, "parameter invalid");

    private int code;
    private String msg;

    APICode(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    getter setter...

}

错误码是放在server还是api好呢?
当然是放在server好呢,因为不用每次一修改业务错误码,就要更新api版本,但是api又不能反过来依赖server,怎么办呢?

spring aop

spring aop增强里面有一个抛出异常增强,用它来转发一下code和msg就行了

server加入依赖


    
        org.aspectj
        aspectjweaver
        1.8.9
    

server定义切面

@Component
@Aspect
public class ServiceExceptionInterceptor {

    private static final Logger logger = LoggerFactory.getLogger(ServiceExceptionInterceptor.class);

    @AfterThrowing(throwing="ex",pointcut="execution(* cn.theviper.service.**.*(..))")
    public APIResult handle(ServiceException ex){
        logger.info("intercept ServiceException:{}",ex.toString());
        throw new APIException(ex.getCode(),ex.getMsg());
    }

}

spring配置

可以看到,切面就是拦截了ServiceException,把ServiceException里面的code,msg又传给APIException了

返回的结果

错误码放在server带来一个新的问题,api的返回结果往往会用到这个错误码,怎么办呢?
用继承就好了

api

    APIResult register(RegisterForm form) throws APIException;
public class APIResult implements Serializable{

    public int code;
    public T data;
    public String msg;

    public APIResult() {
    }
    ...

}

server

public class ServerResult extends APIResult{

    public ServerResult() {
    }

    public ServerResult(APICode apiCode){
        this.code=apiCode.getCode();
        this.msg=apiCode.getMsg();
    }

    public ServerResult setData(T data){
        super.data=data;
        return this;
    }

}

返回的时候,直接

return new ServerResult(APICode.OK).setData("callback msg");

关于dubbo的异常分析,可以参见浅谈dubbo的ExceptionFilter异常处理

下载

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66988.html

相关文章

  • Dubbo 自定义异常,你是怎么处理的?

    摘要:前言记录对于自定义异常的处理方式实现目标服务层异常,直接向上层抛出,层统一捕获处理如果是系统自定义异常,则返回其中对应为错误码,对应为异常信息如果非系统自定义异常,返回未知错误,同时将异常堆栈信息输出到日志便于定位问题项目架构先来张系统架 showImg(https://segmentfault.com/img/remote/1460000017782781?w=768&h=506);...

    dingding199389 评论0 收藏0
  • Dubbo 源码分析20 Dubbo服务提供者、服务消费者并发度控制机制

    摘要:代码根据服务提供者和服务调用方法名,获取。代码根据服务提供者配置的最大并发度,创建该服务该方法对应的信号量对象。总结是控制消费端对单个服务提供者单个服务允许调用的最大并发度。 本文将详细分析< dubbo:service executes=/>与< dubbo:reference actives = />的实现机制,深入探...

    不知名网友 评论0 收藏0
  • Dubbo 源码分析 - 集群容错之 Cluster

    摘要:集群用途是将多个服务提供者合并为一个,并将这个暴露给服务消费者。比如发请求,接受服务提供者返回的数据等。如果包含,表明对应的服务提供者可能因网络原因未能成功提供服务。如果不包含,此时还需要进行可用性检测,比如检测服务提供者网络连通性等。 1.简介 为了避免单点故障,现在的应用至少会部署在两台服务器上。对于一些负载比较高的服务,会部署更多台服务器。这样,同一环境下的服务提供者数量会大于1...

    denson 评论0 收藏0
  • dubbo源码解析(三十五)集群——cluster

    摘要:失败安全,出现异常时,直接忽略。失败自动恢复,在调用失败后,返回一个空结果给服务提供者。源码分析一该类实现了接口,是集群的抽象类。 集群——cluster 目标:介绍dubbo中集群容错的几种模式,介绍dubbo-cluster下support包的源码。 前言 集群容错还是很好理解的,就是当你调用失败的时候所作出的措施。先来看看有哪些模式: showImg(https://segmen...

    gself 评论0 收藏0
  • Dubbo 源码分析 - 服务导出

    摘要:支持两种服务导出方式,分别延迟导出和立即导出。本文打算分析服务延迟导出过程,因此不会分析方法。服务导出之前,要进行对一系列的配置进行检查,以及生成。返回时,表示需要延迟导出。赛程预告,下一站是服务导出的前置工作。 1.服务导出过程 本篇文章,我们来研究一下 Dubbo 导出服务的过程。Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服...

    刘玉平 评论0 收藏0

发表评论

0条评论

Travis

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<