之前服务降级熔断会将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
设置该资源的名字
当时服务限流熔断时,可以指定处理方法,返回自定义提示。
blockHandler
对应处理 BlockException
的函数名称,可选项。blockHandler 函数访问范围需要是 public
,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException
。只使用blockHandler 的话,函数默认需要和原方法在同一个类中。
新增一条流控规则
@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后,进入指定的方法返回
如果需要对多个类进行限流熔断后的处理,所有处理方法放在一起就会显得很冗余,这时可以将这些方法抽取成一个类。
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 "------被限流了啊------";
}
}
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;
}
和上面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 "------被限流了啊------";
}
}
①只使用fallback
fallback针对于所有的异常,所以此时只要异常,都会进fallback指定的方法里
②只使用blockHandler
只针对熔断限流引起的BlockException,其他异常会返回异常界面
③两者同时使用
BlockException进入blockHandler指定方法,其他异常进入fallback指定方法
对一些具体的异常不处理,让其直接返回
(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;
}