最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Sentinel自定義異常的三種實(shí)現(xiàn)方式

 更新時間:2023年11月22日 10:00:35   作者:Java中文社群  
Spring Cloud Alibaba Sentinel 是目前主流并開源的流量控制和系統(tǒng)保護(hù)組件,Spring Cloud Alibaba Sentinel 有 3 種自定義異常的實(shí)現(xiàn)方式,本文小編將通過代碼示例給大家詳細(xì)的介紹這三種實(shí)現(xiàn)方式,需要的朋友可以參考下

Spring Cloud Alibaba Sentinel 是目前主流并開源的流量控制和系統(tǒng)保護(hù)組件,它提供了強(qiáng)大的限流、熔斷、熱點(diǎn)限流、授權(quán)限流和系統(tǒng)保護(hù)及監(jiān)控等功能。使用它可以輕松的保護(hù)我們微服務(wù),在高并發(fā)環(huán)境下的正常運(yùn)行。

那么,當(dāng)程序觸發(fā)了限流和熔斷規(guī)則時,如何自定義返回的異常信息呢?這是我們接下來要解決的問題。

0.概述

Spring Cloud Alibaba Sentinel 有以下 3 種自定義異常的實(shí)現(xiàn)方式:

  • 自定義局部異常
  • 自定義(Sentinel)全局異常
  • 自定義系統(tǒng)異常

以上這 3 種實(shí)現(xiàn)方式,都可以重新定義 Sentinel 的異常返回信息,它們的具體實(shí)現(xiàn)如下。

1.自定義局部異常

自定義局部異常是在使用 @SentinelResource 注解時,直接定義的 blockHandler 異常方法,如下代碼所示:

@SentinelResource(value = "/user/getuser",
            blockHandler = "myBlockHandler")
@RequestMapping("getuser")
public String getUser(Integer uid) {
    return "User:" + uid;
}

/**
 * 定義限流/熔斷等異常
 */
public String myBlockHandler(Integer uid, BlockException e) {
    String msg = "未知異常";
    if (e instanceof FlowException) {
        msg = "請求被限流了";
    } else if (e instanceof ParamFlowException) {
        msg = "請求被熱點(diǎn)參數(shù)限流";
    } else if (e instanceof DegradeException) {
        msg = "請求被降級了";
    } else if (e instanceof AuthorityException) {
        msg = "沒有權(quán)限訪問";
    }
    return msg;
}

注意事項

在定義 blockHandler 方法時,需要注意以下 3 個問題:

  • 自定義的 blockHandler 方法的返回值,必須要和原方法(使用 @SentinelResource 注解修飾的方法)的返回值保持一致。
  • 自定義的 blockHandler 方法的參數(shù)必須和原方法參數(shù)保持一致。
  • 自定義的 blockHandler 方法的方法參數(shù)中必須包含 BlockException 參數(shù)。

如果不滿足以上事項中的任何一項,那么就不能正常匹配到自定義的 blockHandler 方法,并且程序也會報錯。

2.自定義全局異常

自定義 Sentinel 全局異常需要實(shí)現(xiàn) BlockExceptionHandler 類,并重寫 handle 方法,如下代碼所示:

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;

@Component
public class SentinelExceptionHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
        String msg = "未知異常";
        int status = HttpStatus.TOO_MANY_REQUESTS.value();
        if (e instanceof FlowException) {
            msg = "請求被限流了";
        } else if (e instanceof ParamFlowException) {
            msg = "請求被熱點(diǎn)參數(shù)限流";
        } else if (e instanceof DegradeException) {
            msg = "請求被降級了";
        } else if (e instanceof AuthorityException) {
            msg = "沒有權(quán)限訪問";
            status = HttpStatus.UNAUTHORIZED.value();
        }
        response.setContentType("application/json;charset=utf-8");
        response.setStatus(status);
        response.getWriter().println("{\"msg\": " + msg + ", \"code\": " + status + "}");
    }
}

