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:8848
          dataId: sentinel-flow-rules
          groupId: DEFAULT_GROUP
          rule-type: flow
10. 与Spring Cloud Gateway集成(Integration with Spring Cloud Gateway)

在网关层使用 Sentinel 实现请求的限流。

@Configuration
public class GatewayConfig {
    @Bean
    public 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 也是一个不错的选择 。

相关推荐

  1. Sentinelhystric运用详解

    2024-07-13 11:28:03       22 阅读
  2. Hystrix、Resilience4jSentinel对比

    2024-07-13 11:28:03       34 阅读
  3. 学习分享-断路器HystrixSentinel区别

    2024-07-13 11:28:03       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 11:28:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 11:28:03       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 11:28:03       58 阅读
  4. Python语言-面向对象

    2024-07-13 11:28:03       69 阅读

热门阅读

  1. 如何让代码添加的控件显示出来

    2024-07-13 11:28:03       19 阅读
  2. prompt第四讲-fewshot

    2024-07-13 11:28:03       20 阅读
  3. Netty Websocket SpringBoot Starter

    2024-07-13 11:28:03       23 阅读
  4. 第五十五章 生成的 WSDL 的详细信息 - types

    2024-07-13 11:28:03       22 阅读
  5. 开发指南044-切片编程

    2024-07-13 11:28:03       26 阅读
  6. 触发器练习

    2024-07-13 11:28:03       22 阅读
  7. Flutter框架时间线梳理

    2024-07-13 11:28:03       26 阅读
  8. ubuntu wifi ap

    2024-07-13 11:28:03       26 阅读