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 也是一个不错的选择 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/45732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nvide shortcuts table

快捷键中文功能描述n nvim-tree: 打开预览n nvim-tree: 打开n -nvim-tree: 上一级目录n .nvim-tree: 运行命令n <nvim-tree: 上一个同级节点n >nvim-tree: 下一个同级节点n Bnvim-tree: 切换过滤器&#xff1a;无缓冲区n Cnvim-tree: 切换过滤器&#xff1a;Git 干净n Dn…

JavaWeb(四:Ajax与Json)

一、Ajax 1.定义 Ajax&#xff08;Asynchronous JavaScript And XML&#xff09;&#xff1a;异步的 JavaScript 和 XML AJAX 不是新的编程语言&#xff0c;指的是⼀种交互方式&#xff1a;异步加载。 客户端和服务器的数据交互更新在局部页面的技术&#xff0c;不需要刷新…

Openerstry + lua + redis根据请求参数实现动态路由转发

文章目录 一、需求分析二、准备1、软件安装2、redis-lua封装优化 三、实现1、nginx.conf2、dynamic.lua注意 3、准备两个应用4、访问nginx 一、需求分析 根据用户访问url的参数&#xff0c;将请求转发到对应指定IP的服务器上。 二、准备 1、软件安装 安装openrestyredis&am…

Database数据库 vs Data Warehouse数据仓库 vs Data Mart数据集市 vs Data Lake数据湖

1.DATABASE 数据库 数据库是一个结构化的数据集合&#xff0c;用于存储、管理和检索数据。数据库设计用于支持事务处理&#xff08;OLTP&#xff0c;Online Transaction Processing&#xff09;和日常操作。 数据库通常由数据库管理系统&#xff08;DBMS&#xff09;控制&…

golang json反序列化科学计数法的坑

