1. 序言

使用SentinelCore搭建一个简单的限流项目,用其中最核心的逻辑理解Sentinel

2. 工程搭建

2.1. 引入依赖

1
2
3
4
5
6
<dependencies>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
</dependency>
</dependencies>

只需要这一个依赖就够了

2.2. Java中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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 java.util.ArrayList;
import java.util.List;

public class SentinelJavaApp {
public static void main(String[] args) {
// 配置规则.
initFlowRules();

//只执行100次,单独做了个循环控制,连续访问100次
int count=0;
while (count<100) {
count++;
// 利用 try-with-resources 特性 ,注意每次都需要关流
// 获取“资源锁”,成功获取到的则表示未被限制,否则限制走catch逻辑
try (Entry entry = SphU.entry("HelloWorld")) {
// 被保护的逻辑
System.out.println("hello world");
} catch (BlockException ex) {
// 处理被流控的逻辑
System.out.println("blocked!");
}
}
}

//配置规则逻辑
private static void initFlowRules(){
List<FlowRule> rules = new ArrayList<>();
//创建规则
FlowRule rule = new FlowRule();
//设置资源名
rule.setResource("HelloWorld");
//选择模式,此处根据QPS来限制
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
//限制值,即QPS超过20限流
rule.setCount(20);
rules.add(rule);
//加载规则
FlowRuleManager.loadRules(rules);
}
}

对于SphU,这是流量控制器,翻译器翻译过来大致为

用于记录统计数据和执行资源规则检查的基本Sentinel API。从概念上讲,需要保护的物理或逻辑资源应该被条目包围。的如果满足任何条件,对该资源的请求将被阻止,例如。当任何规则的阈值被超过时。一旦被阻塞,就会抛出一个BlockException。为了配置标准,我们可以使用XxxRuleManager。loadRules()加载规则。如下代码为例,“abc”表示受保护资源的唯一名称

其方法主要是entry方法,用于获取流量限制

SphU