Sentinel 是由阿里云开源的一款服务治理与保护库,适用于微服务和云原生应用。它提供了流量控制、授权配置、熔断降级和系统保护等多项功能,确保应用的稳定性。通过本文,读者将详细了解 Sentinel 的安装配置、核心概念以及实战演练,掌握 Sentinel 的基础入门。
Sentinel 是什么Sentinel 是一款由阿里云开源的服务治理与保护库,专注于服务网格、微服务和云原生应用。它能够在运行时保护应用的稳定性,提供多维度的流量控制、丰富的统计信息和实时监控,以及快速响应和容错机制。Sentinel 的核心优势在于其轻量级、透明化、异步和累积式等特性,使得它不仅适合于 Java 应用,也能够与各种语言进行集成。
Sentinel 的主要功能包括:
Sentinel 适用于以下场景:
首先,你需要在你的项目中添加 Sentinel 的依赖。对于 Maven 项目,可以在 pom.xml
文件中添加如下依赖:
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel</artifactId> <version>1.8.3</version> </dependency>
对于 Gradle 项目,可以在 build.gradle
文件中添加如下依赖:
dependencies { implementation 'com.alibaba.csp:sentinel:1.8.3' }
在你的应用程序启动时,需要初始化 Sentinel。你可以在 Application
类或 Spring Boot
的配置类中进行初始化。
例如,在一个简单的 Spring Boot 应用中,你可以在 Application
类中添加如下代码:
import com.alibaba.csp.sentinel.init.InitFunc; import com.alibaba.csp.sentinel.init.PropertyConfig; import com.alibaba.csp.sentinel.init.SentinelPropertyConfig; import com.alibaba.csp.sentinel.init.SentinelWebTopInitFunc; import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.system.SystemRuleManager; import com.alibaba.csp.sentinel.slots.system.SystemRule; import java.util.List; public class Application { public static void main(String[] args) { // 初始化Sentinel InitFunc initFunc = new SentinelWebTopInitFunc(); initFunc.init(); // 设置属性配置 PropertyConfig propertyConfig = new SentinelPropertyConfig(); propertyConfig.setProfile("default"); propertyConfig.setProfileSeparator("_"); propertyConfig.setProfilePropertyName("spring.profiles.active"); propertyConfig.setProfilePropertyNameSeparator("."); propertyConfig.setProfileSeparator("_"); propertyConfig.setProfilePropertyPrefix("spring.profiles.active"); propertyConfig.setProfilePropertyNameSeparator("."); propertyConfig.setProfilePropertyPrefix("spring.profiles.active"); // 设置流控规则 FlowRule flowRule = new FlowRule(); flowRule.setResource("hello"); flowRule.setGrade(FlowRuleConstant.FLOW_GRADE_QPS); flowRule.setCount(10); flowRule.setControlBehavior(FlowRuleConstant.CONTROL_BEHAVIOR_DEFAULT); FlowRuleManager.loadRules(List.of(flowRule)); // 设置系统保护规则 SystemRule systemRule = new SystemRule(); systemRule.setResource("default"); systemRule.setGrade(SystemRuleConstant.GRADER_CPU); systemRule.setCount(80); systemRule.setControlBehavior(SystemRuleConstant.CONTROL_BEHAVIOR_DEFAULT); SystemRuleManager.loadRules(List.of(systemRule)); } }
流量控制是 Sentinel 的核心功能之一,可以基于 QPS、并发线程数等维度进行控制。以下是一个简单的流量控制规则配置示例:
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; public class FlowRuleExample { public static void main(String[] args) { FlowRule flowRule = new FlowRule(); flowRule.setResource("example"); flowRule.setGrade(FlowRuleConstant.FLOW_GRADE_QPS); // 设置为QPS控制 flowRule.setCount(10); // 每秒最多处理10个请求 flowRule.setControlBehavior(FlowRuleConstant.CONTROL_BEHAVIOR_DEFAULT); // 默认拒绝策略 List<FlowRule> rules = new ArrayList<>(); rules.add(flowRule); FlowRuleManager.loadRules(rules); } }
系统保护规则可以保护系统资源,例如 CPU、内存、线程数等。以下是一个简单的系统保护规则配置示例:
import com.alibaba.csp.sentinel.slots.system.SystemRule; import com.alibaba.csp.sentinel.slots.system.SystemRuleManager; public class SystemRuleExample { public static void main(String[] args) { SystemRule systemRule = new SystemRule(); systemRule.setResource("example"); systemRule.setGrade(SystemRuleConstant.GRADER_CPU); // 设置为CPU保护 systemRule.setCount(80); // CPU使用率超过80%时触发保护 systemRule.setControlBehavior(SystemRuleConstant.CONTROL_BEHAVIOR_DEFAULT); // 默认拒绝策略 List<SystemRule> rules = new ArrayList<>(); rules.add(systemRule); SystemRuleManager.loadRules(rules); } }核心概念讲解
流量控制是 Sentinel 的一个重要功能,主要用于控制通过某个资源(例如服务、方法等)的请求流量。Sentinel 提供了多种流量控制规则,包括 QPS(每秒查询速率)、并发线程数等。
例如,设置一个服务的 QPS 为 10,表示每秒最多可以处理 10 个请求:
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; public class QpsControlExample { public static void main(String[] args) { FlowRule flowRule = new FlowRule(); flowRule.setResource("example"); flowRule.setGrade(FlowRuleConstant.FLOW_GRADE_QPS); // 设置为QPS控制 flowRule.setCount(10); // 每秒最多处理10个请求 flowRule.setControlBehavior(FlowRuleConstant.CONTROL_BEHAVIOR_DEFAULT); // 默认拒绝策略 List<FlowRule> rules = new ArrayList<>(); rules.add(flowRule); FlowRuleManager.loadRules(rules); } }
设置一个服务的最大并发线程数为 10:
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; public class ThreadControlExample { public static void main(String[] args) { FlowRule flowRule = new FlowRule(); flowRule.setResource("example"); flowRule.setGrade(FlowRuleConstant.FLOW_GRADE_THREAD); // 设置为线程数控制 flowRule.setCount(10); // 最大并发线程数为10 flowRule.setControlBehavior(FlowRuleConstant.CONTROL_BEHAVIOR_DEFAULT); // 默认拒绝策略 List<FlowRule> rules = new ArrayList<>(); rules.add(flowRule); FlowRuleManager.loadRules(rules); } }
授权配置用于控制对特定资源的访问权限。Sentinel 提供了灵活的授权配置,可以基于用户、IP、时间等维度进行控制。
例如,设置一个服务只允许特定用户和 IP 访问:
import com.alibaba.csp.sentinel.slots.authorize.AuthorizeConfig; import com.alibaba.csp.sentinel.slots.authorize.AuthorizeConfigManager; public class AuthorizationExample { public static void main(String[] args) { List<AuthorizeConfig> authorizeConfigs = new ArrayList<>(); AuthorizeConfig authorizeConfig = new AuthorizeConfig(); authorizeConfig.setResource("example"); authorizeConfig.setStrategy(AuthorizeConfig.STRATEGY_IP_USER); // IP和用户权限控制 authorizeConfig.setUserIds("user1,user2"); // 允许访问的用户 authorizeConfig.setIpList("192.168.1.1,192.168.1.2"); // 允许访问的IP authorizeConfigs.add(authorizeConfig); AuthorizeConfigManager.loadRules(authorizeConfigs); } }
设置一个服务在特定时间窗口内不可访问:
import com.alibaba.csp.sentinel.slots.authorize.AuthorizeConfig; import com.alibaba.csp.sentinel.slots.authorize.AuthorizeConfigManager; public class TimeAuthorizationExample { public static void main(String[] args) { List<AuthorizeConfig> authorizeConfigs = new ArrayList<>(); AuthorizeConfig authorizeConfig = new AuthorizeConfig(); authorizeConfig.setResource("example"); authorizeConfig.setStrategy(AuthorizeConfig.STRATEGY_TIME_WINDOW); // 时间窗口权限控制 authorizeConfig.setStartTime(8 * 3600); // 开始时间,8点 authorizeConfig.setEndTime(12 * 3600); // 结束时间,12点 authorizeConfigs.add(authorizeConfig); AuthorizeConfigManager.loadRules(authorizeConfigs); } }
熔断降级是 Sentinel 的另一个重要功能,用于在服务不稳定时及时熔断并降级处理,防止故障扩散。
设置一个服务在失败率达到一定阈值时进行熔断:
import com.alibaba.csp.sentinel.slots.datasource.NewDataSourceProvider; import com.alibaba.csp.sentinel.slots.datasource.ReadOnlyListDataSource; import com.alibaba.csp.sentinel.slots.datasource.SentinelDataSource; import com.alibaba.csp.sentinel.slots.datasource.SentinelDataSourceType; import com.alibaba.csp.sentinel.slots.statistic.halfway.HalfWayStrategy; import com.alibaba.csp.sentinel.slots.statistic.halfway.HalfWayStrategyManager; import com.alibaba.csp.sentinel.slots.system.SystemRule; import com.alibaba.csp.sentinel.slots.system.SystemRuleManager; public class CircuitBreakerExample { public static void main(String[] args) { SystemRule systemRule = new SystemRule(); systemRule.setResource("example"); systemRule.setGrade(SystemRuleConstant.GRADER_SYSTEM); // 设置为系统保护 systemRule.setCount(80); // CPU使用率超过80%时触发保护 systemRule.setControlBehavior(SystemRuleConstant.CONTROL_BEHAVIOR_DEFAULT); // 默认拒绝策略 List<SystemRule> rules = new ArrayList<>(); rules.add(systemRule); SystemRuleManager.loadRules(rules); HalfWayStrategyManager.setHalfWayStrategy(new HalfWayStrategy() { @Override public boolean isHalfWay(int successCount, int requestCount) { return successCount < 5; // 当成功请求少于5次时进行熔断 } }); } }实战演练
接下来,我们将通过一个简单的示例代码来演示如何使用 Sentinel 进行流量控制、授权配置和熔断降级。
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; import com.alibaba.csp.sentinel.slots.system.SystemRule; import com.alibaba.csp.sentinel.slots.system.SystemRuleManager; public class SimpleSentinelExample { public static void main(String[] args) { // 设置流量控制规则 FlowRule flowRule = new FlowRule(); flowRule.setResource("example"); flowRule.setGrade(FlowRuleConstant.FLOW_GRADE_QPS); // 设置为QPS控制 flowRule.setCount(10); // 每秒最多处理10个请求 flowRule.setControlBehavior(FlowRuleConstant.CONTROL_BEHAVIOR_DEFAULT); // 默认拒绝策略 List<FlowRule> rules = new ArrayList<>(); rules.add(flowRule); FlowRuleManager.loadRules(rules); // 设置系统保护规则 SystemRule systemRule = new SystemRule(); systemRule.setResource("example"); systemRule.setGrade(SystemRuleConstant.GRADER_CPU); // 设置为CPU保护 systemRule.setCount(80); // CPU使用率超过80%时触发保护 systemRule.setControlBehavior(SystemRuleConstant.CONTROL_BEHAVIOR_DEFAULT); // 默认拒绝策略 List<SystemRule> systemRules = new ArrayList<>(); systemRules.add(systemRule); SystemRuleManager.loadRules(systemRules); // 模拟请求 for (int i = 0; i < 100; i++) { if (SentinelBlockExceptionUtil.tryAcquire("example")) { System.out.println("Request " + i + " is processed"); } else { System.out.println("Request " + i + " is rejected"); } } } }
import com.alibaba.csp.sentinel.slots.authorize.AuthorizeConfig; import com.alibaba.csp.sentinel.slots.authorize.AuthorizeConfigManager; public class AuthorizationExample { public static void main(String[] args) { List<AuthorizeConfig> authorizeConfigs = new ArrayList<>(); AuthorizeConfig authorizeConfig = new AuthorizeConfig(); authorizeConfig.setResource("example"); authorizeConfig.setStrategy(AuthorizeConfig.STRATEGY_IP_USER); // IP和用户权限控制 authorizeConfig.setUserIds("user1,user2"); // 允许访问的用户 authorizeConfig.setIpList("192.168.1.1,192.168.1.2"); // 允许访问的IP authorizeConfigs.add(authorizeConfig); AuthorizeConfigManager.loadRules(authorizeConfigs); // 模拟请求 if (SentinelBlockExceptionUtil.isAllow("example", "user1", "192.168.1.1")) { System.out.println("Request is allowed"); } else { System.out.println("Request is denied"); } } }
import com.alibaba.csp.sentinel.slots.datasource.NewDataSourceProvider; import com.alibaba.csp.sentinel.slots.datasource.ReadOnlyListDataSource; import com.alibaba.csp.sentinel.slots.datasource.SentinelDataSource; import com.alibaba.csp.sentinel.slots.datasource.SentinelDataSourceType; import com.alibaba.csp.sentinel.slots.statistic.halfway.HalfWayStrategy; import com.alibaba.csp.sentinel.slots.statistic.halfway.HalfWayStrategyManager; import com.alibaba.csp.sentinel.slots.system.SystemRule; import com.alibaba.csp.sentinel.slots.system.SystemRuleManager; public class CircuitBreakerExample { public static void main(String[] args) { SystemRule systemRule = new SystemRule(); systemRule.setResource("example"); systemRule.setGrade(SystemRuleConstant.GRADER_SYSTEM); // 设置为系统保护 systemRule.setCount(80); // CPU使用率超过80%时触发保护 systemRule.setControlBehavior(SystemRuleConstant.CONTROL_BEHAVIOR_DEFAULT); // 默认拒绝策略 List<SystemRule> rules = new ArrayList<>(); rules.add(systemRule); SystemRuleManager.loadRules(rules); HalfWayStrategyManager.setHalfWayStrategy(new HalfWayStrategy() { @Override public boolean isHalfWay(int successCount, int requestCount) { return successCount < 5; // 当成功请求少于5次时进行熔断 } }); // 模拟请求 for (int i = 0; i < 10; i++) { if (SentinelBlockExceptionUtil.tryAcquire("example")) { System.out.println("Request " + i + " is processed"); } else { System.out.println("Request " + i + " is rejected"); } } } }
在实际操作中,你可以根据具体的业务场景和需求,配置不同的规则和策略。例如,在流量高峰时,你可以设置更加严格的流量控制规则;在服务不稳定时,你可以及时进行熔断降级处理。
以下是一个实际操作的示例:
初始化 Sentinel:
在你的应用程序启动时,初始化 Sentinel 并加载规则。
配置流量控制:
根据业务需求设置 QPS 和并发线程数的限制。
配置授权:
根据用户、IP 和时间等因素进行授权配置。
配置熔断降级:
设置熔断降级规则,确保在服务不稳定时及时处理。
未加载规则
如果你在启动时没有正确加载规则,可能会导致规则未生效。确保在初始化 Sentinel 时正确加载规则。
规则冲突
如果你在不同的配置文件或代码中设置了相同的资源规则,可能会导致规则冲突。确保规则配置一致且不冲突。
规则配置
确保规则配置合理,不过度限制或过于宽松。
监控信息
定期检查 Sentinel 提供的监控信息,确保服务状态正常。
通过本文的介绍,你应该对 Sentinel 的基本概念、安装配置、核心功能以及实战演练有了全面的了解。Sentinel 是一个强大的服务治理与保护库,能够帮助你在微服务架构中保护服务的稳定性和性能。希望本文能帮助你更好地理解和使用 Sentinel。
Sentinel 提供了许多高级功能,例如:
你可以在 慕课网 学习更多关于 Sentinel 的高级用法和最佳实践。通过不断学习和实践,你将能够更好地利用 Sentinel 来保护你的服务。