Home

Awesome

sentinel-lib 使用注解配置配置熔断限流规则

背景和目的

为解决这些问题,sentinel-lib提供了一些注解,可以直接在使用SentinelResource注解的地方直接配置熔断限流规则.

如何使用

1. 编译项目

2. SpringBoot配置

如果是Spring Boot用户,可以通过@EnableSentinel注解开启包功能.注解生效时会自动注入Sentinel的SentinelResourceAspect类,所以不需要额外再配置. 例:

@EnableSentinel
@SpringBootApplication
public class Starter extends SpringBootServletInitializer {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Starter.class, args);
    }
}

3. Spring的xml配置

如果是基于xml的spring配置,需要配置如下这个两个bean.

<bean class="com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect"></bean>
<bean class="com.ximalaya.business.Annotation.configuration.SentinelAnnotationBeanProcessor"></bean>

4. 可用的注解类简介

sentinel-lib库提供了多种流控配置注解和降级控制注解,如下

注解类功能
FlowRuleDefine默认直接拒绝行为的流控
RateLimitFlowRuleDefine限速流控
WarmUpFlowRuleDefine预热和预热限速流控
DegradeRuleDefine降级控制

5. 使用例子

@RestController
@RequestMapping("sample")
public class MyFlowSampleController {
    
    public String fallback() {
      return "fallback";
    }
    
    public String blockHandler(BlockException ex) {
      return "blocked!";
    }
    
    @WarmUpFlowRuleDefine
    @FlowRuleDefine(count = "500")
    @DegradeRuleDefine(count = "500", timeWindow = "10")
    @SentinelResource(value="doSomething", blockHandler = "blockHandler", fallback = "fallback")
    @RequestMapping("/doSomething")
    public String doSomething() {
        return new String("everything is ok");
    }

    @RateLimitFlowRuleDefine
    @FlowRuleDefine
    @DegradeRuleDefine
    @SentinelResource(value="exceptionApi", blockHandler = "blockHandler", fallback = "fallback")
    @RequestMapping("/exceptionApi")
    public Response exceptionApi() {
        throw new RuntimeException("something is wrong!");
    }
}

6. 使用properties

注解中的配置可以支持properties文件.例如application.properties包含如下内容

my.flow=123
my.degrade.count=500
my.degrade.tw = 21

则在注解中可以使用定义的变量,如下:

@WarmUpFlowRuleDefine(rateLimit = "30")
@FlowRuleDefine(count = "${my.flow}")
@DegradeRuleDefine(count = "${my.degrade.count}", timeWindow = "${my.degrade.tw}")
@SentinelResource(value="doSomething", blockHandler = "myBlockHandler", fallback = "myDegradeHandler")
@RequestMapping("/doSomething")
public Response doSomething() {
    return new Response("everything is ok");
}

7. 关于灵活性

在注解中使用properties文件属性,可以支持在dev,test,prd环境使用不同的限流数量配置.

如果需要更加灵活的在线实时修改配置能力,建议使用ASAH的Sentinel控制台来做.