基于注解的Sentinel限流熔断

依赖

xml 复制代码
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-annotation-aspectj</artifactId>
    <version>1.8.8</version>
    <exclusions>
        <exclusion>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.8</version>
</dependency>

配置

全局配置

java 复制代码
@Configuration
public class SentinelAspectConfiguration {
    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }
}

注入限流熔断规则

java 复制代码
@Component
public class SentinelConfig {

    /* 只需要在nacos中配置flowRule,也可以根据nacos配置动态刷新配置,看情况 */
    @PostConstruct
    public void initFlowRules() {
        List<FlowRule> flowRules = new ArrayList<>();

        FlowRule rule = new FlowRule();
        rule.setResource(SentinelResourceConstant.TEST_API); // 资源名要与 @SentinelResource 的 value 一致
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(1); // QPS 限流阈值

        FlowRule rul2 = new FlowRule();
        rul2.setResource(SentinelResourceConstant.HELLO_API); // 资源名要与 @SentinelResource 的 value 一致
        rul2.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rul2.setCount(2); // QPS 限流阈值

        flowRules.add(rule);
        flowRules.add(rul2);
        FlowRuleManager.loadRules(flowRules);
    }
}

服务

java 复制代码
@Service
@Slf4j
public class TestService {

    @Resource
    private HelloClient helloClient;

    @SentinelResource(value = SentinelResourceConstant.TEST_API, blockHandler = "blockHandler", blockHandlerClass = ExceptionUtil.class)
    public String chain(String pa) {
        return pa + "OKK";
    }

    @SentinelResource(value = SentinelResourceConstant.HELLO_API, blockHandler = "blockHandlerForHello", blockHandlerClass = ExceptionUtil.class)
    public String hello() {
        return helloClient.hello();
    }
}

异常

java 复制代码
@Slf4j
public class ExceptionUtil {

    public static String blockHandler(String pa, BlockException ex) {
        log.error("限流:{}", String.valueOf(ex));
        return "限流";
    }

    public static String blockHandlerForHello(BlockException ex) {
        log.error("限流:{}", String.valueOf(ex));
        return "限流";
    }
}

注意事项

  • SentinelResource注解中的value必须和SentinelConfig 中rule的resource保持完全一致
  • FlowRule的具体限流指标有多种,可以参考官方文档选择
相关推荐
流烟默1 天前
Spring Cloud 微服务 Sentinel 热点参数与授权规则集成指南(附架构建议)
spring cloud·微服务·架构·sentinel
Thomas.Sir2 天前
第23课:Sentinel熔断降级、系统自适应保护、集群限流
spring cloud·sentinel
jyOverQ3 天前
Redis 主从复制、Sentinel 和 Cluster 到底有什么区别?
java·redis·sentinel
流烟默5 天前
网关 Sentinel 限流实战:API 分组、规则加载与全量匹配踩坑记
nacos·gateway·sentinel·流控规则
guo_wen_qiang9 天前
云服务器sentinel搭建-控制台
服务器·sentinel
guo_wen_qiang9 天前
项目使用sentinel遇到的问题
java·sentinel
天天喝旺仔25 天前
分布式服务容错实战:用 Sentinel 实现限流、熔断与降级
分布式·微服务·云原生·sentinel
YOU OU1 个月前
Alibaba Sentinel
sentinel
流烟默1 个月前
Sentinel 规则持久化到 Nacos 实践(网关篇 + 普通应用篇)
nacos·sentinel·规则持久化
莫得感情 o1 个月前
Redis 09 · 高可用:Sentinel 如何发现故障并完成切主
redis·缓存·sentinel