Sentinel 开源项目教程
项目介绍
Sentinel 是一个面向分布式系统的流量控制和系统保护的库。它以“流量”为切入点,在流量控制、流量整形、并发限制、断路器和系统自适应过载保护等多个领域工作,以保证微服务的可靠性和弹性。Sentinel 在阿里巴巴被广泛使用,并覆盖了双11购物节中的几乎所有核心场景。
项目快速启动
环境准备
- Java 8 或更高版本
- Maven 3.2.5 或更高版本
添加依赖
在你的 Maven 项目的 pom.xml
文件中添加以下依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.3</version>
</dependency>
编写代码
以下是一个简单的示例,展示如何在 Java 应用中使用 Sentinel 进行流量控制:
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 SentinelDemo {
public static void main(String[] args) {
initFlowRules();
while (true) {
Entry entry = null;
try {
entry = SphU.entry("HelloWorld");
/*您的业务逻辑 - 开始*/
System.out.println("hello world");
/*您的业务逻辑 - 结束*/
} catch (BlockException e1) {
/*流控逻辑处理 - 开始*/
System.out.println("blocked!");
/*流控逻辑处理 - 结束*/
} finally {
if (entry != null) {
entry.exit();
}
}
}
}
private static void initFlowRules() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("HelloWorld");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(20);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
}
应用案例和最佳实践
应用案例
Sentinel 在阿里巴巴内部被广泛应用于各种高并发场景,如“秒杀”活动,需要限制突发流量以满足系统容量。此外,Sentinel 还用于消息峰值削减和谷填充、断路器(circuit breaking)以及集群流量控制等。
最佳实践
- 流量控制:根据系统的处理能力设置合理的流量控制规则,避免系统过载。
- 断路器:对于不可靠的下游服务,使用断路器模式进行保护,防止级联故障。
- 实时监控:利用 Sentinel 提供的实时监控能力,实时查看单机和集群的运行信息,及时调整策略。
典型生态项目
Sentinel 提供了与常用框架和库的开箱即用集成,如 Spring Cloud、gRPC、Apache Dubbo 和 Quarkus。通过简单地添加适配器依赖,您可以轻松地在这些服务中使用 Sentinel。
集成示例
以下是如何在 Spring Cloud 项目中集成 Sentinel 的示例:
- 添加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- 配置文件:
在 application.yml
中添加 Sentinel 配置:
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
- 使用注解:
在需要进行流量控制的接口上使用 @SentinelResource
注解:
@RestController