继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Sentinel初识:入门级用户快速上手指南

森栏
关注TA
已关注
手记 382
粉丝 101
获赞 475
概述

Sentinel是一款由阿里巴巴开源的分布式服务保护框架,旨在提供一站式的流量控制、超时熔断和系统自适应保护等功能。本文将介绍Sentinel的核心功能、适用场景以及环境搭建的详细步骤,帮助入门级用户快速上手Sentinel初识。

Sentinel初识:入门级用户快速上手指南
Sentinel简介

Sentinel是什么

Sentinel 是阿里巴巴开源的一款分布式服务保护框架,它的目标是提供一站式的流量控制、超时熔断和系统自适应保护等功能。

Sentinel的核心功能

Sentinel 提供了以下核心功能:

  1. 流量控制:支持多种维度的流量控制,包括请求量、并发数、系统负载、平均响应时间等。
  2. 超时熔断:在请求超时时自动熔断,并根据预设的规则自动恢复。
  3. 系统保护:监控系统的整体负载情况,根据系统当前的状态动态调整流量。
  4. 异常检测:自动检测系统中的异常,例如慢调用比例超过阈值时触发熔断。
  5. 资源访问链路:提供链路追踪功能,帮助用户快速定位问题。
  6. 实时监控:提供实时的监控视图,方便用户了解系统的运行状态。

Sentinel的适用场景

  1. 微服务架构:在微服务架构中,Sentinel 可以作为服务网格的一部分,提供服务级别的保护。
  2. 云原生应用:在云原生应用中,Sentinel 可以提供动态流量调整和保护功能。
  3. 高并发系统:在高并发系统中,Sentinel 可以帮助系统在高负载情况下进行流量控制,避免系统崩溃。
  4. 分布式系统:在分布式系统中,Sentinel 可以提供全局流量控制和保护功能。
环境搭建

下载与安装Sentinel

Sentinel 的安装和配置相对简单。以下是详细的安装步骤:

  1. 下载 Sentinel:前往 Sentinel 的 GitHub 仓库,下载最新版本的 Sentinel:

    git clone https://github.com/alibaba/Sentinel.git
    cd Sentinel
  2. 配置环境:根据你使用的 Java 版本,下载对应的 JAR 包,并将 JAR 包添加到项目依赖中。

    <!-- Maven 依赖配置示例 -->
    <dependency>
       <groupId>com.alibaba.csp</groupId>
       <artifactId>sentinel-core</artifactId>
       <version>1.8.2</version>
    </dependency>
    <!-- Gradle 依赖配置示例 -->
    dependencies {
       implementation 'com.alibaba.csp:sentinel-core:1.8.2'
    }

配置Sentinel环境

  1. 配置文件:在项目的 src/main/resources 目录下创建 sentinel.properties 文件,用于配置 Sentinel 的相关属性。

    # 配置项目名称
    project.name=MyApp
    # 启用或禁用链路追踪
    tracing.enabled=true
    # 配置熔断降级规则
    flow.rule.file=flow-rules.json
  2. 初始化配置:在应用启动时初始化 Sentinel 配置。

    import com.alibaba.csp.sentinel.init.InitFunc;
    import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
    import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
    import java.util.ArrayList;
    import java.util.List;
    
    public class SentinelConfig implements InitFunc {
       @Override
       public void init() throws Exception {
           List<FlowRule> rules = new ArrayList<>();
           FlowRule rule = new FlowRule();
           rule.setResource("MyResource");
           rule.setGrade(FlowRuleManager.FLOW_GRADE_QPS);
           rule.setCount(10);
           rules.add(rule);
           FlowRuleManager.loadRules(rules);
       }
    }

第一次运行Sentinel

  1. 启动应用:启动包含 Sentinel 配置的 Java 应用,确保应用能正确加载 Sentinel 配置文件。

  2. 监控控制台:启动 Sentinel 控制台,查看应用的监控数据。

    java -jar sentinel-dashboard-1.8.2.jar

    打开浏览器,访问 http://localhost:8080,查看应用的监控数据。

