Sentinel 是一款面向分布式系统的流量控制、熔断和自适应限流工具,由Alibaba开源。Sentinel 以Java客户端的形式提供,可以嵌入到Java应用中以保护系统稳定运行。
以下是使用Sentinel实现流量控制和降级操作的详细步骤:
1. 添加Sentinel依赖
首先,需要在项目中添加Sentinel的依赖。
Maven依赖:
xml
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.0</version>
</dependency>
Gradle依赖:
java
implementation 'com.alibaba.csp:sentinel-core:1.8.0'
2. 引入Sentinel核心库
在应用启动类或者配置文件中引入Sentinel核心库。
java
import com.alibaba.csp.sentinel.init.InitFunc;
public class SentinelApplication {
public static void main(String[] args) {
// 初始化Sentinel
InitFunc.doInit();
// 其他应用启动代码...
}
}
3. 定义资源
Sentinel 中的资源是受保护的实体,如一个接口调用、一个数据库连接等。
java
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.context.ContextUtil;
import com.alibaba.csp.sentinel.slots.block.BlockException;
public class YourService {
private static final String RESOURCE_NAME = "yourMethodResource";
public void yourMethod() {
Entry entry = null;
try {
entry = SphU.entry(RESOURCE_NAME);
// 业务逻辑...
} catch (BlockException e) {
// 流量控制或熔断时的处理逻辑...
} finally {
if (entry != null) {
entry.exit();
}
}
}
}
4. 配置流控规则
Sentinel 允许你通过代码或配置文件定义流控规则。
代码配置:
java
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
FlowRule rule = new FlowRule();
rule.setResource(RESOURCE_NAME);
rule.setCount(10); // 每秒通过的请求数量
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 限流阈值类型
rule.setLimitApp("default"); // 来源应用名称
List<FlowRule> rules = new ArrayList<>();
rules.add(rule);
FlowRuleManager.loadRules(rules);
配置文件:
在sentinel目录下的flow-rules.json文件中定义规则。
json
[
{
"resource": "yourMethodResource",
"limitApp": "default",
"grade": 1,
"count": 10,
"strategy": 0,
"controlBehavior": 0,
"exceResources": "",
"clusterMode": false
}
]
5. 配置降级规则
降级规则允许你在系统负载较高时,对某些服务调用进行降级。
java
import com.alibaba.csp.sentinel.slots.system.SystemRule;
import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;
SystemRule rule = new SystemRule();
rule.setHighestSystemLoad(75); // 系统负载达到75%时触发降级
SystemRuleManager.loadRules(Collections.singletonList(rule));
6. 定义降级逻辑
在业务逻辑中,捕获BlockException来定义降级逻辑。
java
try {
entry = SphU.entry(RESOURCE_NAME);
// 正常业务逻辑...
} catch (BlockException e) {
// 执行降级逻辑,例如返回默认值、执行备选逻辑等
System.out.println("Blocked by Sentinel: " + e.getMessage());
// 返回降级后的结果
}
7. 启动应用并测试
启动你的应用,并模拟高流量或高系统负载,以测试Sentinel的流控和降级功能是否按预期工作。
示例解释
- 添加Sentinel依赖:将Sentinel核心库添加到项目依赖中。
- 引入Sentinel核心库:在应用启动时初始化Sentinel。
- 定义资源:在代码中定义需要Sentinel保护的资源。
- 配置流控规则:通过代码或配置文件定义流控规则,控制资源的访问流量。
- 配置降级规则:定义系统负载达到一定阈值时的降级规则。
- 定义降级逻辑:在业务逻辑中处理BlockException,实现流量控制或系统保护的降级逻辑。
- 启动应用并测试:启动应用并通过测试验证Sentinel规则是否生效。
通过以上步骤,你可以使用Sentinel实现应用的流量控制和降级操作,以保护系统在高流量或不稳定情况下的稳定性。欢迎关注威哥爱编程,一起学习成长。