springboot dubbo3 學(xué)習(xí)-全局異常處理過濾器

版本
spring boot: 3.4.1
dubbo:3.3.1
java17

官方文檔

1,過濾器代碼


import jakarta.validation.ValidationException;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.*;
import org.springframework.validation.BindException;

/**
 * dubbo統(tǒng)一異常處理過濾器
 */
@Slf4j
@Activate(group = {CommonConstants.PROVIDER}, order = 1)
public class ExceptionFilter implements Filter, Filter.Listener {

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        Result appResponse;
        try {
            appResponse = invoker.invoke(invocation);
        } catch (Throwable e) {
            appResponse = AsyncRpcResult.newDefaultAsyncResult(e, invocation);
            onResponse(appResponse, invoker, invocation);
        }

        return appResponse;
    }

    @Override
    public void onResponse(Result appResponse, Invoker<?> invoker, Invocation invocation) {
        Throwable exception = appResponse.getException();
        if (exception != null) {
            log.info("Dubbo統(tǒng)一異常處理過濾器");

            // 取得底層真實異常
            // 異步線程異常 是包裝過的
            // 在dubbo自帶ExceptionFilter 包裝過某些異常
            while (exception != null) {
                if (exception.getCause() != null) {
                    exception = exception.getCause();
                } else {
                    break;
                }
            }

            appResponse.setException(null);

            if(exception instanceof ValidationException ve) {
                // 參數(shù)校驗異常
                appResponse.setValue(GlobalExceptionHandler.getValidExceptionMsg(ve));
            } else if (exception instanceof BindException e) {
                // 參數(shù)校驗異常
                appResponse.setValue(GlobalExceptionHandler.getBindExceptionMsg(e));
            } else if (exception instanceof BizException e) {
                // 業(yè)務(wù)自定義異常
                appResponse.setValue(e.getRpcResult());
            } else if (exception instanceof Exception e) {
                appResponse.setValue(GlobalExceptionHandler.exceptionHandler(e));
            }
        }
    }

    @Override
    public void onError(Throwable t, Invoker<?> invoker, Invocation invocation) {

    }
}


說明:

  • 1,@Activate(group = {CommonConstants.PROVIDER}, order = 1) 這個一定要有张弛,是激活該過濾器用的。配置文件里是加載而克。order 盡量小一點(diǎn),越小的越靠前執(zhí)行
  • 2怔毛,業(yè)務(wù)邏輯不要寫在invoke方法里员萍,要寫在onResponse方法里,因為onResponse是dubbo異步調(diào)用的回調(diào)方法
  • 3拣度,如果你想返回錯誤信息就appResponse.setException(null);appResponse.setValue(錯誤信息)
  • 4碎绎,如果你想繼續(xù)拋出異常就appResponse.setException(你的異常)

2,配置文件

dubbo:
  protocol:
    name: tri
    port: 10003
  provider:
    export: true
    filter:
      - "loginAuthFilter,exceptionFilter"
      #- "-exception"
    validation: true

  consumer:
    #關(guān)閉服務(wù)檢查 如果依賴的服務(wù)掛了 不影響調(diào)用
    check: false
    timeout: 300
    # 負(fù)載均衡策略 默認(rèn)random(加權(quán)隨機(jī)) 修改成輪詢
    loadbalance: roundrobin
    # 重試次數(shù) 根據(jù)服務(wù)provider端服務(wù)器數(shù)量決定 用于查詢場景
    # 事務(wù)場景要設(shè)置為0
    retries: 0
    validation: true
    # 集群容錯模式 立即失敗 用于事務(wù)模式
    cluster: failfast

說明

  • 1抗果,filter配置筋帖,這里一定要寫 - "loginAuthFilter,exceptionFilter" 說明我加載了兩個自定義的過濾器

    - "-exception" 過濾器名前面帶個【-】是關(guān)閉這個過濾器

  • 2,dubbo自帶的異常過濾器不要關(guān)掉冤馏,它會幫你做一些事情

3日麸,org.apache.dubbo.rpc.Filter 文件

位置

src
 |-main
    |-java
        |-com
            |-xxx
                |-XxxFilter.java (實現(xiàn)Filter接口)
    |-resources
        |-META-INF
            |-dubbo
                |-org.apache.dubbo.rpc.Filter (純文本文件,內(nèi)容為:xxx=com.xxx.XxxFilter)

內(nèi)容

loginAuthFilter=com.zx.frame.filter.LoginAuthFilter
exceptionFilter=com.zx.frame.filter.ExceptionFilter

至此逮光,自定義過濾器完成

4代箭,問題與注意點(diǎn)

  • 不能在onResponse方法里打斷點(diǎn),一打斷點(diǎn)就會出現(xiàn)死循環(huán)涕刚,不知道什么原因
    解決辦法(雖然不知道為什么)
    是因為dubbo 在3.1.6 開始嗡综,開啟一個序列化檢查模式,這個檢查模式認(rèn)定EncodeException 為非法的序列化類杜漠,所以報錯
    但為什么會死循環(huán)還沒沒有搞清楚极景。明明EncodeException 是dubbo自帶的異常,也不是我定義的驾茴,不知道為什么就非法了盼樟。

具體請參照官方文檔(有解決方案):https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/tasks/security/class-check/
https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/serialization/serialization/

我采用的是比較極端的解決方案:關(guān)掉這個檢查

dubbo.application.serialize-check-status=DISABLE
  • validation 一點(diǎn)要provider端與consumer端都開啟,可以提升性能減少麻煩
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锈至,一起剝皮案震驚了整個濱河市晨缴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裹赴,老刑警劉巖喜庞,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異棋返,居然都是意外死亡延都,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門睛竣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晰房,“玉大人,你說我怎么就攤上這事射沟∈庹撸” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵验夯,是天一觀的道長猖吴。 經(jīng)常有香客問我,道長挥转,這世上最難降的妖魔是什么海蔽? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮绑谣,結(jié)果婚禮上党窜,老公的妹妹穿的比我還像新娘。我一直安慰自己借宵,他們只是感情好幌衣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著壤玫,像睡著了一般豁护。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垦细,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天择镇,我揣著相機(jī)與錄音,去河邊找鬼括改。 笑死腻豌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嘱能。 我是一名探鬼主播吝梅,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惹骂!你這毒婦竟也來了苏携?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤对粪,失蹤者是張志新(化名)和其女友劉穎右冻,沒想到半個月后装蓬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纱扭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年牍帚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乳蛾。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡暗赶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肃叶,到底是詐尸還是另有隱情蹂随,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布因惭,位于F島的核電站岳锁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蹦魔。R本人自食惡果不足惜浸锨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望版姑。 院中可真熱鬧柱搜,春花似錦、人聲如沸剥险。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽表制。三九已至健爬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間么介,已是汗流浹背娜遵。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留壤短,地道東北人设拟。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像久脯,于是被迫代替她去往敵國和親纳胧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

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