成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

三種Sentinel自定義異常,你用過幾種?

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

Spring Cloud Alibaba Sentinel 是目前主流并開源的流量控制和系統保護組件,它提供了強大的限流、熔斷、熱點限流、授權限流和系統保護及監控等功能。使用它可以輕松的保護我們微服務,在高并發環境下的正常運行。

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

一、概述

Spring Cloud Alibaba Sentinel 有以下 3 種自定義異常的實現方式:

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

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

二、自定義局部異常

自定義局部異常是在使用 @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 = "請求被熱點參數限流";
    } else if (e instanceof DegradeException) {
        msg = "請求被降級了";
    } else if (e instanceof AuthorityException) {
        msg = "沒有權限訪問";
    }
    return msg;
}

注意事項

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

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

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

三、自定義全局異常

自定義 Sentinel 全局異常需要實現 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 = "請求被熱點參數限流";
        } else if (e instanceof DegradeException) {
            msg = "請求被降級了";
        } else if (e instanceof AuthorityException) {
            msg = "沒有權限訪問";
            status = HttpStatus.UNAUTHORIZED.value();
        }
        response.setContentType("application/json;charset=utf-8");
        response.setStatus(status);
        response.getWriter().println("{\"msg\": " + msg + ", \"code\": " + status + "}");
    }
}

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

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

四、自定義系統異常

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

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", "被熔斷");
        }};
    }

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

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

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

小結

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

PS:如果這 3 種自定義異常同時存在,那么它的執行優先級是:自定義局部異常 > 自定義全局異常 > 自定義系統異常。

責任編輯:姜華 來源: Java中文社群
相關推薦

2011-09-05 12:43:23

Sencha Touc事件

2024-10-30 16:39:45

2011-12-16 14:23:51

Java

2024-06-12 07:54:05

2022-02-14 22:04:50

瀏覽器Observer監聽

2009-12-03 10:49:32

PHP自定義異常處理器

2009-08-04 09:09:56

Java常見異常

2022-03-28 20:57:31

私有屬性class屬性和方法

2009-08-06 15:26:18

C#異常類型

2021-01-06 05:25:56

項目Springboot應用

2024-01-17 13:58:00

算法C#冒泡排序

2013-05-07 09:39:14

軟件定義網絡SDNOpenFlow

2021-12-15 23:10:34

JS Debugger 前端開發

2021-10-10 12:29:27

機器人AI人工智能

2021-06-17 06:52:37

C#自定義異常

2010-02-04 10:33:40

C++異常傳遞

2019-07-22 13:39:59

Python編輯器開發

2019-04-30 10:00:59

CSS居中前端

2009-08-05 18:01:20

C#自定義異常處理

2020-09-07 09:54:01

GNOME桌面主題桌面應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产视频1 | 欧美精品区| 亚洲人人 | 国产精品久久久久久久久久久久久 | 亚洲色图综合 | 精品国产乱码久久久久久蜜退臀 | 亚洲二区精品 | 亚洲第一天堂 | 亚洲欧美一区二区三区1000 | 久久久精品 | 精品美女久久久久久免费 | 爽爽免费视频 | 久久免费福利 | 国产精品久久久久久亚洲调教 | 不卡视频一区二区三区 | 日韩一区二区av | 日韩免费视频一区二区 | 国产极品粉嫩美女呻吟在线看人 | 久久久九九 | 日韩欧美在线一区 | 午夜国产羞羞视频免费网站 | 色在线看 | 国产精品观看 | 成年人黄色一级毛片 | 在线不卡视频 | 日韩欧美中文 | 国产日韩精品在线 | 国产精品毛片一区二区在线看 | 99精品欧美一区二区蜜桃免费 | 日韩欧美精品 | 亚洲 中文 欧美 日韩 在线观看 | 日韩一区二区免费视频 | 欧美精品乱码久久久久久按摩 | 亚洲精品一区av在线播放 | 亚洲日韩中文字幕一区 | 狠狠色狠狠色综合日日92 | 日韩国产免费观看 | 亚洲欧洲激情 | 欧美jizzhd精品欧美巨大免费 | 欧美国产视频一区二区 | 精品国产一区二区三区在线观看 |