自定義 Sentinel 全局異常是在執(zhí)行 Sentinel 控制臺設(shè)置的限流和熔斷異常時,執(zhí)行的全局自定義異常方法。

但是,如果是程序中出現(xiàn)的 Sentinel 報錯信息,例如使用熱點(diǎn)限流時,因為要配合使用 @SentinelResource 注解時,此時只自定義了 value 屬性,未定義局部 blockHandler 方法,此時系統(tǒng)就會報錯,但這個時候并不會執(zhí)行 Sentinel 全局自定義異常,而是程序報錯,此時就需要使用系統(tǒng)自定義異常來重新定義異常信息了。

3.自定義系統(tǒng)異常

自定義系統(tǒng)異常需要新建一個異常類,并且使用 @RestControllerAdvice 注解修飾此類,并配合 @ExceptionHandler 注解來完成全局系統(tǒng)異常的獲取和定義,具體實(shí)現(xiàn)代碼如下:

import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.Map;


@RestControllerAdvice
public class CustomExceptionHandler {

    /**
     * 限流全局異常
     */
    @ExceptionHandler(FlowException.class)
    public Map handlerFlowException(){
        return new HashMap(){{
            put("code", HttpStatus.TOO_MANY_REQUESTS.value());
            put("msg", "被限流");
        }};
    }

    /**
     * 熔斷全局異常
     */
    @ExceptionHandler(DegradeException.class)
    public Map handlerDegradeException(){
        return new HashMap(){{
            put("code", HttpStatus.TOO_MANY_REQUESTS.value());
            put("msg", "被熔斷");
        }};
    }

    /**
     * 熱點(diǎn)限流異常
     */
    @ExceptionHandler(ParamFlowException.class)
    public Map handlerparamFlowException(){
        return new HashMap(){{
            put("code", HttpStatus.TOO_MANY_REQUESTS.value());
            put("msg", "熱點(diǎn)限流");
        }};
    }

    /**
     *  Sentinel 權(quán)限攔截全局異常
     */
    @ExceptionHandler(AuthorityException.class)
    @ResponseBody
    public Map handlerAuthorityException(){
        return new HashMap(){{
            put("code", HttpStatus.UNAUTHORIZED.value());
            put("msg", "暫無權(quán)限");
        }};
    }
}

此時,只要是系統(tǒng)中出現(xiàn)的 Sentinel 報錯信息,都會被此方法所捕獲,并通過自定義的代碼完成自定義異常信息的返回。

小結(jié)

Sentinel 有 3 種自定義異常的實(shí)現(xiàn):自定義局部異常、自定義(Sentinel)全局異常、自定義系統(tǒng)異常。自定義局部異常作用范圍比較小,需要給每個資源單獨(dú)設(shè)置才行;而自定義全局異常作用范圍比較大,但如果是程序報錯,也不會執(zhí)行其方法,所以需要配合系統(tǒng)異常同時來完成自定義異常的返回。

PS:如果這 3 種自定義異常同時存在,那么它的執(zhí)行優(yōu)先級是:自定義局部異常 > 自定義全局異常 > 自定義系統(tǒng)異常。