基础概念讲解

流控规则

流控规则用于控制进入系统的流量,以保护系统免于过载。流控规则有多种类型,包括通过请求量、并发数、系统负载等维度进行控制。

流控规则类型

  1. QPS 控制:限制每秒请求数量。
  2. 并发数控制:限制同一时间内的请求数量。
  3. 系统负载控制:根据系统当前的负载情况动态调整流量。

示例代码

以下是一个简单的 QPS 流控规则示例:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
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;
import java.util.ArrayList;
import java.util.List;

public class FlowControlDemo {

    static {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("MyResource");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(10);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }

    @SentinelResource(value = "MyResource", blockHandler = "blockHandler")
    public void accessResource() {
        System.out.println("Accessing resource...");
    }

    public void blockHandler(BlockException ex) {
        System.out.println("Flow control: " + ex.getMessage());
    }
}

熔断降级

熔断降级机制用于在系统出现异常时自动切断流量,避免系统过载。当请求超时时,Sentinel 会自动开启熔断降级机制,并根据预设的规则自动恢复。

熔断降级规则类型

  1. 慢调用比例:当请求的平均响应时间超过设定阈值时,触发熔断。
  2. 异常比例:当请求的失败比例超过设定阈值时,触发熔断。
  3. 慢调用数量:当请求的平均响应时间和请求数量超过设定阈值时,触发熔断。

示例代码

以下是一个简单的熔断降级规则示例:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
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;
import java.util.ArrayList;
import java.util.List;

public class CircuitBreakerDemo {

    static {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("MyResource");
        rule.setGrade(RuleConstant.FLOW_GRADE_RT);
        rule.setCount(1000);
        rule.setMinRequestAmount(10);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }

    @SentinelResource(value = "MyResource", blockHandler = "blockHandler")
    public void accessResource() {
        System.out.println("Accessing resource...");
    }

    public void blockHandler(BlockException ex) {
        System.out.println("Circuit breaking: " + ex.getMessage());
    }
}

系统保护

系统保护机制用于监控系统的整体负载情况,根据系统的当前状态动态调整流量。系统保护规则有以下几种:

  1. CPU 使用率:监控系统 CPU 使用率,当超过设定阈值时触发限流。
  2. 系统负载:监控系统的系统负载(如 Linux 的负载),当超过设定阈值时触发限流。
  3. 内存使用率:监控系统的内存使用率,当超过设定阈值时触发限流。

示例代码

以下是一个简单的系统保护规则示例:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.system.SystemRule;
import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;
import java.util.ArrayList;
import java.util.List;

public class SystemProtectionDemo {

    static {
        List<SystemRule> rules = new ArrayList<>();
        SystemRule rule = new SystemRule();
        rule.setResource("MyResource");
        rule.setGrade(SystemRuleConstant.SYSTEM_PROTECT_GRADE_CPU);
        rule.setCount(80);
        rules.add(rule);
        SystemRuleManager.loadRules(rules);
    }

    @SentinelResource(value = "MyResource", blockHandler = "blockHandler")
    public void accessResource() {
        System.out.println("Accessing resource...");
    }

    public void blockHandler(BlockException ex) {
        System.out.println("System protection: " + ex.getMessage());
    }
}
实战演练

实战案例一:简单流控

案例描述

假设我们有一个资源名为 SimpleResource,我们需要限制该资源的 QPS 不超过 10。

示例代码

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
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 SimpleFlowControlDemo {

    static {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("SimpleResource");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(10);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }

    @SentinelResource(value = "SimpleResource", blockHandler = "blockHandler")
    public void accessSimpleResource() {
        System.out.println("Accessing SimpleResource...");
    }

    public void blockHandler(BlockException ex) {
        System.out.println("Flow control: " + ex.getMessage());
    }
}

实战案例二:熔断降级

案例描述

假设我们有一个资源名为 CircuitResource,我们需要在请求的平均响应时间超过 1 秒时触发熔断。

