Sentinel和hystric的运用详解

ops/2024/10/18 18:14:46/

Hystrix是一个由Netflix开发的开源Java库,用于实现延迟容忍和容错逻辑,以增强分布式服务之间的交互的弹性。Hystrix通过隔离服务之间的访问点,阻止级联故障,并提供后备选项来实现这一目标。Hystrix的核心功能包括服务降级、服务熔断、线程隔离、请求缓存、请求合并以及实时故障监控。

Sentinel 是由阿里巴巴开源的用于微服务架构的高可用流量控制组件,它通过提供流量控制、熔断降级、系统自适应保护等功能,帮助保障微服务的稳定性 。

Sentinel 的基本使用步骤如下:

  1. 添加 Sentinel 依赖:在项目的 pom.xml 文件中添加 Sentinel 的 Maven 依赖。
  2. 定义资源:通过代码或注解的方式定义需要保护的资源。
  3. 定义规则:设置流量控制规则、熔断降级规则等。
  4. 验证效果:通过实际请求验证 Sentinel 的规则是否按预期工作。

Sentinel 控制台搭建:

  1. 下载 Sentinel 控制台的 jar 包,可以从 Sentinel GitHub Releases 获取。
  2. 在命令行中,使用 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
    
  3. 访问 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 的区别:

  1. 资源隔离Hystrix 支持线程池隔离和信号量隔离,而 Sentinel 不支持线程池隔离,但可以通过控制并发线程数提供信号量隔离 。
  2. 性能影响Hystrix 线程池隔离可能导致线程上下文切换损耗大,Sentinel 由于不创建额外的线程池,对性能影响较小。
  3. 实时监控Hystrix 需要自行搭建监控平台,而 Sentinel 提供了开箱即用的实时监控功能。
  4. 配置灵活性:Sentinel 支持动态规则配置,可以在运行时修改规则并实时生效,而 Hystrix 不支持这种动态配置。
  5. 系统负载保护:Sentinel 支持系统自适应限流,可以根据系统负载自动调整流量,而 Hystrix 不支持此功能 。

在技术选型时,应该根据具体的业务需求和系统特点来选择使用 Hystrix 还是 Sentinel。如果需要更为轻量级和灵活的流量控制,以及更好的系统负载保护,Sentinel 是更好的选择。如果系统中已经使用了 Netflix 系列的其他组件,并且对线程池隔离有特定需求,Hystrix 也是一个不错的选择 。


http://www.ppmy.cn/ops/56887.html

相关文章

css横向滚动条支持鼠标滚轮

在做视频会议的时候&#xff0c;标准模式视图会有顶部收缩的一种交互方式&#xff0c;用到了横向滚动&#xff1b;一般情况下鼠标滚轮只支持竖向滚动&#xff0c;这次写个demo是适配横向滚动&#xff1b; 效果图展示 实现横向滚动条顶部显示 <div className{style.remote_u…

WPF引入多个控件库使用

目的 设计开发时有的控件库的一部分符合我们想要的UI样式&#xff0c;另一部分来自另一个控件库&#xff0c;想把两种库的样式做一个整合在同一个控件资源上。单纯通过引用的方式会导致原有样式被覆盖。这里通过设置全局样式的方式来实现。 1.安装控件库nuget包&#xff1a;H…

社交论坛圈子系统APP开发社交圈子小程序系统源码开源,带语音派对聊天室/圈子社交论坛及时聊天

功能// 首页左右滑动切换分类 使用资讯类app常见的滑动切换分类&#xff0c;让用户使用更方便。 2信息卡片流展示 每条信息都是一个卡片&#xff0c;头像展示会员标签&#xff0c;单图自动宽度&#xff0c;多图九宫格展示&#xff0c;底部展示信息发布地址&#xff0c;阅读量、…

数据赋能(146)——开发:数据拆分——技术方法、主要工具

技术方法 数据拆分的技术方法主要包括以下几种&#xff1a; 简单数据拆分&#xff1a; 随机拆分&#xff1a;简单地将数据集随机划分为几个部分&#xff0c;常用于训练集和测试集的划分。例如&#xff0c;将数据集分为80%的训练集和20%的测试集。按时间拆分&#xff1a;对于有…

【React】基础数据回填--useForm与setFieldsValue详解

相关属性 1.form 2.setFieldsValue 代码 import{ Form }from"antd";const Publish ()>{// 回填数据const [searchParams] useSearchParams()const articleId searchParams.get(id)const [form] Form.useForm()useEffect(() > {async function getAr…

网络设备常见漏洞与解决方法

网络设备常见漏洞 网络设备&#xff0c;如路由器、交换机、防火墙等&#xff0c;是现代网络基础设施的重要组成部分。然而&#xff0c;这些设备也存在各种安全漏洞&#xff0c;可能被攻击者利用来进行未经授权的访问、数据窃取、服务中断等恶意活动。以下是网络设备常见漏洞及…

探索数据结构与算法的奇妙世界 —— Github开源项目推荐《Hello 算法》

在浩瀚的编程与计算机科学领域中&#xff0c;数据结构与算法无疑是每位开发者攀登技术高峰的必经之路。然而&#xff0c;对于初学者而言&#xff0c;这条路往往布满了荆棘与挑战。幸运的是&#xff0c;今天我要向大家推荐一个令人振奋的项目——《Hello Algo》&#xff0c;它正…

【Java】数值操作

文章目录 1.数值数据类型和操作1.1 数值类型1.2 从键盘读取数值1.3 数值操作符 2.数值型字面值2.1 整形字面值2.2 浮点型字面值2.3 科学记数法 示例&#xff1a;显示当前时间3.增强赋值运算符4.自增和自减操作符5.数值类型转换 1.数值数据类型和操作 1.1 数值类型 类型名范围…