以上就是Sentinel自定義異常的三種實(shí)現(xiàn)方式的詳細(xì)內(nèi)容,更多關(guān)于Sentinel自定義異常的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring中的@AutoWired與@Resource及@Qualifier注解詳解

    Spring中的@AutoWired與@Resource及@Qualifier注解詳解

    這篇文章主要介紹了Spring中的@AutoWired與@Resource及@Qualifier注解詳解,spring不但支持自己定義的@Autowired注解,所以Autowired與Spring是強(qiáng)相關(guān)性,只能在spring框架中使用,而后幾個注解則不然,需要的朋友可以參考下
    2023-11-11
  • 深入解析Java多態(tài)進(jìn)階學(xué)習(xí)

    深入解析Java多態(tài)進(jìn)階學(xué)習(xí)

    java的動態(tài)綁定機(jī)制非常重要。這篇文章將帶大家更深入的學(xué)習(xí)一下Java的多態(tài),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下
    2022-07-07
  • Java調(diào)用ChatGPT API并實(shí)現(xiàn)流式接收方式(Server-Sent Events,SSE)

    Java調(diào)用ChatGPT API并實(shí)現(xiàn)流式接收方式(Server-Sent Events,SSE)

    文章介紹如何在Java中通過OkHttp和SSE技術(shù)實(shí)現(xiàn)流式獲取ChatGPT響應(yīng),解決傳統(tǒng)HTTP阻塞問題,提升用戶體驗,需配置stream參數(shù),利用SseEmitter封裝后端推送,前端使用EventSourcePolyfill插件處理Token,同時注意資源管理和避免換行符干擾
    2025-08-08
  • Spring Boot如何通過java -jar啟動

    Spring Boot如何通過java -jar啟動

    大家開發(fā)的基于Spring Boot 的應(yīng)用 ,jar形式, 發(fā)布的時候,絕大部分都是使用java -jar 啟動。本文主要介紹了Spring Boot如何通過java -jar啟動,一起來了解一下
    2021-05-05
  • RabbitMQ消息的延遲隊列詳解

    RabbitMQ消息的延遲隊列詳解

    這篇文章主要介紹了RabbitMQ消息的延遲隊列,延遲隊列也就是死信交換機(jī),有些隊列的消息成為死信后,消息中間件可以將其從當(dāng)前隊列發(fā)送到另一個隊列中,這個隊列就是死信隊列,感興趣的同學(xué)可以參考下文
    2024-02-02
  • Spring WebFlux使用深度實(shí)踐指南

    Spring WebFlux使用深度實(shí)踐指南

    本文詳細(xì)介紹了SpringWebFlux的使用,包括構(gòu)建ReactiveRESTAPI、響應(yīng)式數(shù)據(jù)庫訪問(R2DBC)和WebSocket實(shí)時通信,通過這些功能,開發(fā)者可以構(gòu)建高性能、可擴(kuò)展的響應(yīng)式Web應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • 利用Spring?boot+LogBack+MDC實(shí)現(xiàn)鏈路追蹤

    利用Spring?boot+LogBack+MDC實(shí)現(xiàn)鏈路追蹤

    這篇文章主要介紹了利用Spring?boot+LogBack+MDC實(shí)現(xiàn)鏈路追蹤,MDC?可以看成是一個與當(dāng)前線程綁定的哈希表,可以往其中添加鍵值對,下文詳細(xì)介紹需要的小伙伴可以參考一下
    2022-04-04
  • dubbo 如何使用logback來輸出日志

    dubbo 如何使用logback來輸出日志

    這篇文章主要介紹了dubbo 如何使用logback來輸出日志的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java ConcurrentHashMap用法案例詳解

    Java ConcurrentHashMap用法案例詳解

    這篇文章主要介紹了Java ConcurrentHashMap用法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java?LinkedHashMap與TreeMap示例詳解

    Java?LinkedHashMap與TreeMap示例詳解

    本文對比分析了Java中LinkedHashMap和TreeMap兩種Map實(shí)現(xiàn)類的特性與使用場景,本文結(jié)合實(shí)例代碼給大家介紹給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2026-05-05

最新評論

临湘市| 嘉黎县| 繁昌县| 木兰县| 正定县| 西宁市| 邵阳县| 浑源县| 沙坪坝区| 高州市| 依兰县| 北碚区| 麻城市| 开原市| 遂溪县| 巴中市| 富裕县| 沙河市| 古丈县| 郸城县| 石河子市| 偏关县| 二手房| 清河县| 岱山县| 五河县| 大荔县| 怀安县| 北流市| 淮北市| 长春市| 定边县| 六安市| 克拉玛依市| 同心县| 桐柏县| 小金县| 台安县| 田东县| 商都县| 交城县|