问题背景 func CheckSign(c *gin.Context, signKey string, singExpire int) (string, error) {r : c.Requestvar formParams map[string]interface{}if c.Request.Body ! nil {bodyBytes, _ : io.ReadAll(c.Request.Body)defer c.Request.Body.Close()if len(bodyBytes) >…

PostgreSQL(二十二)缓冲区管理器

目录 一、缓冲区概述 1、缓冲区结构 2、buffer_tag结构 3、Backend进程读取操作 4、写脏块 二、缓冲区管理器结构 1、第一层&#xff1a;Buffer Table layer&#xff08;缓冲区表层&#xff09; 2、第二层&#xff1a;Buffer Descriptor Layer&#xff08;缓冲区描述层…

秋招Java后端开发冲刺——Mybatis使用总结

一、基本知识 1. 介绍 MyBatis 是 Apache 的一个开源项目&#xff0c;它封装了 JDBC&#xff0c;使开发者只需要关注 SQL 语句本身&#xff0c;而不需要再进行繁琐的 JDBC 编码。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java POJO&#xff08;Plain …

Elasticsearch 建议(Suggesters):实现自动补全和拼写检查

引言 在现代搜索引擎中&#xff0c;自动补全和拼写检查功能已成为提升用户体验的重要工具。Elasticsearch&#xff0c;作为一款强大的分布式搜索和分析引擎&#xff0c;提供了多种Suggesters API来帮助开发者实现这些功能。本文将详细介绍Elasticsearch中的四种主要Suggester—…

Bertopic环境安装与文本主题聚类

文章目录 1.环境配置(一)安装:anaconda1. 理解:为什么需要anaconda2. 下载anaconda3. 启动anaconda(二)安装:python环境(三)安装:依赖包hdbscan的安装问题解决方案1. 安装build-tools-for-visual-studio2. 安装hdbscan(四)安装transformers、BERTopic等重要依赖包2…

【Flask从入门到精通:第八课:ORM、Flask-SQLAlchemy】

ORM ORM 全拼Object-Relation Mapping&#xff0c;中文意为 对象-关系映射。主要实现模型对象到关系数据库数据的映射。 ORM提供了一种面向对象操作数据库的方式给开发者。不需要编写原生SQL语句也能操作数据库&#xff0c;实现了业务代码与底层数据的解耦。 优点&#xff1…

Linux rpm打包(rpmbuild、spec文件)(rpmlint)(Red Hat Package Manager)(rpm包制作、安装包制作)

文章目录 RPM 打包概述定义与重要性核心组件- rpm&#xff1a;基本命令行工具&#xff0c;用于安装、查询、验证和卸载RPM包。- rpmbuild&#xff1a;用于构建 RPM 软件包的工具。- spec 文件&#xff1a;定义了如何构建 RPM 包的脚本&#xff0c;包括包描述、版本、构建指令等…

硬件产品经理:电子产品加工成本

目录 1、板材费用 2、SMT、THT加工 3、组装费 4、测试费 电子产品的加工主体可以分为四个大的部分: 1、板材费用 首选就是PCB的板材费用,一般是按照平米计算的,普通双层板是400左右/平米。 量产会更便宜一些。 如果沉金或其他加工工艺,成本会增加不少。 2、SMT、THT加工…

Milvus 核心设计 (4) ---- metric及index原理详解与示例(2)

目录 背景 Binary Embedding 定义与特点 常见算法 应用场景 距离丈量的方式 Jaccard Hamming 代码实现 Index BIN_FLAT BIN_IVF_FLAT Sparse embeddings 定义 应用场景 优点 实现方式 距离丈量方式 IP Index SPARSE_INVERTED_INDEX 应用场景 优势 SPAR…

零信任的架构结合模块化沙箱,实现一机两用的解决方案

零信任沙箱是深信达提出的一种数据安全解决方案&#xff0c;它将零信任原则与SDC沙箱技术的优势相结合。零信任原则是一种安全概念&#xff0c;核心思想是“永不信任&#xff0c;总是验证”。它要求对每一个访问请求都进行严格的身份验证和授权&#xff0c;无论请求来源于内部还…

从RL的专业角度解惑 instruct GPT的目标函数

作为早期chatGPT背后的核心技术&#xff0c;instruct GPT一直被业界奉为里程碑式的著作。但是这篇论文关于RL的部分确写的非常模糊&#xff0c;几乎一笔带过。当我们去仔细审查它的目标函数的时候&#xff0c;心中不免有诸多困惑。特别是作者提到用PPO来做强化学习&#xff0c;…

【微信小程序知识点】手机号验证组件

手机验证组件&#xff0c;用于帮助开发者向用户发起手机号申请&#xff0c;必须经过用户同意后&#xff0c;才能获得由平台验证后的手机号&#xff0c;进而为用户提供相应的服务。 手机号验证组件分为两种&#xff1a;手机号快速验证组件以及手机号实时验证组件。 1.手机号快速…

【微信小程序知识点】自定义构建npm

在实际开发中&#xff0c;随着项目的功能越来越多&#xff0c;项目越来越复杂&#xff0c;文件目录也变得很繁琐&#xff0c;为了方便进行项目的开发&#xff0c;开发人员通常会对目录结构进行优化调整&#xff0c;例如&#xff1a;将小程序源码放到miniprogram目录下。 &…

【C++】使用gtest做单元测试框架写单元测试

本文主要介绍在将gtest框架引入到项目里过程中遇到的问题。 我的需求如下: 用CMake构建项目。我要写一些测试程序验证某些功能,但是不想每一个测试都新建一个main函数。 因为新建一个main函数就要在CMakeList.txt里增加一个project,非常不方便。 于是我搜了下,C++里有没…

Portainer工具

Portainer是一款免费、开源的Docker的图形化管理工具&#xff0c;其能够提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作&#xff08;包括上传下载镜像&#xff0c;创建容器等操作&#xff09;、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和…

深入理解JS中的闭包

闭包是JavaScript中一个非常强大的特性&#xff0c;它允许函数访问并操作函数外部的变量。在深入理解闭包之前&#xff0c;我们需要先了解JavaScript的作用域和作用域链的概念。 1、作用域和作用域链 在JavaScript中&#xff0c;作用域决定了代码块中变量和其他资源的可见性。…