摘要:以子模塊的方式搭建部分通常我們會定義一系列業(yè)務(wù)錯誤碼錯誤碼是放在還是好呢當(dāng)然是放在好呢因為不用每次一修改業(yè)務(wù)錯誤碼就要更新版本但是又不能反過來依賴怎么辦呢增強里面有一個拋出異常增強用它來轉(zhuǎn)發(fā)一下和就行了加入依賴定義切面配置可以看到切面就
以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; } ... }
通常我們會定義一系列業(yè)務(wù)錯誤碼
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好呢?
當(dāng)然是放在server好呢,因為不用每次一修改業(yè)務(wù)錯誤碼,就要更新api版本,但是api又不能反過來依賴server,怎么辦呢?
spring aop增強里面有一個拋出異常增強,用它來轉(zhuǎn)發(fā)一下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了
返回的結(jié)果錯誤碼放在server帶來一個新的問題,api的返回結(jié)果往往會用到這個錯誤碼,怎么辦呢?
用繼承就好了
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");
關(guān)于dubbo的異常分析,可以參見淺談dubbo的ExceptionFilter異常處理
下載
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/66988.html
摘要:前言記錄對于自定義異常的處理方式實現(xiàn)目標(biāo)服務(wù)層異常,直接向上層拋出,層統(tǒng)一捕獲處理如果是系統(tǒng)自定義異常,則返回其中對應(yīng)為錯誤碼,對應(yīng)為異常信息如果非系統(tǒng)自定義異常,返回未知錯誤,同時將異常堆棧信息輸出到日志便于定位問題項目架構(gòu)先來張系統(tǒng)架 showImg(https://segmentfault.com/img/remote/1460000017782781?w=768&h=506);...
摘要:代碼根據(jù)服務(wù)提供者和服務(wù)調(diào)用方法名,獲取。代碼根據(jù)服務(wù)提供者配置的最大并發(fā)度,創(chuàng)建該服務(wù)該方法對應(yīng)的信號量對象。總結(jié)是控制消費端對單個服務(wù)提供者單個服務(wù)允許調(diào)用的最大并發(fā)度。 本文將詳細(xì)分析< dubbo:service executes=/>與< dubbo:reference actives = />的實現(xiàn)機制,深入探...
摘要:集群用途是將多個服務(wù)提供者合并為一個,并將這個暴露給服務(wù)消費者。比如發(fā)請求,接受服務(wù)提供者返回的數(shù)據(jù)等。如果包含,表明對應(yīng)的服務(wù)提供者可能因網(wǎng)絡(luò)原因未能成功提供服務(wù)。如果不包含,此時還需要進(jìn)行可用性檢測,比如檢測服務(wù)提供者網(wǎng)絡(luò)連通性等。 1.簡介 為了避免單點故障,現(xiàn)在的應(yīng)用至少會部署在兩臺服務(wù)器上。對于一些負(fù)載比較高的服務(wù),會部署更多臺服務(wù)器。這樣,同一環(huán)境下的服務(wù)提供者數(shù)量會大于1...
摘要:失敗安全,出現(xiàn)異常時,直接忽略。失敗自動恢復(fù),在調(diào)用失敗后,返回一個空結(jié)果給服務(wù)提供者。源碼分析一該類實現(xiàn)了接口,是集群的抽象類。 集群——cluster 目標(biāo):介紹dubbo中集群容錯的幾種模式,介紹dubbo-cluster下support包的源碼。 前言 集群容錯還是很好理解的,就是當(dāng)你調(diào)用失敗的時候所作出的措施。先來看看有哪些模式: showImg(https://segmen...
摘要:支持兩種服務(wù)導(dǎo)出方式,分別延遲導(dǎo)出和立即導(dǎo)出。本文打算分析服務(wù)延遲導(dǎo)出過程,因此不會分析方法。服務(wù)導(dǎo)出之前,要進(jìn)行對一系列的配置進(jìn)行檢查,以及生成。返回時,表示需要延遲導(dǎo)出。賽程預(yù)告,下一站是服務(wù)導(dǎo)出的前置工作。 1.服務(wù)導(dǎo)出過程 本篇文章,我們來研究一下 Dubbo 導(dǎo)出服務(wù)的過程。Dubbo 服務(wù)導(dǎo)出過程始于 Spring 容器發(fā)布刷新事件,Dubbo 在接收到事件后,會立即執(zhí)行服...
閱讀 2311·2021-11-23 09:51
閱讀 3748·2021-11-11 10:57
閱讀 1391·2021-10-09 09:43
閱讀 2481·2021-09-29 09:35
閱讀 2014·2019-08-30 15:54
閱讀 1788·2019-08-30 15:44
閱讀 3179·2019-08-30 13:20
閱讀 1687·2019-08-30 11:19