dubbo實(shí)踐1..異常處理

轉(zhuǎn)自:http://blog.csdn.net/wzl18/article/details/51249018

dubbo有自己的異常處理機(jī)制豫柬,當(dāng)服務(wù)端拋出一個(gè)dubbo可以處理傳遞的異常時(shí)霎箍,會(huì)直接在客戶(hù)端上再次拋出煌茴,由開(kāi)發(fā)者自己去處理。注意:這里說(shuō)的不是所有異常,而是dubbo可以處理傳遞的異常,具體這個(gè)后邊再說(shuō)包吝。

先看兩段代碼,接口代碼:

簡(jiǎn)單實(shí)現(xiàn):

這兩段代碼很簡(jiǎn)答源葫,先看getByNick方法诗越,根據(jù)用戶(hù)名稱(chēng)獲取用戶(hù)信息,里面有一個(gè)去空格的操作(主要為了觸發(fā)異常)息堂,正常調(diào)用是沒(méi)有問(wèn)題的嚷狞,但如果傳入null,就會(huì)拋出很常見(jiàn)且低級(jí)的空指針異常。我們看下調(diào)用代碼:

運(yùn)行后感耙,首先會(huì)打印{"id":0,"name":"某某"}褂乍,然后出現(xiàn)java.lang.NullPointerException持隧,一切在我們的預(yù)料內(nèi)即硼,dubbo把服務(wù)端的空指針異常傳遞給客戶(hù)端了。

正常來(lái)說(shuō)屡拨,空指針異常是不應(yīng)該出現(xiàn)的只酥,而且客戶(hù)端遇到這個(gè)錯(cuò)誤肯定直接懵了,所以我們做下簡(jiǎn)單的修改呀狼,服務(wù)端代碼:

客戶(hù)端再次調(diào)用結(jié)果:

結(jié)果友好了多裂允,甚至你可以直接對(duì)exception獲取異常信息作為輸出。

上邊提到過(guò)當(dāng)服務(wù)端拋出一個(gè)dubbo可以處理傳遞的異常時(shí)哥艇,會(huì)直接在客戶(hù)端上再次拋出绝编,但不是所有的異常都是dubbo可以處理傳遞的,如下邊的代碼:

這里我們模擬拋出了一個(gè)mybatis的異常貌踏,在客戶(hù)端調(diào)用會(huì)像上邊的結(jié)果一樣嗎十饥?答案是否定的,看下輸出結(jié)果:

不要感覺(jué)奇怪祖乳,這個(gè)也是在可以接受的范圍內(nèi)逗堵,因?yàn)镻ersistenceException異常類(lèi)在客戶(hù)端是不存在的,所以不可能接收到PersistenceException異常眷昆,dubbo把他進(jìn)行了封裝蜒秤。

針對(duì)這點(diǎn),在接口包中里面定義了一個(gè)全局的異常類(lèi)亚斋,注意一定是接口所在的工程中作媚,如:UicException(用戶(hù)模塊異常),這種方案也是官方建議的帅刊,服務(wù)端代碼如下:

錯(cuò)誤信息如下

這個(gè)正是我們想要的異常信息纸泡,上邊特別提到異常一定要在接口所在的工程中,如果異常類(lèi)不在接口工程中厚掷,而是在另一個(gè)服務(wù)端和客戶(hù)端都引入的包中呢弟灼?我們?cè)?jīng)碰到這樣一個(gè)情況,有一個(gè)common的異常類(lèi)放在一個(gè)很底層的工具包內(nèi)冒黑,接口工程引入了這個(gè)包田绑,在服務(wù)端拋出的異常都都是這個(gè)commonexception,一廂情愿的認(rèn)為客戶(hù)端會(huì)正常去捕獲處理commonexception抡爹。

但結(jié)果很意外掩驱,客戶(hù)端出現(xiàn)的異常跟上邊拋出的PersistenceException情況一樣,dubbo用RuntimException進(jìn)行了包裝,我們無(wú)法從異常中獲取有效的信息欧穴!遇到這種情況有點(diǎn)發(fā)懵民逼,這個(gè)異常類(lèi)在客戶(hù)端和服務(wù)端都有呀,為啥不能正確接收呢涮帘。還好之前看dubbo源碼的時(shí)候大概記得異常處理的位置拼苍,很好找到了目標(biāo)代碼:

看完源碼以后,做出了新的設(shè)計(jì)调缨,CommonException不變疮鲫,各個(gè)接口模塊(maven工程為單位)單獨(dú)定義異常對(duì)象繼承CommonException,每個(gè)模塊拋出自己的模塊異常(如用戶(hù)模塊拋出UicException)弦叶,客戶(hù)端中用CommonException統(tǒng)一捕獲處理俊犯。

