Hystrix是一个由Netflix开发的开源Java库,用于实现延迟容忍和容错逻辑,以增强分布式服务之间的交互的弹性。Hystrix通过隔离服务之间的访问点,阻止级联故障,并提供后备选项来实现这一目标。Hystrix的核心功能包括服务降级、服务熔断、线程隔离、请求缓存、请求合并以及实时故障监控。
Sentinel 是由阿里巴巴开源的用于微服务架构的高可用流量控制组件,它通过提供流量控制、熔断降级、系统自适应保护等功能,帮助保障微服务的稳定性 。
Sentinel 的基本使用步骤如下:
- 添加 Sentinel 依赖:在项目的
pom.xml
文件中添加 Sentinel 的 Maven 依赖。 - 定义资源:通过代码或注解的方式定义需要保护的资源。
- 定义规则:设置流量控制规则、熔断降级规则等。
- 验证效果:通过实际请求验证 Sentinel 的规则是否按预期工作。
Sentinel 控制台搭建:
- 下载 Sentinel 控制台的
jar
包,可以从 Sentinel GitHub Releases 获取。 - 在命令行中,使用
java
命令启动 Sentinel 控制台,确保 JDK 版本为 1.8 或以上:java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar
- 访问
http://localhost:8080
,在浏览器中输入 URL 进入 Sentinel 控制台的主页面 。
Sentinel 的规则配置:
Sentinel 支持多种数据源进行规则配置,包括本地文件、Nacos、ZooKeeper 等。以文件配置为例,可以创建一个 FileDataSourceInit
类来读取本地配置文件,并在 resources/META-INF/services
目录下创建 com.alibaba.csp.sentinel.init.InitFunc
文件,指向 FileDataSourceInit
类的全限定名称,从而初始化规则 。
动态规则配置:
Sentinel 允许开发者通过 API 或数据源动态修改规则。例如,使用 Nacos 作为配置中心时,可以通过改造 Sentinel 源码并编译,然后在 Nacos 控制台添加配置,实现规则的推送和持久化 。
Sentinel 的工作机制:
Sentinel 的主要工作机制包括定义资源、实时统计和调用链路分析、根据预设规则控制流量、提供实时监控系统等 。
Sentinel 与 Spring Cloud Gateway 集成:
Sentinel 可以与 Spring Cloud Gateway 集成,实现网关层的流量控制和熔断。通过添加依赖、配置文件设置、定义规则和验证规则,可以对通过网关的请求进行 Sentinel 保护 。
通过上述步骤和配置,可以有效地使用 Sentinel 来增强微服务架构的稳定性和可靠性。
简单描述各种用法
Sentinel 提供了多种用法来满足不同场景下的流量控制和熔断需求。以下是 Sentinel 的一些主要用法的详细描述:
1. 流量控制(Flow Control)
- 目的:限制资源的访问量,例如每秒请求数(QPS),以防止系统过载。
- 实现:通过定义流量规则,如QPS阈值和流量控制效果(直接拒绝、排队等待、Warm Up预热等)。
2. 熔断降级(Circuit Breaking)
- 目的:当下游服务不可用或响应时间过长时,防止系统雪崩效应。
- 实现:通过设置熔断规则,如异常比例、响应时间阈值,触发熔断机制。
3. 系统自适应保护(System Protection)
- 目的:根据系统的实时运行指标(如CPU、内存、线程数等)动态调整流量。
- 实现:Sentinel 会根据当前系统的负载情况自动调整流量,以保持系统的稳定运行。
4. 热点参数限流(Param Flow Control)
- 目的:对含有热点参数的请求进行限制,如某个参数的请求量特别大。
- 实现:通过定义热点规则,对特定的参数值进行访问量限制。
5. 授权规则(Authority Rule)
- 目的:对调用者进行授权,设置黑白名单。
- 实现:通过定义授权规则,控制哪些调用者可以访问特定的资源。
6. 监控和告警(Monitoring and Alerting)
- 目的:实时监控应用的流量和性能指标,并在达到阈值时发出告警。
- 实现:Sentinel 控制台提供了实时的监控和告警功能。
7. 控制台管理(Dashboard Management)
- 目的:通过控制台统一管理和配置规则。
- 实现:使用 Sentinel 控制台进行规则的配置、管理和推送。
8. 动态规则配置(Dynamic Rule Configuration)
- 目的:允许在运行时动态修改规则,而无需重启应用。
- 实现:通过 Sentinel 控制台或API动态修改规则,并实时生效。
9. 多数据源支持(Multiple Data Sources)
- 目的:支持从不同的数据源(如Nacos、Zookeeper、文件等)加载规则。
- 实现:配置 Sentinel 与多种数据源的集成,实现规则的集中管理和动态更新。
10. 与Spring Cloud Gateway集成(Integration with Spring Cloud Gateway)
- 目的:在微服务网关层实现流量控制和熔断。
- 实现:通过Spring Cloud Gateway集成Sentinel,对进入的请求进行流量控制和熔断。
11. 规则持久化(Rule Persistence)
- 目的:将规则存储在持久化存储中,保证规则的持久化和一致性。
- 实现:使用Nacos或其他配置中心作为规则的持久化存储。
12. 服务熔断的细粒度控制(Fine-grained Circuit Breaking)
- 目的:对服务的不同调用参数或方法进行细粒度的熔断控制。
- 实现:通过定义具体的资源名称和对应的熔断规则,实现细粒度的熔断控制。
13. 异步调用链路支持(Asynchronous Invocation Chain Support)
- 目的:在异步调用场景中实现流量控制和熔断。
- 实现:Sentinel 支持异步调用的资源定义和规则配置。
通过这些用法,Sentinel 可以灵活地应用于各种微服务场景,提供强大的流量控制和熔断能力,保护系统稳定运行。
代码解释
1. 流量控制(Flow Control)
假设我们有一个 getUserInfo
方法,我们希望每秒只处理20个请求。
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;@SentinelResource("getUserInfo")
public Map<String, Object> getUserInfo(String userId) {// 业务逻辑return null;
}// 初始化流量规则
FlowRule rule = new FlowRule().setResource("getUserInfo") // 资源名称.setGrade(RuleConstant.FLOW_GRADE_QPS) // 限流阈值类型.setCount(20); // 限流阈值
FlowRuleManager.loadRules(Collections.singletonList(rule));
2. 熔断降级(Circuit Breaking)
如果 getUserInfo
方法连续失败超过一定次数,我们希望触发熔断。
@SentinelResource(value = "getUserInfo", blockHandler = "handleGetUserInfoException")
public Map<String, Object> getUserInfo(String userId) {// 业务逻辑return null;
}public Map<String, Object> handleGetUserInfoException(String userId, BlockException ex) {// 熔断逻辑,返回备用数据return Collections.singletonMap("error", "Service is unavailable");
}
3. 系统自适应保护(System Protection)
设置系统规则,当线程数达到一定阈值时触发系统保护。
List<Rule> rules = new ArrayList<>();
SystemRule systemRule = new SystemRule().setHighestSystemLoad(75) // 最大系统负载.setAverageRt(200) // 平均响应时间.setHighestCpuUsage(75); // 最大CPU使用率
rules.add(systemRule);
RuleManager.loadRules(rules);
4. 热点参数限流(Param Flow Control)
假设 getUserInfo
方法根据 userId
限流,每个用户ID每秒只能请求一次。
@SentinelResource(value = "getUserInfo", blockHandlerClass = ParamFlowHandle.class)
public Map<String, Object> getUserInfo(String userId) {// 业务逻辑return null;
}// ParamFlowHandle.java
public class ParamFlowHandle {@SentinelResource(value = "getUserInfo_paramFlow", blockHandler = "paramFlowBlockHandler")public void handleParamFlow(String userId) {// 热点参数限流逻辑}public void paramFlowBlockHandler(String userId, BlockException ex) {// 限流后的逻辑}
}
5. 授权规则(Authority Rule)
设置授权规则,只有特定的调用者可以访问 getUserInfo
方法。
@SentinelResource(value = "getUserInfo", blockHandler = "handleAuthException")
public Map<String, Object> getUserInfo(String userId) {// 业务逻辑return null;
}public Map<String, Object> handleAuthException(String userId, BlockException ex) {// 授权失败逻辑return Collections.singletonMap("error", "Unauthorized access");
}
6. 监控和告警(Monitoring and Alerting)
Sentinel 控制台提供了实时的监控功能,可以查看每个资源的QPS、线程数、响应时间等指标。
7. 控制台管理(Dashboard Management)
通过 Sentinel 控制台,我们可以动态添加、修改和删除规则。
8. 动态规则配置(Dynamic Rule Configuration)
通过 Sentinel 控制台或API,我们可以在运行时动态修改规则。
9. 多数据源支持(Multiple Data Sources)
配置 Sentinel 使用 Nacos 作为规则的持久化存储。
spring:cloud:sentinel:datasource:nacos:server-addr: 127.0.0.1:8848dataId: sentinel-flow-rulesgroupId: DEFAULT_GROUPrule-type: flow
10. 与Spring Cloud Gateway集成(Integration with Spring Cloud Gateway)
在网关层使用 Sentinel 实现请求的限流。
@Configuration
public class GatewayConfig {@Beanpublic SentinelGatewayFilterFactory gatewayFilterFactory() {return new SentinelGatewayFilterFactory();}
}
这些示例展示了 Sentinel 在不同场景下的应用方式,包括代码注解、规则配置、控制台管理和与Spring Cloud Gateway的集成等。通过这些示例,您可以更好地理解 Sentinel 的强大功能和灵活性。
比较:
Hystrix和Sentinel都是微服务架构中重要的组件,用于实现服务的熔断、降级和流量控制功能,提高系统的可用性和容错性。以下是两者的详细对比和运用详解:
Hystrix__235">Hystrix 运用详解:
Hystrix 是由 Netflix 开发的一个用于处理分布式系统的延迟和容错的库。它通过断路器模式来防止系统雪崩效应,主要提供了线程池隔离、请求缓存、服务降级等功能 。
- 线程池隔离:为每个服务调用分配独立的线程池,防止单个依赖服务的故障耗尽系统中的所有线程资源。
- 服务降级:在服务调用失败或超时时,提供备选方案,例如返回默认值或缓存的数据。
- 熔断机制:当服务调用失败达到一定阈值时,自动启动熔断机制,快速返回错误,避免系统资源的浪费。
- 实时监控:提供 Hystrix Dashboard 实时监控服务调用状态和性能指标。
Sentinel 运用详解:
Sentinel 是阿里巴巴开源的流量控制和熔断框架,它提供了更为轻量级和灵活的解决方案,相比 Hystrix 有更多的优点 。
- 流量控制:Sentinel 可以从流量控制角度,限制资源的访问量,避免因流量过高而导致系统崩溃。
- 熔断降级:Sentinel 支持基于失败比率、异常比例、响应时间等多维度的熔断降级规则。
- 系统自适应保护:Sentinel 能够根据系统的负载情况,自动控制流量的通过,防止系统过载。
- 实时监控:Sentinel 提供实时监控功能,可以在控制台中看到接入应用的单台机器秒级数据。
Hystrix__Sentinel__251">Hystrix 与 Sentinel 的区别:
- 资源隔离:Hystrix 支持线程池隔离和信号量隔离,而 Sentinel 不支持线程池隔离,但可以通过控制并发线程数提供信号量隔离 。
- 性能影响:Hystrix 线程池隔离可能导致线程上下文切换损耗大,Sentinel 由于不创建额外的线程池,对性能影响较小。
- 实时监控:Hystrix 需要自行搭建监控平台,而 Sentinel 提供了开箱即用的实时监控功能。
- 配置灵活性:Sentinel 支持动态规则配置,可以在运行时修改规则并实时生效,而 Hystrix 不支持这种动态配置。
- 系统负载保护:Sentinel 支持系统自适应限流,可以根据系统负载自动调整流量,而 Hystrix 不支持此功能 。
在技术选型时,应该根据具体的业务需求和系统特点来选择使用 Hystrix 还是 Sentinel。如果需要更为轻量级和灵活的流量控制,以及更好的系统负载保护,Sentinel 是更好的选择。如果系统中已经使用了 Netflix 系列的其他组件,并且对线程池隔离有特定需求,Hystrix 也是一个不错的选择 。