Sentinel是一款由阿里巴巴开源的分布式服务保护框架,主要提供流量控制、熔断降级和系统自适应保护等功能。本文将详细介绍Sentinel的各个功能模块及其应用场景,帮助读者全面了解Sentinel初识资料。
Sentinel简介 什么是SentinelSentinel 是阿里巴巴开源的一款分布式服务保护框架,主要提供流量控制、熔断降级和系统自适应保护等功能。它可以帮助开发者在分布式系统中保护服务,防止因流量过大或系统负载过重而导致服务不可用。
Sentinel的主要功能和应用场景Sentinel 主要具备以下功能:
- 流量控制:控制流量的入口,通过配置规则限制流量,确保服务的稳定性和响应时间。
- 熔断降级:当服务调用出现异常时,自动熔断该服务的调用,防止异常蔓延。
- 系统保护:监控系统负载(CPU、内存等),超出阈值时自动触发保护机制,减少资源消耗。
- 异常检测:自动检测服务调用的异常情况,提供报警和防护功能。
- 实时监控:提供实时监控功能,帮助开发者及时了解系统的运行状态。
应用场景主要包括:
- 微服务架构:在微服务架构中,Sentinel 可以保护每个服务,防止因某一服务故障导致整个系统崩溃。
- 高并发场景:在流量高峰时期,Sentinel 可以控制流量,保证系统稳定。
- 服务治理:通过熔断降级功能,可以隔离故障服务,保障其他服务正常运行。
- 系统监控:实时监控系统的运行状态,及时发现并处理异常。
流量控制
流量控制是指对进入系统的流量进行控制,防止流量过大导致系统过载。Sentinel 提供多种流量控制规则,包括:
- 直接调用量:直接限制某个接口的最大并发调用量。
- 资源访问量:限制资源访问的最大并发数。
- QPS 限制:限制每秒钟的访问次数。
- 并发线程数限制:限制同一时间内的并发线程数。
熔断降级
熔断降级是指当服务调用出现异常时,自动断开服务调用链,防止异常传播。Sentinel 提供多种熔断降级策略,包括:
- 熔断器:当服务调用失败率达到某个阈值时,自动触发熔断。
- 降级:当服务调用出现异常时,自动切换到备用服务。
- 超时降级:当服务调用超时达到某个阈值时,自动触发熔断。
系统保护
系统保护是指监控系统资源使用情况,达到某个阈值时自动触发保护机制。Sentinel 提供多种系统保护规则,包括:
- CPU 使用率:监控 CPU 使用率,超过阈值时触发保护。
- 内存使用量:监控内存使用量,超过阈值时触发保护。
- 单机并发线程数:监控单机并发线程数,超过阈值时触发保护。
实时监控
Sentinel 提供实时监控功能,监控系统的运行状态,包括:
- 流量监控:监控流入系统的流量。
- 异常监控:监控服务调用的异常情况。
- 调用链监控:监控服务之间的调用链路。
-
下载 Sentinel:
- 从 Sentinel 的 GitHub 仓库下载最新版本的发布包,或通过 Maven 依赖引入 Sentinel。
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>1.8.3</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-consul</artifactId> <version>1.8.3</version> </dependency>
-
配置 Sentinel:
- 配置 Sentinel 的基本参数,如是否开启控制台、是否开启远程数据采集等。
- 以下是一个配置示例:
Sentinel.init(new InitFunc() { @Override public void init() { // 开启控制台 Sentinel.init(new ConsulClient("localhost", 8500)); // 设置报警规则 RuleManager.loadRules(Arrays.asList( new FlowRule(new ResourceWrapper("resource1")) .setGrade(RuleConstant.FLOW_GRADE_QPS) .setCount(20L) .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT) .setWarmUpPeriodSec(10) .setWarmUpMaxRequestCount(1000) )); } });
-
配置流量控制规则:
- 配置流量控制规则,限制接口的调用频率。
FlowRule flowRule = new FlowRule(new ResourceWrapper("resource1")) .setGrade(RuleConstant.FLOW_GRADE_QPS) .setCount(20L) .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT) .setWarmUpPeriodSec(10) .setWarmUpMaxRequestCount(1000); RuleManager.loadRules(Arrays.asList(flowRule));
-
配置熔断降级规则:
- 配置熔断降级规则,设置熔断门限和恢复策略。
CircuitBreaker rule = new CircuitBreaker(new ResourceWrapper("resource1")) .setStatIntervalMs(1000) .setSlowRatioThreshold(0.2) .setPermittedNumberOfHalfOpenRequests(3) .setBlockResponseWhenNoHalfOpenReqs(true); RuleManager.loadRules(Arrays.asList(rule));
-
配置系统保护规则:
- 配置系统保护规则,监控系统资源使用情况。
SystemRule sysRule = new SystemRule() .setCpuThreshold(0.8) .setThreadThreshold(1000) .setHeapThreshold(100) .setStackThreshold(100); RuleManager.loadSystemRule(sysRule);
-
配置控制台:
- 配置 Sentinel 控制台,开启控制台监控。
Sentinel.init(new ConsulClient("localhost", 8500));
-
如何查看已配置的规则?
- 可以通过
RuleManager
查看已加载的规则列表。
List<FlowRule> flowRules = RuleManager.getFlowRules(); for (FlowRule rule : flowRules) { System.out.println(rule); }
- 可以通过
-
如何动态更新规则?
- 可以通过
RuleManager
更新规则。
RuleManager.updateRules(Arrays.asList(new FlowRule(new ResourceWrapper("resource1")) .setGrade(RuleConstant.FLOW_GRADE_QPS) .setCount(25L) .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT) .setWarmUpPeriodSec(10) .setWarmUpMaxRequestCount(1000) ));
- 可以通过
-
引入依赖:
- 在项目中引入 Sentinel 的依赖。
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>1.8.3</version> </dependency>
-
初始化 Sentinel:
- 初始化 Sentinel 并配置基本参数。
Sentinel.init(new InitFunc() { @Override public void init() { // 开启控制台 Sentinel.init(new ConsulClient("localhost", 8500)); // 设置报警规则 RuleManager.loadRules(Arrays.asList( new FlowRule(new ResourceWrapper("resource1")) .setGrade(RuleConstant.FLOW_GRADE_QPS) .setCount(20L) .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT) .setWarmUpPeriodSec(10) .setWarmUpMaxRequestCount(1000) )); } });
-
使用 Sentinel 进行流量控制:
- 在调用服务前检查流量控制规则。
public void callService() { if (SphU.entry("resource1")) { // 调用服务的代码 } else { // 流量控制造成的阻塞 } }
-
创建资源:
- 创建一个资源,即一个需要保护的服务。
String resource = "resource1"; Entry entry = SphU.entry(resource);
-
调用服务:
- 在资源保护下执行服务调用。
public void callService() { if (SphU.entry("resource1")) { // 调用服务的代码 serviceClient.doService(); SphU.exit(); } else { // 流量控制造成的阻塞 } }
-
流控规则配置:
- 配置流量控制规则,限制特定资源的访问量。
FlowRule flowRule = new FlowRule(new ResourceWrapper("resource1")) .setGrade(RuleConstant.FLOW_GRADE_QPS) .setCount(20L) .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT) .setWarmUpPeriodSec(10) .setWarmUpMaxRequestCount(1000); RuleManager.loadRules(Arrays.asList(flowRule));
Sentinel 控制台是一个 Web 应用,用于监控和管理 Sentinel 规则。控制台提供了丰富的监控面板、规则配置、报警等功能。
-
启动控制台:
- 通过配置启动控制台。
Sentinel.init(new ConsulClient("localhost", 8500));
-
访问控制台:
- 启动后访问控制台,一般默认端口为 8080。
http://localhost:8080
-
规则配置:
-
在控制台中配置各种规则,如流量控制规则、熔断降级规则等。
- 进入控制台后,选择相应的规则配置页面,填写规则参数并保存。
-
-
监控面板:
-
在控制台中查看各种监控数据,如流量监控、异常监控等。
- 通过监控面板,可以实时查看系统的运行状态,发现潜在问题。
-
流量控制是指对进入系统的流量进行控制,防止流量过大导致系统过载。Sentinel 提供多种流量控制规则,包括:
- 直接调用量:直接限制某个接口的最大并发调用量。
- 资源访问量:限制资源访问的最大并发数。
- QPS 限制:限制每秒钟的访问次数。
- 并发线程数限制:限制同一时间内的并发线程数。
-
定义资源:
- 定义需要保护的服务资源。
String resource = "resource1";
-
配置流量控制规则:
- 配置流量控制规则,限制资源的访问量。
FlowRule flowRule = new FlowRule(new ResourceWrapper("resource1")) .setGrade(RuleConstant.FLOW_GRADE_QPS) .setCount(20L) .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT) .setWarmUpPeriodSec(10) .setWarmUpMaxRequestCount(1000); RuleManager.loadRules(Arrays.asList(flowRule));
-
调用保护资源:
- 在调用服务前检查流量控制规则。
public void callService() { if (SphU.entry("resource1")) { // 调用服务的代码 serviceClient.doService(); SphU.exit(); } else { // 流量控制造成的阻塞 } }
-
流量高峰:
- 在流量高峰时期,通过流量控制限制系统的访问量,防止系统过载。
FlowRule flowRule = new FlowRule(new ResourceWrapper("resource1")) .setGrade(RuleConstant.FLOW_GRADE_QPS) .setCount(20L) .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT) .setWarmUpPeriodSec(10) .setWarmUpMaxRequestCount(1000); RuleManager.loadRules(Arrays.asList(flowRule));
-
资源访问限制:
- 限制特定资源的访问量,防止资源被滥用。
FlowRule flowRule = new FlowRule(new ResourceWrapper("resource1")) .setGrade(RuleConstant.FLOW_GRADE_THREAD) .setCount(20L) .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT); RuleManager.loadRules(Arrays.asList(flowRule));
-
系统稳定性保障:
- 通过流量控制确保系统的稳定性,避免因流量过大导致系统崩溃。
FlowRule flowRule = new FlowRule(new ResourceWrapper("resource1")) .setGrade(RuleConstant.FLOW_GRADE_QPS) .setCount(20L) .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT) .setWarmUpPeriodSec(10) .setWarmUpMaxRequestCount(1000); RuleManager.loadRules(Arrays.asList(flowRule));
熔断降级是指当服务调用出现异常时,自动断开服务调用链,防止异常传播。Sentinel 提供多种熔断降级策略,包括:
- 熔断器:当服务调用失败率达到某个阈值时,自动触发熔断。
- 降级:当服务调用出现异常时,自动切换到备用服务。
- 超时降级:当服务调用超时达到某个阈值时,自动触发熔断。
-
配置熔断器:
- 配置熔断器,设置熔断门限和恢复策略。
CircuitBreaker rule = new CircuitBreaker(new ResourceWrapper("resource1")) .setStatIntervalMs(1000) .setSlowRatioThreshold(0.2) .setPermittedNumberOfHalfOpenRequests(3) .setBlockResponseWhenNoHalfOpenReqs(true); RuleManager.loadRules(Arrays.asList(rule));
-
配置降级策略:
- 配置降级策略,设置降级后的备用服务。
RuleManager.loadRules(Arrays.asList( new FlowRule(new ResourceWrapper("resource1")) .setGrade(RuleConstant.FLOW_GRADE_QPS) .setCount(20L) .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT) .setWarmUpPeriodSec(10) .setWarmUpMaxRequestCount(1000) ));
-
配置超时降级:
- 配置服务调用超时降级策略。
RuleManager.loadRules(Arrays.asList( new TimeoutRule(new ResourceWrapper("resource1")) .setTimeoutMillis(2000) .setCount(20L) .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT) .setWarmUpPeriodSec(10) .setWarmUpMaxRequestCount(1000) ));
-
服务调用失败率过高:
- 当服务调用失败率达到某个阈值时,触发熔断。
CircuitBreaker rule = new CircuitBreaker(new ResourceWrapper("resource1")) .setStatIntervalMs(1000) .setSlowRatioThreshold(0.2) .setPermittedNumberOfHalfOpenRequests(3) .setBlockResponseWhenNoHalfOpenReqs(true); RuleManager.loadRules(Arrays.asList(rule));
-
服务调用超时:
- 当服务调用超时达到某个阈值时,触发熔断。
RuleManager.loadRules(Arrays.asList( new TimeoutRule(new ResourceWrapper("resource1")) .setTimeoutMillis(2000) .setCount(20L) .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT) .setWarmUpPeriodSec(10) .setWarmUpMaxRequestCount(1000) ));
-
服务降级:
- 当服务调用出现异常时,自动切换到备用服务。
RuleManager.loadRules(Arrays.asList( new FlowRule(new ResourceWrapper("resource1")) .setGrade(RuleConstant.FLOW_GRADE_QPS) .setCount(20L) .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DIRECT) .setWarmUpPeriodSec(10) .setWarmUpMaxRequestCount(1000) ));
-
微服务架构中的应用:
- 在微服务架构中,Sentinel 可以保护每个服务,防止因某一服务故障导致整个系统崩溃。
public class ServiceA { public void callService() { if (SphU.entry("service-a")) { // 调用服务的代码 serviceClient.doService(); SphU.exit(); } else { // 流量控制造成的阻塞 } } }
-
高并发场景中的应用:
- 在流量高峰时期,通过流量控制限制系统的访问量,防止系统过载。
FlowRule flowRule = new FlowRule(new ResourceWrapper("service-a")) .setGrade(RuleConstant.FLOW_GRADE_QPS) .setCount(20L) .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT) .setWarmUpPeriodSec(10) .setWarmUpMaxRequestCount(1000); RuleManager.loadRules(Arrays.asList(flowRule));
-
服务治理中的应用:
- 通过熔断降级功能,可以隔离故障服务,保障其他服务正常运行。
CircuitBreaker rule = new CircuitBreaker(new ResourceWrapper("service-a")) .setStatIntervalMs(1000) .setSlowRatioThreshold(0.2) .setPermittedNumberOfHalfOpenRequests(3) .setBlockResponseWhenNoHalfOpenReqs(true); RuleManager.loadRules(Arrays.asList(rule));
-
配置规则不生效:
- 确保规则配置正确,并且已加载到 RuleManager。
RuleManager.loadRules(Arrays.asList( new FlowRule(new ResourceWrapper("resource1")) .setGrade(RuleConstant.FLOW_GRADE_QPS) .setCount(20L) .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT) .setWarmUpPeriodSec(10) .setWarmUpMaxRequestCount(1000) ));
-
无法触发熔断:
- 检查熔断器的配置参数,确保触发条件正确。
CircuitBreaker rule = new CircuitBreaker(new ResourceWrapper("resource1")) .setStatIntervalMs(1000) .setSlowRatioThreshold(0.2) .setPermittedNumberOfHalfOpenRequests(3) .setBlockResponseWhenNoHalfOpenReqs(true); RuleManager.loadRules(Arrays.asList(rule));
-
控制台无法访问:
- 检查控制台的配置,确保控制台已经启动并且端口正确。
Sentinel.init(new ConsulClient("localhost", 8500));
-
GitHub 仓库:Sentinel 的官方 GitHub 仓库,提供了最新的代码和文档。
-
官方文档:Sentinel 的官方文档,提供了详细的使用指南和 API 文档。
-
社区支持:Sentinel 社区提供问题解答和技术支持。
- 慕课网:提供 Sentinel 的视频教程和实战演练。
共同学习,写下你的评论
评论加载中...
作者其他优质文章