摘要:以子模块的方式搭建部分通常我们会定义一系列业务错误码错误码是放在还是好呢当然是放在好呢因为不用每次一修改业务错误码就要更新版本但是又不能反过来依赖怎么办呢增强里面有一个抛出异常增强用它来转发一下和就行了加入依赖定义切面配置可以看到切面就
以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增强里面有一个抛出异常增强,用它来转发一下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 APIResultimplements Serializable{ public int code; public T data; public String msg; public APIResult() { } ... }
server
public class ServerResultextends 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
摘要:前言记录对于自定义异常的处理方式实现目标服务层异常,直接向上层抛出,层统一捕获处理如果是系统自定义异常,则返回其中对应为错误码,对应为异常信息如果非系统自定义异常,返回未知错误,同时将异常堆栈信息输出到日志便于定位问题项目架构先来张系统架 showImg(https://segmentfault.com/img/remote/1460000017782781?w=768&h=506);...
摘要:代码根据服务提供者和服务调用方法名,获取。代码根据服务提供者配置的最大并发度,创建该服务该方法对应的信号量对象。总结是控制消费端对单个服务提供者单个服务允许调用的最大并发度。 本文将详细分析< dubbo:service executes=/>与< dubbo:reference actives = />的实现机制,深入探...
摘要:集群用途是将多个服务提供者合并为一个,并将这个暴露给服务消费者。比如发请求,接受服务提供者返回的数据等。如果包含,表明对应的服务提供者可能因网络原因未能成功提供服务。如果不包含,此时还需要进行可用性检测,比如检测服务提供者网络连通性等。 1.简介 为了避免单点故障,现在的应用至少会部署在两台服务器上。对于一些负载比较高的服务,会部署更多台服务器。这样,同一环境下的服务提供者数量会大于1...
摘要:失败安全,出现异常时,直接忽略。失败自动恢复,在调用失败后,返回一个空结果给服务提供者。源码分析一该类实现了接口,是集群的抽象类。 集群——cluster 目标:介绍dubbo中集群容错的几种模式,介绍dubbo-cluster下support包的源码。 前言 集群容错还是很好理解的,就是当你调用失败的时候所作出的措施。先来看看有哪些模式: showImg(https://segmen...
摘要:支持两种服务导出方式,分别延迟导出和立即导出。本文打算分析服务延迟导出过程,因此不会分析方法。服务导出之前,要进行对一系列的配置进行检查,以及生成。返回时,表示需要延迟导出。赛程预告,下一站是服务导出的前置工作。 1.服务导出过程 本篇文章,我们来研究一下 Dubbo 导出服务的过程。Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服...
阅读 2311·2021-11-23 09:51
阅读 3748·2021-11-11 10:57
阅读 1391·2021-10-09 09:43
阅读 2481·2021-09-29 09:35
阅读 2013·2019-08-30 15:54
阅读 1788·2019-08-30 15:44
阅读 3179·2019-08-30 13:20
阅读 1687·2019-08-30 11:19