@SentinelResource

之前服务降级熔断会将BlockException直接抛出

@SentinelResource用于定义资源,并提供可选的异常处理和 fallback 配置项。

    @GetMapping("/testSentinelResource")
    @SentinelResource(value = "testSentinelResource123")
    public String testSentinelResource(@RequestParam(value = "p1", required = false) String p1) {
        return "------testSentinelResource------" + "--输入的参数--" + p1;
    }

首先sentinel控制台下会显示该资源,可以仅针对该资源可以设置相关规则


@sentinelResource注解官网解释annotation-supporthttps://sentinelguard.io/zh-cn/docs/annotation-support.html

 value

设置该资源的名字


blockHandler

当时服务限流熔断时,可以指定处理方法,返回自定义提示。

blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public返回类型需要与原方法相匹配参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。只使用blockHandler 的话,函数默认需要和原方法在同一个类中。

新增一条流控规则

@SentinelResource_第1张图片

    @GetMapping("/testSentinelResource")
    @SentinelResource(value = "testSentinelResource123",blockHandler = "del_testSentinelResource_xianliu")
    public String testSentinelResource(@RequestParam(value = "p1", required = false) String p1) {
        return "------testSentinelResource------" + "--输入的参数--" + p1;
    }

    public String del_testSentinelResource_xianliu(String p1, BlockException blockException) {
        return "------被限流了------";
    }

设置blockHandler后,进入指定的方法返回

@SentinelResource_第2张图片

blockHandlerClass

如果需要对多个类进行限流熔断后的处理,所有处理方法放在一起就会显得很冗余,这时可以将这些方法抽取成一个类。

blockHandlerClass 为对应的类的 Class 对象,此时blockHandler对应的函数就为blockHandlerClass 对应类中的函数,且必需为 static 函数,否则无法解析。

    @GetMapping("/testSentinelResource")
    @SentinelResource(value = "testSentinelResource123",blockHandlerClass = SentinelHandler.class,blockHandler = "del_testSentinelResource_xianliu2")
    public String testSentinelResource(@RequestParam(value = "p1", required = false) String p1) {
        return "------testSentinelResource------" + "--输入的参数--" + p1;
    }

处理类: 

public static class SentinelHandler {
    public String del_testSentinelResource_xianliu2(String p1, BlockException blockException) {
        return "------被限流了啊------";
    }
}

 @SentinelResource_第3张图片


fallback

blockHandler和blockHandlerClass只针对于对BlockException 异常的处理,当其他异常发生时,如需处理就可以使用fallback

fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:

返回值类型必须与原函数返回值类型一致;

方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。

 @GetMapping("/testSentinelResource")
    @SentinelResource(value = "testSentinelResource123",
            blockHandlerClass = SentinelHandler.class, blockHandler = "del_testSentinelResource_xianliu2",
            fallback = "del_testSentinelResource_exception"
    )
    public String testSentinelResource(@RequestParam(value = "p1", required = false) String p1) {
        if (Integer.valueOf(p1) > 1) {
            throw new NullPointerException("出问题了");
        }
        return "------testSentinelResource------" + "--输入的参数--" + p1;
    }

@SentinelResource_第4张图片

fallbackClass

和上面blockHandlerClass 类似。

fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

    @GetMapping("/testSentinelResource")
    @SentinelResource(value = "testSentinelResource123",
            blockHandlerClass = SentinelHandler.class, blockHandler = "del_testSentinelResource_xianliu2",
            fallbackClass = SentinelExceptionHandler.class,fallback = "del_testSentinelResource_exception2"
    )
    public String testSentinelResource(@RequestParam(value = "p1", required = false) String p1) {
        if (Integer.valueOf(p1) > 1) {
            throw new NullPointerException("出问题了");
        }
        return "------testSentinelResource------" + "--输入的参数--" + p1;
    }

处理类: 

public class SentinelHandler {
    public static String del_testSentinelResource_xianliu2(String p1, BlockException blockException) {
        return "------被限流了啊------";
    }
}

 @SentinelResource_第5张图片


fallback和blockHandler的使用

①只使用fallback

fallback针对于所有的异常,所以此时只要异常,都会进fallback指定的方法里

②只使用blockHandler

只针对熔断限流引起的BlockException,其他异常会返回异常界面

③两者同时使用

BlockException进入blockHandler指定方法,其他异常进入fallback指定方法


exceptionsToIgnore

对一些具体的异常不处理,让其直接返回 

(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出

    @GetMapping("/testSentinelResource")
    @SentinelResource(value = "testSentinelResource123",
            blockHandlerClass = SentinelHandler.class, blockHandler = "del_testSentinelResource_xianliu2",
            fallbackClass = SentinelExceptionHandler.class,fallback = "del_testSentinelResource_exception2",
            exceptionsToIgnore = {NullPointerException.class}
    )
    public String testSentinelResource(@RequestParam(value = "p1", required = false) String p1) {
        if (Integer.valueOf(p1) > 1) {
            throw new NullPointerException("出问题了");
        }
        return "------testSentinelResource------" + "--输入的参数--" + p1;
    }

@SentinelResource_第6张图片

你可能感兴趣的:(SpringCloud,Alibaba,java,开发语言)