Sentinel 已经限流但 blockHandler 没执行,先看触发规则的是哪个资源。Web 适配器登记的 URL 资源与 @SentinelResource 声明的资源可能同时存在,不会自动共用同一个异常处理入口。

限的是 URL,还是 echo

旧项目请求路径类似 /echo/sdsf,注解资源名却是 echo。对 URL 资源加规则后请求被拦截,但没有进入方法配置的 blockHandler;改为对 echo 配置规则后,回调才工作。

请求先经过 Web 适配层,再到方法切面。若外层已经阻断,内层方法都未执行,它的处理函数自然没有机会接管。

方法与处理函数的对应关系

下面示例需要已经接入 Sentinel 注解切面与相应适配依赖:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EchoController {
    @GetMapping("/echo/{text}")
    @SentinelResource(value = "echo", blockHandler = "blocked")
    public String echo(@PathVariable("text") String text) {
        return "echo: " + text;
    }

    public String blocked(String text, BlockException exception) {
        return "请求过于频繁,请稍后重试";
    }
}

希望走这个回调,规则 resource 应为 echo。处理函数要求 public、返回类型一致、原参数一致,并在末尾增加 BlockException。使用 blockHandlerClass 外部类时还要求 static。Sentinel 注解支持

名称一致仍不工作时

检查是否经过注解切面、函数名及签名是否可解析,以及是否被外层入口规则提前阻断。普通业务异常与限流产生的 BlockException 也应区分,fallback 和 blockHandler 不是同一个用途。

若要定制 URL 层的响应,应配置对应 Web 适配器的阻断处理机制。把实际 URL、控制台资源名、注解 value 和命中规则放在一起核对,比只看“限流已生效”更容易定位。