为了账号安全,请及时绑定邮箱和手机立即绑定

Sentinel初识资料:新手入门指南

标签:
杂七杂八
概述

Sentinel是一款由阿里巴巴开源的分布式服务保护框架,主要提供流量控制、熔断降级和系统自适应保护等功能。本文将详细介绍Sentinel的各个功能模块及其应用场景,帮助读者全面了解Sentinel初识资料。

Sentinel简介
什么是Sentinel

Sentinel 是阿里巴巴开源的一款分布式服务保护框架,主要提供流量控制、熔断降级和系统自适应保护等功能。它可以帮助开发者在分布式系统中保护服务,防止因流量过大或系统负载过重而导致服务不可用。

Sentinel的主要功能和应用场景

Sentinel 主要具备以下功能:

  • 流量控制:控制流量的入口,通过配置规则限制流量,确保服务的稳定性和响应时间。
  • 熔断降级:当服务调用出现异常时,自动熔断该服务的调用,防止异常蔓延。
  • 系统保护:监控系统负载(CPU、内存等),超出阈值时自动触发保护机制,减少资源消耗。
  • 异常检测:自动检测服务调用的异常情况,提供报警和防护功能。
  • 实时监控:提供实时监控功能,帮助开发者及时了解系统的运行状态。

应用场景主要包括:

  • 微服务架构:在微服务架构中,Sentinel 可以保护每个服务,防止因某一服务故障导致整个系统崩溃。
  • 高并发场景:在流量高峰时期,Sentinel 可以控制流量,保证系统稳定。
  • 服务治理:通过熔断降级功能,可以隔离故障服务,保障其他服务正常运行。
  • 系统监控:实时监控系统的运行状态,及时发现并处理异常。
Sentinel的核心概念和术语

流量控制

流量控制是指对进入系统的流量进行控制,防止流量过大导致系统过载。Sentinel 提供多种流量控制规则,包括:

  • 直接调用量:直接限制某个接口的最大并发调用量。
  • 资源访问量:限制资源访问的最大并发数。
  • QPS 限制:限制每秒钟的访问次数。
  • 并发线程数限制:限制同一时间内的并发线程数。

熔断降级

熔断降级是指当服务调用出现异常时,自动断开服务调用链,防止异常传播。Sentinel 提供多种熔断降级策略,包括:

  • 熔断器:当服务调用失败率达到某个阈值时,自动触发熔断。
  • 降级:当服务调用出现异常时,自动切换到备用服务。
  • 超时降级:当服务调用超时达到某个阈值时,自动触发熔断。

系统保护

系统保护是指监控系统资源使用情况,达到某个阈值时自动触发保护机制。Sentinel 提供多种系统保护规则,包括:

  • CPU 使用率:监控 CPU 使用率,超过阈值时触发保护。
  • 内存使用量:监控内存使用量,超过阈值时触发保护。
  • 单机并发线程数:监控单机并发线程数,超过阈值时触发保护。

实时监控

Sentinel 提供实时监控功能,监控系统的运行状态,包括:

  • 流量监控:监控流入系统的流量。
  • 异常监控:监控服务调用的异常情况。
  • 调用链监控:监控服务之间的调用链路。
安装与配置
Sentinel的安装步骤
  1. 下载 Sentinel

    • 从 Sentinel 的 GitHub 仓库下载最新版本的发布包,或通过 Maven 依赖引入 Sentinel。
    <dependency>
       <groupId>com.alibaba.csp</groupId>
       <artifactId>sentinel-core</artifactId>
       <version>1.8.3</version>
    </dependency>
    <dependency>
       <groupId>com.alibaba.csp</groupId>
       <artifactId>sentinel-datasource-consul</artifactId>
       <version>1.8.3</version>
    </dependency>
  2. 配置 Sentinel

    • 配置 Sentinel 的基本参数,如是否开启控制台、是否开启远程数据采集等。
    • 以下是一个配置示例:
    Sentinel.init(new InitFunc() {
       @Override
       public void init() {
           // 开启控制台
           Sentinel.init(new ConsulClient("localhost", 8500));
           // 设置报警规则
           RuleManager.loadRules(Arrays.asList(
               new FlowRule(new ResourceWrapper("resource1"))
                   .setGrade(RuleConstant.FLOW_GRADE_QPS)
                   .setCount(20L)
                   .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)
                   .setWarmUpPeriodSec(10)
                   .setWarmUpMaxRequestCount(1000)
           ));
       }
    });
