当前位置: 首页 > news >正文

Sentinel和hystric的运用详解

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 运用详解:

Hystrix 是由 Netflix 开发的一个用于处理分布式系统的延迟和容错的库。它通过断路器模式来防止系统雪崩效应,主要提供了线程池隔离、请求缓存、服务降级等功能 。

  • 线程池隔离:为每个服务调用分配独立的线程池,防止单个依赖服务的故障耗尽系统中的所有线程资源。
  • 服务降级:在服务调用失败或超时时,提供备选方案,例如返回默认值或缓存的数据。
  • 熔断机制:当服务调用失败达到一定阈值时,自动启动熔断机制,快速返回错误,避免系统资源的浪费。
  • 实时监控:提供 Hystrix Dashboard 实时监控服务调用状态和性能指标。

Sentinel 运用详解:

Sentinel 是阿里巴巴开源的流量控制和熔断框架,它提供了更为轻量级和灵活的解决方案,相比 Hystrix 有更多的优点 。

  • 流量控制:Sentinel 可以从流量控制角度,限制资源的访问量,避免因流量过高而导致系统崩溃。
  • 熔断降级:Sentinel 支持基于失败比率、异常比例、响应时间等多维度的熔断降级规则。
  • 系统自适应保护:Sentinel 能够根据系统的负载情况,自动控制流量的通过,防止系统过载。
  • 实时监控:Sentinel 提供实时监控功能,可以在控制台中看到接入应用的单台机器秒级数据。

Hystrix 与 Sentinel 的区别:

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C#实现最短路径算法
  • 记录些Redis题集(1)
  • mysql历史记录
  • Tomcat底层原理
  • 机器学习——关于极大似然估计法的一些个人思考(通俗易懂极简版)
  • 超详细版阿里云控制台环境配置+数据库配置
  • 电脑出现了msvcr120.dll丢失的问题要怎样修复?理性分析msvcr120.dll文件
  • C++基础入门(上)
  • 从零开始学习PX4源码3(如何上传官网源码到自己的仓库中)
  • 全渠道AI智能商品管理软件平台 助力零售品牌占领技术高地
  • Understanding EtherCAT Device Serial Number Checking
  • 图数据库 - Neo4j简介
  • Elasticsearch 8 支持别名查询
  • centos 安装vnc,配置图形界面
  • 学习测试8-数据库mysql操作
  • “大数据应用场景”之隔壁老王(连载四)
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • AHK 中 = 和 == 等比较运算符的用法
  • Apache的基本使用
  • Java 网络编程(2):UDP 的使用
  • magento 货币换算
  • PhantomJS 安装
  • SQL 难点解决:记录的引用
  • 高性能JavaScript阅读简记(三)
  • 关于List、List?、ListObject的区别
  • 简单实现一个textarea自适应高度
  • 前端代码风格自动化系列(二)之Commitlint
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • -- 数据结构 顺序表 --Java
  • const的用法,特别是用在函数前面与后面的区别
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ${ }的特别功能
  • (C语言)逆序输出字符串
  • (二)linux使用docker容器运行mysql
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (一)、python程序--模拟电脑鼠走迷宫
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)德国人的记事本
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (自适应手机端)行业协会机构网站模板
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET : 在VS2008中计算代码度量值
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .NET程序集编辑器/调试器 dnSpy 使用介绍
  • .NET开发不可不知、不可不用的辅助类(一)
  • @JsonFormat与@DateTimeFormat注解的使用
  • @在php中起什么作用?
  • [ JavaScript ] JSON方法
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)