sentinel
Sentinel是一个面向分布式微服务架构的轻量级高可用流量控制组件,它主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度帮助用户保护服务的稳定性。
Sentinel具有以下特点:
丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。 完备的实时监控:Sentinel提供实时的监控控制台,可以实时查看应用的流量、QPS、响应时间、异常比例等指标,以及配置和管理限流规则、熔断规则等。 广泛的开源生态:Sentinel提供了与多种开源框架/库的整合模块,例如与Spring Cloud、Dubbo、gRPC等的整合。 完善的SPI扩展点:Sentinel提供了简单易用、完善的SPI扩展接口,可以通过实现扩展接口来定制逻辑,例如定制规则管理、适配动态数据源等。
示例
Sentinel的使用步骤大致可以分为三步:
- 引入依赖:根据你的项目类型和框架,选择合适的Sentinel依赖,例如Spring Boot、Spring Cloud、Dubbo等。
- 定义资源:资源是Sentinel的保护对象,可以是方法签名、URL、服务名称等。你需要用Sentinel API的SphU.entry("资源名")和entry.exit()来包围你需要控制流量的代码。
- 定义规则:规则是Sentinel的控制逻辑,可以是限流规则、熔断规则、热点规则等。你可以用Sentinel API的FlowRuleManager.loadRules()等方法来加载规则,或者用Sentinel控制台来配置和管理规则。
下面是一个简单的示例代码,演示了如何使用Sentinel API来定义资源和限流规则:
java
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.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) {
// 定义资源名
String resourceName = "HelloWorld";
// 配置限流规则
initFlowRules(resourceName);
while (true) {
// 定义资源
Entry entry = null;
try {
entry = SphU.entry(resourceName);
// 资源中的逻辑
System.out.println("hello world");
} catch (BlockException e) {
// 资源访问被阻止,被限流或被降级
System.out.println("blocked!");
} finally {
// 释放资源
if (entry != null) {
entry.exit();
}
}
}
}
private static void initFlowRules(String resourceName){
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
// 设置资源名
rule.setResource(resourceName);
// 设置限流阈值为每秒 5 个请求
rule.setCount(5);
// 设置限流模式为 QPS
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rules.add(rule);
// 加载限流规则
FlowRuleManager.loadRules(rules);
}
}
Sentinel和Hystrix有什么区别?
Sentinel和Hystrix都是分布式系统的流量控制和熔断组件,但是它们有一些区别,主要有以下几点:
- 隔离策略:Hystrix支持线程池和信号量两种隔离策略,可以防止故障的传播和级联。Sentinel不提供隔离策略,而是依赖于应用本身的线程池或者执行模型。
- 资源定义:Hystrix的资源定义和隔离规则强相关,需要使用Hystrix Command来包装资源,并指定隔离规则。Sentinel的资源定义和规则配置的耦合度更低,只需要用Sentinel API来标识资源,规则可以在任何时候动态修改。
- 规则配置:Hystrix的规则配置比较固定,需要在代码中或者配置文件中指定。Sentinel的规则配置更灵活,可以通过API、控制台、动态数据源等方式来配置和管理。
- 流量控制:Hystrix的流量控制只支持基于QPS的限流模式,而Sentinel支持多种限流模式,如QPS、并发数、响应时间等,并且支持集群限流和链路限流等功能。
- 熔断降级:Hystrix的熔断降级只支持基于异常比例和异常数的触发条件,而Sentinel支持多种触发条件,如异常比例、异常数、平均响应时间、慢调用比例等,并且支持基于RT、异常比例、异常数的自适应降级策略。