Sentinel的配置方法
  1. 配置流量控制规则

    • 配置流量控制规则,限制接口的调用频率。
    FlowRule flowRule = new FlowRule(new ResourceWrapper("resource1"))
       .setGrade(RuleConstant.FLOW_GRADE_QPS)
       .setCount(20L)
       .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)
       .setWarmUpPeriodSec(10)
       .setWarmUpMaxRequestCount(1000);
    RuleManager.loadRules(Arrays.asList(flowRule));
  2. 配置熔断降级规则

    • 配置熔断降级规则,设置熔断门限和恢复策略。
    CircuitBreaker rule = new CircuitBreaker(new ResourceWrapper("resource1"))
       .setStatIntervalMs(1000)
       .setSlowRatioThreshold(0.2)
       .setPermittedNumberOfHalfOpenRequests(3)
       .setBlockResponseWhenNoHalfOpenReqs(true);
    RuleManager.loadRules(Arrays.asList(rule));
  3. 配置系统保护规则

    • 配置系统保护规则,监控系统资源使用情况。
    SystemRule sysRule = new SystemRule()
       .setCpuThreshold(0.8)
       .setThreadThreshold(1000)
       .setHeapThreshold(100)
       .setStackThreshold(100);
    RuleManager.loadSystemRule(sysRule);
  4. 配置控制台

    • 配置 Sentinel 控制台,开启控制台监控。
    Sentinel.init(new ConsulClient("localhost", 8500));
常见配置问题解答
  1. 如何查看已配置的规则?

    • 可以通过 RuleManager 查看已加载的规则列表。
    List<FlowRule> flowRules = RuleManager.getFlowRules();
    for (FlowRule rule : flowRules) {
       System.out.println(rule);
    }
  2. 如何动态更新规则?

    • 可以通过 RuleManager 更新规则。
    RuleManager.updateRules(Arrays.asList(new FlowRule(new ResourceWrapper("resource1"))
       .setGrade(RuleConstant.FLOW_GRADE_QPS)
       .setCount(25L)
       .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)
       .setWarmUpPeriodSec(10)
       .setWarmUpMaxRequestCount(1000)
    ));
快速上手
Sentinel的基本使用方法
  1. 引入依赖

    • 在项目中引入 Sentinel 的依赖。
    <dependency>
       <groupId>com.alibaba.csp</groupId>
       <artifactId>sentinel-core</artifactId>
       <version>1.8.3</version>
    </dependency>
  2. 初始化 Sentinel

    • 初始化 Sentinel 并配置基本参数。
    Sentinel.init(new InitFunc() {
       @Override
       public void init() {
           // 开启控制台
           Sentinel.init(new ConsulClient("localhost", 8500));
           // 设置报警规则
           RuleManager.loadRules(Arrays.asList(
               new FlowRule(new ResourceWrapper("resource1"))
                   .setGrade(RuleConstant.FLOW_GRADE_QPS)
                   .setCount(20L)
                   .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)
                   .setWarmUpPeriodSec(10)
                   .setWarmUpMaxRequestCount(1000)
           ));
       }
    });
  3. 使用 Sentinel 进行流量控制

    • 在调用服务前检查流量控制规则。
    public void callService() {
       if (SphU.entry("resource1")) {
           // 调用服务的代码
       } else {
           // 流量控制造成的阻塞
       }
    }
Sentinel的API调用示例
  1. 创建资源

    • 创建一个资源,即一个需要保护的服务。
    String resource = "resource1";
    Entry entry = SphU.entry(resource);
  2. 调用服务

    • 在资源保护下执行服务调用。
    public void callService() {
       if (SphU.entry("resource1")) {
           // 调用服务的代码
           serviceClient.doService();
           SphU.exit();
       } else {
           // 流量控制造成的阻塞
       }
    }
  3. 流控规则配置

    • 配置流量控制规则,限制特定资源的访问量。
    FlowRule flowRule = new FlowRule(new ResourceWrapper("resource1"))
       .setGrade(RuleConstant.FLOW_GRADE_QPS)
       .setCount(20L)
       .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)
       .setWarmUpPeriodSec(10)
       .setWarmUpMaxRequestCount(1000);
    RuleManager.loadRules(Arrays.asList(flowRule));
Sentinel控制台的使用介绍

