Sentinel-@SentinelResource使用

@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参数,否则将不会执行该方法。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容