這里還要定義兩個(gè)攔截器,首先是服務(wù)端伤哺,保證所有拋出的異常是當(dāng)前模塊的異常燕侠,代碼如下:

其次是客戶(hù)端的,保證異沉⒗颍可以正確的友好的輸出绢彤,所有CommonException可以直接輸出(獲取根據(jù)錯(cuò)誤碼獲取錯(cuò)誤信息),非CommonException異常根據(jù)自己需要去處理桃序,如果是dubbo自帶異痴认海肯定要屏蔽異常信息,如打印日志后輸出“網(wǎng)絡(luò)異趁叫埽”奇适。

還有另一種dubbo調(diào)用方案,普通service層外邊嵌套一層用來(lái)做dubbo的服務(wù)芦鳍,普通service層處理了事務(wù)之類(lèi)嚷往,dubbo服務(wù)層每一個(gè)方法都是客戶(hù)端要引用的,直接調(diào)用普通service層方法柠衅,但做了手動(dòng)的try catch處理皮仁,封裝自己的返回碼,客戶(hù)端只需要根據(jù)返回碼去做處理菲宴,這種開(kāi)發(fā)成本和文檔成本有點(diǎn)高贷祈,沒(méi)太深入去考慮。

以上是我自己工作中的dubbo異常實(shí)踐喝峦,以后會(huì)繼續(xù)寫(xiě)些其他的心得势誊,記錄自己的成長(zhǎng)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谣蠢,一起剝皮案震驚了整個(gè)濱河市粟耻,隨后出現(xiàn)的幾起案子查近,更是在濱河造成了極大的恐慌,老刑警劉巖挤忙,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霜威,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡册烈,警方通過(guò)查閱死者的電腦和手機(jī)戈泼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)茄厘,“玉大人矮冬,你說(shuō)我怎么就攤上這事〈喂” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵吆录,是天一觀(guān)的道長(zhǎng)窑滞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)恢筝,這世上最難降的妖魔是什么哀卫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮撬槽,結(jié)果婚禮上此改,老公的妹妹穿的比我還像新娘。我一直安慰自己侄柔,他們只是感情好共啃,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著暂题,像睡著了一般移剪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上薪者,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天纵苛,我揣著相機(jī)與錄音,去河邊找鬼言津。 笑死攻人,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悬槽。 我是一名探鬼主播怀吻,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼陷谱!你這毒婦竟也來(lái)了烙博?” 一聲冷哼從身側(cè)響起瑟蜈,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渣窜,沒(méi)想到半個(gè)月后铺根,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乔宿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年位迂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片详瑞。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掂林,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坝橡,到底是詐尸還是另有隱情泻帮,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布计寇,位于F島的核電站锣杂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏番宁。R本人自食惡果不足惜元莫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝶押。 院中可真熱鬧踱蠢,春花似錦、人聲如沸棋电。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)离陶。三九已至稼虎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間招刨,已是汗流浹背霎俩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沉眶,地道東北人打却。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像谎倔,于是被迫代替她去往敵國(guó)和親柳击。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理片习,服務(wù)發(fā)現(xiàn)捌肴,斷路器蹬叭,智...
    卡卡羅2017閱讀 134,704評(píng)論 18 139
  • 身影 舊影留駐眼前來(lái), 朱砂痣刻心事知。 衾寒不知身是客, 天上人間不相逢撰糠。
    空城錦閱讀 167評(píng)論 0 0
  • 吳軍得到直播課:揭秘前2%的人的進(jìn)階方法論 教大家使用洋槍洋炮代替大刀長(zhǎng)矛的能力。 人本身有很多先天不足比如說(shuō)數(shù)數(shù)...
    潭客富林的家閱讀 551評(píng)論 0 0
  • 兩臺(tái)可跟進(jìn): 1.胡小姐:嶺南新世界業(yè)主坦喘,想買(mǎi)一套別墅投資,之前來(lái)這邊看了一次西设,覺(jué)得距離有點(diǎn)遠(yuǎn)瓣铣,交通不是很便利,暫...
    陽(yáng)文斌閱讀 155評(píng)論 0 0
  • 年前的一天父親告訴我贷揽,我們村明年正月初八要演皮影戲了棠笑,每戶(hù)收15塊錢(qián)。我才記起我最近的一次看皮影擒滑,也是十年前了腐晾。這...
    爆爆爆閱讀 436評(píng)論 0 0