手记

Sentinel初识学习:新手指南

概述

本文介绍了Sentinel初识学习,包括Sentinel的基本概念、应用场景、主要特点和优势,以及如何安装和配置Sentinel。文章还详细讲解了Sentinel的流控规则、降级策略和系统保护规则,并提供了实例演示。通过这些内容,读者可以全面了解如何使用Sentinel来保护服务免受大流量冲击和异常流量的影响。

Sentinel初识学习:新手指南
1. Sentinel简介

1.1 什么是Sentinel

Sentinel 是阿里巴巴开源的一款轻量级、高性能的Java服务治理与流量控制框架,专注于实时流量控制,提供强大的流量控制能力。Sentinel 通常用于保护服务上的入口流量,能够根据需要动态地调整流量和系统负载,确保系统在高并发和复杂流量模式下的稳定运行。

1.2 Sentinel的作用和应用场景

Sentinel 主要用于微服务架构中,保护服务免受大流量冲击,避免因流量过大而导致系统崩溃。它不仅能够限流,还能进行降级处理,保证系统在异常流量情况下的可用性。具体的应用场景包括:

  • 流量控制:限制接口的QPS,确保接口在高并发情况下仍能稳定运行。
  • 系统保护:保护服务端的CPU、线程数等系统指标,防止资源耗尽。
  • 异常识别:根据运行状况自动识别接口的健康状况,实现自动降级或恢复。
  • 故障降级:在系统不稳定或者负载过高时,对部分请求进行降级处理,保证核心业务的稳定性。

1.3 Sentinel的主要特点和优势

  • 实时监控:Sentinel 提供实时监控功能,能够监控接口、系统、应用等维度的指标。
  • 动态流控:通过简单的配置即可实现动态调整流控策略,适应快速变化的业务场景。
  • 高可用性:Sentinel 自身是无状态的,支持集群部署,具备高可用性。
  • 灵活的规则配置:支持多种类型的流控、降级、系统保护规则,可以根据业务需求灵活配置。
2. 安装和配置Sentinel

2.1 下载和安装Sentinel

Sentinel 提供了多种使用方式,包括 Java Agent 和 Java SDK。以下是安装步骤:

  1. 下载并解压 Java Agent
    wget https://github.com/alibaba/Sentinel/releases/download/1.8.4/sentinel-dashboard-darwin-amd64-1.8.4.tar.gz
    tar -xvf sentinel-dashboard-darwin-amd64-1.8.4.tar.gz
    cd sentinel-dashboard-1.8.4
  2. 启动控制台

    ./sentinel-dashboard

    启动后,可以访问 http://localhost:8080/ 查看控制台。

  3. 引入 Java SDK:在项目中添加依赖:
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-core</artifactId>
        <version>1.8.4</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-transport-simple-http</artifactId>
        <version>1.8.4</version>
    </dependency>

2.2 Sentinel的核心概念

  • 规则:Sentinel 使用规则来定义流量控制和系统保护的策略。规则可以是静态配置或动态配置。
  • 流控:流量控制是防止系统因接收到过多请求而崩溃的一种策略。
  • 降级:当服务不稳定或资源耗尽时,通过降级策略减少请求以减轻系统压力。
  • 系统保护:保护系统核心指标(如CPU、线程数)不受异常流量的影响。

2.3 如何配置Sentinel规则

规则配置可以通过控制台静态配置,也可以通过代码动态配置。以下是静态配置示例:

  1. 控制台配置流控规则

  2. 代码动态配置流控规则

    import com.alibaba.csp.sentinel.slots.block.RuleConstant;
    import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
    import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
    
    public class SentinelConfig {
        public static void configureFlowRules() {
            FlowRule rule = new FlowRule();
            rule.setResource("exampleResource");
            rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
            rule.setCount(100);
            rule.setLimitApp("default");
            List<FlowRule> rules = new ArrayList<>();
            rules.add(rule);
            FlowRuleManager.loadRules(rules);
        }
    }
3. 流控规则详解

3.1 流控的基本概念

流量控制(Flow Control)是一种限制资源访问频率的手段,目的是确保系统在高并发情况下仍能稳定运行。Sentinel 支持多种类型的流控规则,如QPS、线程数、请求并发量等。

3.2 流控规则的类型及配置方法

  • QPS 流控规则:根据每秒请求数限制流量。
    FlowRule qpsRule = new FlowRule();
    qpsRule.setResource("exampleResource");
    qpsRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    qpsRule.setCount(100);
    qpsRule.setLimitApp("default");
  • 线程数流控规则:通过限制线程池中的最大线程数来控制流量。
    FlowRule threadRule = new FlowRule();
    threadRule.setResource("exampleResource");
    threadRule.setGrade(RuleConstant.FLOW_GRADE_THREAD);
    threadRule.setCount(50);
    threadRule.setLimitApp("default");
  • 请求并发量流控规则:限制某一时刻的并发请求量。
    FlowRule concurrentRule = new FlowRule();
    concurrentRule.setResource("exampleResource");
    concurrentRule.setGrade(RuleConstant.FLOW_GRADE_RT);
    concurrentRule.setCount(50);
    concurrentRule.setLimitApp("default");