Sentinel 控制台是一个 Web 应用,用于监控和管理 Sentinel 规则。控制台提供了丰富的监控面板、规则配置、报警等功能。

  1. 启动控制台

    • 通过配置启动控制台。
    Sentinel.init(new ConsulClient("localhost", 8500));
  2. 访问控制台

    • 启动后访问控制台,一般默认端口为 8080。
    http://localhost:8080
  3. 规则配置

    • 在控制台中配置各种规则,如流量控制规则、熔断降级规则等。

    • 进入控制台后,选择相应的规则配置页面,填写规则参数并保存。
  4. 监控面板

    • 在控制台中查看各种监控数据,如流量监控、异常监控等。

    • 通过监控面板,可以实时查看系统的运行状态,发现潜在问题。
流量控制
流量控制的基本概念

流量控制是指对进入系统的流量进行控制,防止流量过大导致系统过载。Sentinel 提供多种流量控制规则,包括:

  • 直接调用量:直接限制某个接口的最大并发调用量。
  • 资源访问量:限制资源访问的最大并发数。
  • QPS 限制:限制每秒钟的访问次数。
  • 并发线程数限制:限制同一时间内的并发线程数。
实现流量控制的步骤
  1. 定义资源

    • 定义需要保护的服务资源。
    String resource = "resource1";
  2. 配置流量控制规则

    • 配置流量控制规则,限制资源的访问量。
    FlowRule flowRule = new FlowRule(new ResourceWrapper("resource1"))
       .setGrade(RuleConstant.FLOW_GRADE_QPS)
       .setCount(20L)
       .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)
       .setWarmUpPeriodSec(10)
       .setWarmUpMaxRequestCount(1000);
    RuleManager.loadRules(Arrays.asList(flowRule));
  3. 调用保护资源

    • 在调用服务前检查流量控制规则。
    public void callService() {
       if (SphU.entry("resource1")) {
           // 调用服务的代码
           serviceClient.doService();
           SphU.exit();
       } else {
           // 流量控制造成的阻塞
       }
    }
流量控制策略的应用场景
  1. 流量高峰

    • 在流量高峰时期,通过流量控制限制系统的访问量,防止系统过载。
    FlowRule flowRule = new FlowRule(new ResourceWrapper("resource1"))
       .setGrade(RuleConstant.FLOW_GRADE_QPS)
       .setCount(20L)
       .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)
       .setWarmUpPeriodSec(10)
       .setWarmUpMaxRequestCount(1000);
    RuleManager.loadRules(Arrays.asList(flowRule));
  2. 资源访问限制

    • 限制特定资源的访问量,防止资源被滥用。
    FlowRule flowRule = new FlowRule(new ResourceWrapper("resource1"))
       .setGrade(RuleConstant.FLOW_GRADE_THREAD)
       .setCount(20L)
       .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
    RuleManager.loadRules(Arrays.asList(flowRule));
  3. 系统稳定性保障

    • 通过流量控制确保系统的稳定性,避免因流量过大导致系统崩溃。
    FlowRule flowRule = new FlowRule(new ResourceWrapper("resource1"))
       .setGrade(RuleConstant.FLOW_GRADE_QPS)
       .setCount(20L)
       .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)
       .setWarmUpPeriodSec(10)
       .setWarmUpMaxRequestCount(1000);
    RuleManager.loadRules(Arrays.asList(flowRule));
熔断降级
熔断降级的基本原理

熔断降级是指当服务调用出现异常时,自动断开服务调用链,防止异常传播。Sentinel 提供多种熔断降级策略,包括:

  • 熔断器:当服务调用失败率达到某个阈值时,自动触发熔断。
  • 降级:当服务调用出现异常时,自动切换到备用服务。
  • 超时降级:当服务调用超时达到某个阈值时,自动触发熔断。
如何配置熔断降级策略
  1. 配置熔断器

    • 配置熔断器,设置熔断门限和恢复策略。
    CircuitBreaker rule = new CircuitBreaker(new ResourceWrapper("resource1"))
       .setStatIntervalMs(1000)
       .setSlowRatioThreshold(0.2)
       .setPermittedNumberOfHalfOpenRequests(3)
       .setBlockResponseWhenNoHalfOpenReqs(true);
    RuleManager.loadRules(Arrays.asList(rule));
  2. 配置降级策略

    • 配置降级策略,设置降级后的备用服务。
    RuleManager.loadRules(Arrays.asList(
       new FlowRule(new ResourceWrapper("resource1"))
           .setGrade(RuleConstant.FLOW_GRADE_QPS)
           .setCount(20L)
           .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)
           .setWarmUpPeriodSec(10)
           .setWarmUpMaxRequestCount(1000)
    ));
  3. 配置超时降级

    • 配置服务调用超时降级策略。
    RuleManager.loadRules(Arrays.asList(
       new TimeoutRule(new ResourceWrapper("resource1"))
           .setTimeoutMillis(2000)
           .setCount(20L)
           .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)
           .setWarmUpPeriodSec(10)
           .setWarmUpMaxRequestCount(1000)
    ));
