dubbo自定義異常的完整步驟與測(cè)試
前言
在很多公司,使用dubbo做微服務(wù)治理也是很常見(jiàn)的一種方式,簡(jiǎn)單來(lái)說(shuō),就是服務(wù)提供者一方將服務(wù)注冊(cè)并發(fā)布到注冊(cè)中心,消費(fèi)者訂閱服務(wù),然后像調(diào)用本地接口一樣;
但是在實(shí)際實(shí)踐中,經(jīng)常有這么一種場(chǎng)景,就是對(duì)于服務(wù)消費(fèi)者來(lái)說(shuō),當(dāng)調(diào)用服務(wù)生產(chǎn)者的服務(wù)接口時(shí),一旦服務(wù)提供者的接口拋出異常,如果消費(fèi)端不使用 try-catch 捕捉的話,在進(jìn)行問(wèn)題排查、故障分析時(shí),將會(huì)是個(gè)頭疼的問(wèn)題;
對(duì)于消費(fèi)端來(lái)說(shuō),不可能在所有的調(diào)用dubbo接口的地方都用 try-catch進(jìn)行包裹吧?有沒(méi)有一種辦法,用來(lái)統(tǒng)一處理這樣的服務(wù)接口調(diào)用異常方式呢?答案是肯定的,可以使用dubbo自定義過(guò)濾器,通過(guò)過(guò)濾器統(tǒng)一攔截調(diào)用異常問(wèn)題;
操作步驟
一、創(chuàng)建一個(gè)公共的用于處理異常的工程
ComnonFilter 類(lèi),只需要實(shí)現(xiàn)dubbo提供的Filter 接口即可
package com.congge.filter; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.rpc.*; import org.apache.dubbo.rpc.service.GenericService; import java.util.Date; @Activate(group = {Constants.PROVIDER,Constants.CONSUMER}) public class CommonFilter implements Filter { @Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { Result result = null; try { result = invoker.invoke(invocation); if (result.hasException() && GenericService.class != invoker.getInterface()) { Throwable exception = result.getException(); String data = String.format("\r\n[level]:Error,[createTime]:%s,[serviceName]:%s,[methodName]:%s,[inputParam]:%s", DateUtil.formatDateTime(new Date()), invoker.getInterface().getName(), invocation.getMethodName(), JSON.toJSONString(invocation.getArguments())); System.out.println(data); System.out.println(exception); } }catch (RuntimeException e){ String data = String.format("\r\n[level]:Error," + "[createTime]:%s," + "[serviceName]:%s," + "[methodName]:%s," + "[inputParam]:%s", DateUtil.formatDateTime(new Date()), invoker.getInterface().getName(), invocation.getMethodName(), JSON.toJSONString(invocation.getArguments())); System.out.println(data); System.out.println(e); } return result; } }
在resources目錄下創(chuàng)建相關(guān)的目錄,注意文件路徑和文件名稱(chēng)是固定的,文件內(nèi)容如下
二、生產(chǎn)端配置文件改造
1、pom中導(dǎo)入上面這個(gè)公共依賴(lài)的maven工程坐標(biāo),然后在配置文件中,將過(guò)濾器的名稱(chēng)配置進(jìn)去
2、生產(chǎn)端提供的服務(wù)中手動(dòng)添加一個(gè)異常
三、消費(fèi)端配置
消費(fèi)端暫時(shí)無(wú)需做其他配置
import com.congge.service.HelloService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.io.IOException; public class ConsumerMain { public static void main(String[] args) throws Exception { ApplicationContext ac = new ClassPathXmlApplicationContext("spring-consumer.xml"); HelloService service = (HelloService) ac.getBean("helloService"); String hello = service.hello("Hello Provider"); System.out.println(hello); } }
測(cè)試
1、啟動(dòng)本地的zk服務(wù)
2、啟動(dòng)生產(chǎn)端服務(wù)
3、啟動(dòng)消費(fèi)端服務(wù)模擬服務(wù)調(diào)用
消費(fèi)端報(bào)出的異常信息
由于我們將過(guò)濾器配置在生產(chǎn)端了,這時(shí)再去觀察生產(chǎn)端的控制臺(tái),可以看到,調(diào)用異常的信息也輸出了
使用場(chǎng)景說(shuō)明
通常來(lái)說(shuō),在微服務(wù)的調(diào)用鏈路比較長(zhǎng)的時(shí)候,在消費(fèi)端采用上面的方式進(jìn)行配置,是有一定意義的,可以較快的定位到調(diào)用的服務(wù)接口,以及拋出的具體的問(wèn)題原因,便于服務(wù)提供者快速進(jìn)行問(wèn)題定位和修復(fù)
總結(jié)
到此這篇關(guān)于dubbo自定義異常的文章就介紹到這了,更多相關(guān)dubbo自定義異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring中的NamespaceHandler加載過(guò)程源碼詳解
這篇文章主要介紹了Spring中的NamespaceHandler加載過(guò)程源碼詳解,Spring提供的NamespaceHandler的處理機(jī)制,簡(jiǎn)單來(lái)說(shuō)就是命名空間處理器,Spring為了開(kāi)放性提供了NamespaceHandler機(jī)制,這樣我們就可以根據(jù)需求自己來(lái)處理我們?cè)O(shè)置的標(biāo)簽元素,需要的朋友可以參考下2024-02-02SpringAop自定義切面注解、自定義過(guò)濾器及ThreadLocal詳解
這篇文章主要介紹了SpringAop自定義切面注解、自定義過(guò)濾器及ThreadLocal詳解,Aspect(切面)通常是一個(gè)類(lèi),里面可以定義切入點(diǎn)和通知(切面 = 切點(diǎn)+通知),execution()是最常用的切點(diǎn)函數(shù),需要的朋友可以參考下2024-01-01SpringBoot詳解整合Spring?Boot?Admin實(shí)現(xiàn)監(jiān)控功能
這篇文章主要介紹了SpringBoot整合Spring?Boot?Admin實(shí)現(xiàn)服務(wù)監(jiān)控,內(nèi)容包括Server端服務(wù)開(kāi)發(fā),Client端服務(wù)開(kāi)發(fā)其中Spring?Boot?Admin還可以對(duì)其監(jiān)控的服務(wù)提供告警功能,如服務(wù)宕機(jī)時(shí),可以及時(shí)以郵件方式通知運(yùn)維人員,感興趣的朋友跟隨小編一起看看吧2022-07-07三種SpringBoot中實(shí)現(xiàn)異步調(diào)用的方法總結(jié)
Spring Boot 提供了多種方式來(lái)實(shí)現(xiàn)異步任務(wù),這篇文章主要為大家介紹了常用的三種實(shí)現(xiàn)方式,文中的示例代碼講解詳細(xì),需要的可以參考一下2023-05-05Springboot簡(jiǎn)單熱部署實(shí)現(xiàn)步驟解析
這篇文章主要介紹了Springboot簡(jiǎn)單熱部署實(shí)現(xiàn)步驟解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12SpringBoot加入Guava Cache實(shí)現(xiàn)本地緩存代碼實(shí)例
這篇文章主要介紹了SpringBoot加入Guava Cache實(shí)現(xiàn)本地緩存代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Java常用類(lèi)庫(kù)Apache Commons工具類(lèi)說(shuō)明及使用實(shí)例詳解
這篇文章主要介紹了Java常用類(lèi)庫(kù)Apache Commons工具類(lèi)說(shuō)明及使用實(shí)例詳解,需要的朋友可以參考下2020-02-02Python中scrapy框架的ltem和scrapy.Request詳解
這篇文章主要介紹了Python中scrapy框架的ltem和scrapy.Request詳解,Item是保存爬取數(shù)據(jù)的容器,它的使用方法和字典類(lèi)似,不過(guò),相比字典,Item提供了額外的保護(hù)機(jī)制,可以避免拼寫(xiě)錯(cuò)誤或者定義字段錯(cuò)誤,需要的朋友可以參考下2023-09-09Java非阻塞I/O模型之NIO相關(guān)知識(shí)總結(jié)
在了解NIO (Non-Block I/O) 非阻塞I/O模型之前,我們可以先了解一下原始的BIO(Block I/O) 阻塞I/O模型,NIO模型能夠以非阻塞的方式更好的利用服務(wù)器資源,需要的朋友可以參考下2021-05-05