@SentinelResource注解
该注解方式埋点不支持private方法
@SentinelResource用于定义资源,并提供可选的异常处理和fallback配置项。主要包含以下属性:
- value: 资源名称,非空
- entryType: entry类型(默认为EntryType.OUT)
- blockHandler: blockHandler对应处理BlockException的函数名称,可选。blockHandler函数访问范围需要是public,返回类型需要与原方法匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为BlockException。当只存在blockHandler时,指定方法和原方法在同一个类中。
- blockHandlerClass:当blockHandler指定的方法与原方法不在同一个类中,需要使用blockHandlerClass指定类,再使用blockHandler指定方法。注意,该函数必须为static,否则无法解析。
- fallback: 可选,用于在抛出异常的时候提供fallback处理逻辑。fallbakc函数可以针对所有类型的异常(除了exceptionToIgnore里面排除的异常类型)进行处理。fallback函数签名和位置要求:
- 返回值类型必须与原函数返回值类型一致
- 方法参数与原函数一致,或者可以额外多一个Throwable类型的参数用于接收对应的异常
- fallback函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定fallbackClass为对应的Class对象。注意,对应的函数必须为static函数,否则无法解析。
- defaultFallback(从1.6版本引入):与fallback基本一致,当同时存在defaultFallback和fallback时,只有fallback会生效。
- exceptionToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入fallback逻辑,而是会抛出。
使用@SentinelResource配置流控规则
@RestController
public class RateLimitController {
/**
* 使用@SentinelResource标签开启热点参数限流功能
* @SentinelResource(value)对应Sentinel控制台-流控规则-资源名
* @SentinelResource(blockHandeler)指定流控规则生效后的处理函数
*/
@GetMapping("byResource")
@SentinelResource(value = "byResource", blockHandler = "handleException")
public String byResource(){
return "----------------- 按资源名称设置流控规则 -------------------";
}
public String handleException(BlockException exception){
return "-------------------- 流控规则生效后执行的函数 ------------------";
}
}
编写好Controller后再去Sentinel控制台新建一个相应的流控规则,便能成功配置一个流控规则。
当我们想定义一个全局统一的handler函数时,该如何编写
controller
@RestController
public class RateLimitController {
/**
* 使用@SentinelResource标签开启热点参数限流功能
* @SentinelResource(value)对应Sentinel控制台-流控规则-资源名
* @SentinelResource(blockHandlerClass)指定流控规则生效后的处理类
* @SentinelResource(blockHandeler)指定流控规则生效后的处理函数
*/
@GetMapping("byResource")
@SentinelResource(value = "byResource",
blockHandlerClass = BlockHandler.class,
blockHandler = "blockHandler")
public String byResource(){
return "----------------- 按资源名称设置流控规则 -------------------";
}
}
BlockHandler.java
public class BlockHandler {
public static String blockHandler(BlockException exception){
return "-------------------- 流控规则生效后执行的函数 ------------------";
}
}
主要注意三点,一点是使用blockHandlerClass指定具体的处理类。另一点是BlockHandler.blockHandler方法必须是静态方法。最后一点是BlockHandler.blockHandler方法必须接收BlockException参数,否则将不会执行该方法。