熔断降级策略的应用实例
  1. 服务调用失败率过高

    • 当服务调用失败率达到某个阈值时,触发熔断。
    CircuitBreaker rule = new CircuitBreaker(new ResourceWrapper("resource1"))
       .setStatIntervalMs(1000)
       .setSlowRatioThreshold(0.2)
       .setPermittedNumberOfHalfOpenRequests(3)
       .setBlockResponseWhenNoHalfOpenReqs(true);
    RuleManager.loadRules(Arrays.asList(rule));
  2. 服务调用超时

    • 当服务调用超时达到某个阈值时,触发熔断。
    RuleManager.loadRules(Arrays.asList(
       new TimeoutRule(new ResourceWrapper("resource1"))
           .setTimeoutMillis(2000)
           .setCount(20L)
           .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)
           .setWarmUpPeriodSec(10)
           .setWarmUpMaxRequestCount(1000)
    ));
  3. 服务降级

    • 当服务调用出现异常时,自动切换到备用服务。
    RuleManager.loadRules(Arrays.asList(
       new FlowRule(new ResourceWrapper("resource1"))
           .setGrade(RuleConstant.FLOW_GRADE_QPS)
           .setCount(20L)
           .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DIRECT)
           .setWarmUpPeriodSec(10)
           .setWarmUpMaxRequestCount(1000)
    ));
实战演练
Sentinel在实际项目中的应用案例
  1. 微服务架构中的应用

    • 在微服务架构中,Sentinel 可以保护每个服务,防止因某一服务故障导致整个系统崩溃。
    public class ServiceA {
       public void callService() {
           if (SphU.entry("service-a")) {
               // 调用服务的代码
               serviceClient.doService();
               SphU.exit();
           } else {
               // 流量控制造成的阻塞
           }
       }
    }
  2. 高并发场景中的应用

    • 在流量高峰时期,通过流量控制限制系统的访问量,防止系统过载。
    FlowRule flowRule = new FlowRule(new ResourceWrapper("service-a"))
       .setGrade(RuleConstant.FLOW_GRADE_QPS)
       .setCount(20L)
       .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)
       .setWarmUpPeriodSec(10)
       .setWarmUpMaxRequestCount(1000);
    RuleManager.loadRules(Arrays.asList(flowRule));
  3. 服务治理中的应用

    • 通过熔断降级功能,可以隔离故障服务,保障其他服务正常运行。
    CircuitBreaker rule = new CircuitBreaker(new ResourceWrapper("service-a"))
       .setStatIntervalMs(1000)
       .setSlowRatioThreshold(0.2)
       .setPermittedNumberOfHalfOpenRequests(3)
       .setBlockResponseWhenNoHalfOpenReqs(true);
    RuleManager.loadRules(Arrays.asList(rule));
初学者常见问题与解决方法
  1. 配置规则不生效

    • 确保规则配置正确,并且已加载到 RuleManager。
    RuleManager.loadRules(Arrays.asList(
       new FlowRule(new ResourceWrapper("resource1"))
           .setGrade(RuleConstant.FLOW_GRADE_QPS)
           .setCount(20L)
           .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)
           .setWarmUpPeriodSec(10)
           .setWarmUpMaxRequestCount(1000)
    ));
  2. 无法触发熔断

    • 检查熔断器的配置参数,确保触发条件正确。
    CircuitBreaker rule = new CircuitBreaker(new ResourceWrapper("resource1"))
       .setStatIntervalMs(1000)
       .setSlowRatioThreshold(0.2)
       .setPermittedNumberOfHalfOpenRequests(3)
       .setBlockResponseWhenNoHalfOpenReqs(true);
    RuleManager.loadRules(Arrays.asList(rule));
  3. 控制台无法访问

    • 检查控制台的配置,确保控制台已经启动并且端口正确。
    Sentinel.init(new ConsulClient("localhost", 8500));
Sentinel社区与资源推荐
  • GitHub 仓库:Sentinel 的官方 GitHub 仓库,提供了最新的代码和文档。

  • 官方文档:Sentinel 的官方文档,提供了详细的使用指南和 API 文档。

  • 社区支持:Sentinel 社区提供问题解答和技术支持。

  • 慕课网:提供 Sentinel 的视频教程和实战演练。
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消