示例代码

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
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 CircuitBreakerDemo {

    static {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("CircuitResource");
        rule.setGrade(RuleConstant.FLOW_GRADE_RT);
        rule.setCount(1000);
        rule.setMinRequestAmount(10);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }

    @SentinelResource(value = "CircuitResource", blockHandler = "blockHandler")
    public void accessCircuitResource() {
        System.out.println("Accessing CircuitResource...");
    }

    public void blockHandler(BlockException ex) {
        System.out.println("Circuit breaking: " + ex.getMessage());
    }
}

实战案例三:系统保护

案例描述

假设我们有一个资源名为 SystemResource,我们需要在 CPU 使用率超过 80% 时触发限流。

示例代码

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.system.SystemRule;
import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;

public class SystemProtectionDemo {

    static {
        List<SystemRule> rules = new ArrayList<>();
        SystemRule rule = new SystemRule();
        rule.setResource("SystemResource");
        rule.setGrade(SystemRuleConstant.SYSTEM_PROTECT_GRADE_CPU);
        rule.setCount(80);
        rules.add(rule);
        SystemRuleManager.loadRules(rules);
    }

    @SentinelResource(value = "SystemResource", blockHandler = "blockHandler")
    public void accessSystemResource() {
        System.out.println("Accessing SystemResource...");
    }

    public void blockHandler(BlockException ex) {
        System.out.println("System protection: " + ex.getMessage());
    }
}
常见问题与解决方案

Sentinel报错排查

常见错误和解决方法

  1. FlowException:当请求量超过设定的限流阈值时,会抛出 FlowException,可以通过增加资源的限流阈值或优化处理逻辑来解决。

    import com.alibaba.csp.sentinel.SentinelException;
    import com.alibaba.csp.sentinel.annotation.SentinelResource;
    import com.alibaba.csp.sentinel.slots.block.BlockException;
    
    @SentinelResource(value = "MyResource", blockHandler = "blockHandler")
    public void accessResource() {
       System.out.println("Accessing resource...");
    }
    
    public void blockHandler(BlockException ex) {
       if (ex instanceof SentinelException) {
           System.out.println("FlowException: " + ex.getMessage());
       }
    }
  2. BlockException:当请求被阻塞时,会抛出 BlockException,可以通过调整限流规则或优化系统资源来解决。

    import com.alibaba.csp.sentinel.annotation.SentinelResource;
    import com.alibaba.csp.sentinel.slots.block.BlockException;
    
    @SentinelResource(value = "MyResource", blockHandler = "blockHandler")
    public void accessResource() {
       System.out.println("Accessing resource...");
    }
    
    public void blockHandler(BlockException ex) {
       System.out.println("BlockException: " + ex.getMessage());
    }

常见配置问题解答

  1. 资源名称不匹配:确保资源名称与配置文件中的资源名称一致。

    # 配置文件示例
    project.name=MyApp
    flow.rule.file=flow-rules.json
  2. 配置文件路径错误:确保配置文件路径正确,并且文件存在。

    import com.alibaba.csp.sentinel.init.InitFunc;
    
    public class SentinelConfig implements InitFunc {
       @Override
       public void init() throws Exception {
           // 加载配置文件路径
           System.setProperty("sentinel.flow.file", "path/to/flow-rules.json");
       }
    }
结语与资源推荐

Sentinel社区与文档资源

  1. GitHub 仓库https://github.com/alibaba/Sentinel
  2. 官方文档https://sentinelguard.io/zh-cn/docs/index.html
  3. 社区论坛https://github.com/alibaba/Sentinel/issues

进阶学习建议

  1. 慕课网:推荐在慕课网(https://www.imooc.com/)上学习更多关于 Sentinel 的课程。
  2. 官方教程:阅读 Sentinel 官方文档中的教程部分,深入理解 Sentinel 的核心功能。
  3. 实战演练:通过实战演练项目,掌握 Sentinel 在实际项目中的使用方法。

通过以上内容的学习和实践,你将能够更好地理解和使用 Sentinel,提高系统的可靠性和稳定性。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP