sentinel限流-入门demo
1、pom引入
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.0</version>
</dependency>
2、定义资源并初始化规则
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("94rg");
rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);
// Set limit QPS to 20.
rule.setCount(1);
rules.add(rule);
FlowRuleManager.loadRules(rules);
- 资源一般是一个接口、一个方法,可以类比一个分布式锁的key
- 规则目前支持的有RT、QPS、异常比(选择模式以及对应的阀值)
- 添加到FlowRuleManager进行管理
3、开启限流
关键的限流逻辑代码就以下几句
Entry entry = null; try { entry = SphU.entry("94rg"); /*您的业务逻辑 - 开始*/ System.out.println("hello world"); /*您的业务逻辑 - 结束*/ } catch (BlockException e1) { /*流控逻辑处理 - 开始*/ System.out.println("block!"); /*流控逻辑处理 - 结束*/ } catch (Exception e) { e.printStackTrace(); } finally { if (entry != null) { entry.exit(); } }
4、完整demo
package tech.chenxing;
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.springframework.test.context.event.annotation.BeforeTestClass;
import java.util.ArrayList;
import java.util.List;
@Slf4j
public class SentinelTest {
@BeforeAll
public static void initRules(){
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("94rg");
rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);
// Set limit QPS to 20.
rule.setCount(1);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
@Test
public void limitRequestTest(){
int i=0;
while (true) {
i++;
Entry entry = null;
try {
if(i%7==0){
throw new Exception("异常数过多");
}
entry = SphU.entry("94rg");
/*您的业务逻辑 - 开始*/
System.out.println("hello world");
/*您的业务逻辑 - 结束*/
} catch (BlockException e1) {
/*流控逻辑处理 - 开始*/
System.out.println("block!");
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*流控逻辑处理 - 结束*/
} catch (Exception e) {
e.printStackTrace();
} finally {
if (entry != null) {
entry.exit();
}
}
}
}
}
正文到此结束