3.3 实例演示:设置流控规则并测试

  1. 配置流控规则
    • 设置QPS流控规则:
      FlowRule qpsRule = new FlowRule();
      qpsRule.setResource("exampleResource");
      qpsRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
      qpsRule.setCount(100);
      qpsRule.setLimitApp("default");
    • 设置线程数流控规则:
      FlowRule threadRule = new FlowRule();
      threadRule.setResource("exampleResource");
      threadRule.setGrade(RuleConstant.FLOW_GRADE_THREAD);
      threadRule.setCount(50);
      threadRule.setLimitApp("default");
    • 设置请求并发量流控规则:
      FlowRule concurrentRule = new FlowRule();
      concurrentRule.setResource("exampleResource");
      concurrentRule.setGrade(RuleConstant.FLOW_GRADE_RT);
      concurrentRule.setCount(50);
      concurrentRule.setLimitApp("default");
  2. 验证规则是否生效
    public static void checkFlowControl() {
        for (int i = 0; i < 100; i++) {
            try {
                System.out.println("Request: " + i);
                // Simulate business logic here
                Thread.sleep(100);
            } catch (FlowException e) {
                System.out.println("Flow control exception: " + e.getMessage());
            }
        }
    }
4. 降级策略解析

4.1 降级的基本概念

降级策略是一种在系统出现异常或过载情况下,通过减少或停止某些服务的方式来保护系统,避免系统过载崩溃。Sentinel 支持多种降级策略,如服务降级、系统降级等。

4.2 降级策略的类型及配置方法

  • 服务降级:当接口调用失败率达到一定阈值时,自动触发降级。
    RuleConstant.RULE_TYPE_DEGRADATION,
    RuleConstant.DEGRADE_GRADE_RT,
    RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO,
    RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT
  • 系统降级:当系统负载过高时,自动触发降级。
    RuleConstant.RULE_TYPE_SYSTEM,
    RuleConstant.SYSTEM_BLOCK_FAST_REQUEST_RATIO,
    RuleConstant.SYSTEM_BLOCK_REQ_STOCK

4.3 实例演示:设置降级规则并测试

  1. 配置降级规则
    RuleConstant.DEGRADE_GRADE_RT,
    RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO,
    RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT
  2. 验证规则是否生效
    public static void checkDegradation() {
        for (int i = 0; i < 50; i++) {
            try {
                System.out.println("Request: " + i);
                // Simulate business logic with exceptions
                if (i % 10 == 0) {
                    throw new Exception("Simulated exception");
                }
            } catch (Exception e) {
                System.out.println("Degrade exception: " + e.getMessage());
            }
        }
    }
5. 系统保护规则介绍

5.1 系统保护规则的作用

系统保护规则用于保护系统的核心指标,如CPU、线程数等,防止系统过载崩溃。当系统负载超过预设阈值时,系统保护规则会自动触发,限制流量。

5.2 系统保护规则的类型及配置方法

  • CPU使用率保护:当CPU使用率过高时,触发保护机制。
    SystemRule systemRule = new SystemRule();
    systemRule.setGrade(RuleConstant.SYSTEM_BLOCK_FAST_REQUEST_RATIO);
    systemRule.setCount(0.8);
    systemRule.setWarmUpPeriodSec(10);
    systemRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
    systemRule.setClusterMode(true);
  • 线程数保护:当线程数超过阈值时,触发保护机制。
    SystemRule systemRule = new SystemRule();
    systemRule.setGrade(RuleConstant.SYSTEM_BLOCK_REQ_STOCK);
    systemRule.setCount(200);
    systemRule.setWarmUpPeriodSec(10);
    systemRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
    systemRule.setClusterMode(true);

5.3 实例演示:设置系统保护规则并测试

  1. 配置系统保护规则
    RuleConstant.SYSTEM_BLOCK_FAST_REQUEST_RATIO,
    RuleConstant.SYSTEM_BLOCK_REQ_STOCK
  2. 验证规则是否生效
    public static void checkSystemProtection() {
        for (int i = 0; i < 500; i++) {
            try {
                System.out.println("Request: " + i);
                // Simulate business logic with high resource usage
                Thread.sleep(100);
            } catch (SystemBlockException e) {
                System.out.println("System protection exception: " + e.getMessage());
            }
        }
    }
6. 常见问题与解答

6.1 常见错误及解决方法

  • 404 Not Found:确保Sentinel控制台已成功启动,并且能够通过控制台访问。
  • 规则未生效:检查规则配置是否正确,确保规则已加载并生效。
  • 依赖引入问题:确保项目中引入了正确的Sentinel依赖。

6.2 使用Sentinel时的注意事项

  • 规则一致性:确保所有服务节点的规则保持一致,避免因规则不一致导致系统不稳定。
  • 监控指标:定期检查监控指标,及时发现并处理异常。
  • 资源命名:合理命名资源,便于管理和维护。

6.3 进一步学习资源推荐

通过本指南,希望你能够对Sentinel有一个全面的了解,并能够在实际项目中灵活应用。Sentinel 是一个强大的服务治理框架,能够帮助你构建更健壮、更可靠的微服务系统。

0人推荐
随时随地看视频
慕课网APP