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

Sentinel初识学习:入门教程与实践指南

概述

本文介绍了Sentinel初识学习的相关内容,包括Sentinel的功能介绍、应用场景、安装配置步骤、基本使用方法及监控与告警设置。文章还详细讲解了Sentinel的流量控制、熔断降级和系统负载保护等功能,并提供了如何选择合适的流控策略的实践指南。

Sentinel初识学习:入门教程与实践指南
Sentinel简介

什么是Sentinel

Sentinel 是阿里巴巴开源的一款轻量级的、高性能的分布式服务保护框架。它提供了一套完整的流量控制、熔断降级、系统负载保护等功能。Sentinel 旨在以最小的代价保障在生产环境中系统的稳定性,为用户提供实时的流量监控与灵活的流量控制能力。

Sentinel 具备以下核心功能:

  • 流量控制:对入口流量进行控制,提供多个维度的流控策略,包括链路维度和资源维度。
  • 熔断降级:在调用链路发生错误时,提供实时熔断的能力,避免下游服务不稳定对整个系统的雪崩效应。
  • 系统负载保护:系统维度的保护,当系统负载升高时,通过宽限策略控制流量,让系统从高负载中恢复。
  • 实时监控:提供实时的监控数据,展示系统运行状态,帮助用户及时发现和定位问题。
  • 丰富的扩展接口:提供大量的扩展接口,便于与Spring Cloud、Dubbo、gRPC等主流框架无缝集成。

Sentinel的作用与应用场景

在微服务架构中,随着服务的增多,系统越来越复杂,对服务稳定性要求也越来越高。Sentinel 可以在以下场景中发挥作用:

  • 流量控制:当服务入口的流量超过预设值时,自动地进行流量控制,防止系统负载过高。
  • 熔断降级:当下游服务不稳定时,自动地熔断请求,避免连锁故障。
  • 系统负载保护:当系统负载达到预设阈值时,自动地限制流量,避免系统过载。
  • 实时监控:提供实时的监控数据,帮助运维人员及时发现和定位问题。

Sentinel的主要特性与优势

  • 高性能:采用基于内存的高性能设计,可支持每秒数万次的请求。
  • 灵活的流控规则:提供多种维度的流控规则,支持基于QPS、并发数、系统负载等维度的流控。
  • 实时监控:提供实时的监控数据,帮助运维人员及时发现和定位问题。
  • 强大的扩展性:提供大量的扩展接口,便于与各种主流框架无缝集成。
安装与配置Sentinel

Sentinel的下载与安装方法

Sentinel 提供了多种版本,包括 Java Agent 版本、Spring Boot Starter 版本、Dubbo 版本等。以下是安装和配置 Sentinel 的步骤:

  1. 下载 Sentinel

    • 从 GitHub 仓库下载 Sentinel:https://github.com/alibaba/Sentinel
    • 通过 Maven/Gradle 依赖安装 Sentinel:
      <!-- Maven -->
      <dependency>
       <groupId>com.alibaba.csp</groupId>
       <artifactId>sentinel-core</artifactId>
       <version>1.8.1</version>
      </dependency>
  2. 引入 Sentinel Starter 依赖

    • 如果使用 Spring Boot,可以直接引入 Sentinel Starter 依赖:
      <!-- Maven -->
      <dependency>
       <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
       <version>2.2.1.RELEASE</version>
      </dependency>
  3. 配置 Sentinel
    • 在 Spring Boot 项目中,可以通过配置文件(如 application.properties)来配置 Sentinel:
      # Sentinel 配置文件
      spring.cloud.sentinel.transport.server.port=8719
      spring.cloud.sentinel.transport.server.servlet-path=/sentinel-trans

配置Sentinel的基本步骤

  1. 引入依赖:确保在项目中引入 Sentinel 依赖。
  2. 配置文件:在项目的配置文件中配置 Sentinel 相关的参数,如端口、路径等。
  3. 启动 Sentinel 控制台:如果需要使用 Sentinel 控制台,可以通过启动 Java Agent 来启动控制台。
  4. 资源管理与配置:在项目中定义资源,并配置相应的流控规则。

示例代码:

// 引入 Sentinel 依赖
import com.alibaba.csp.sentinel.init.InitFunc;
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 implements InitFunc {
    @Override
    public void init() {
        FlowRule rule = new FlowRule();
        rule.setResource("HelloWorld");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(10);
        rule.setLimitApp("default");
        FlowRuleManager.loadRules(Collections.singletonList(rule));
    }
}
Sentinel的基本使用

Sentinel的资源管理与配置

在使用 Sentinel 时,首先需要定义资源。资源可以是服务、接口、方法等。资源的定义方式如下:

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

public class DemoService {
    @SentinelResource(value = "helloWorld", blockHandler = "blockHandler")
    public String helloWorld() {
        return "Hello World";
    }

    public String blockHandler(BlockException ex) {
        return "Blocked: " + ex.getClass().getSimpleName();
    }
}

流控规则的配置与应用

Sentinel 提供了多种流控规则,可以基于 QPS、并发数、系统负载等维度进行流控。以下是配置 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;

public class DemoService {
    public static void initFlowRules() {
        FlowRule rule = new FlowRule();
        rule.setResource("helloWorld");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(10);
        rule.setLimitApp("default");
        FlowRuleManager.loadRules(Collections.singletonList(rule));
    }

    @SentinelResource(value = "helloWorld", blockHandler = "blockHandler")
    public String helloWorld() {
        return "Hello World";
    }

    public String blockHandler(BlockException ex) {
        return "Blocked: " + ex.getClass().getSimpleName();
    }
}
Sentinel的监控与告警

使用Sentinel进行监控的方法

Sentinel 提供了实时监控功能,可以监控各个资源的访问情况。监控数据可以通过控制台查看,也可以通过 API 获取。

示例代码:

import com.alibaba.csp.sentinel.dashboard.client.WebDashboardClient;
import com.alibaba.csp.sentinel.dashboard.domain.vo.MetricDataVo;
import com.alibaba.csp.sentinel.dashboard.repository.metric.MetricDataRepository;
import com.alibaba.csp.sentinel.dashboard.rule.RuleNotFoundException;

public class SentinelMonitor {
    public static void main(String[] args) {
        WebDashboardClient client = new WebDashboardClient("localhost", 8080);
        MetricDataRepository repository = new MetricDataRepository();
        try {
            MetricDataVo metricData = client.getMetricData("helloWorld");
            System.out.println(metricData);
        } catch (RuleNotFoundException e) {
            e.printStackTrace();
        }
    }
}

设置告警规则以提高系统稳定性

Sentinel 支持设置告警规则,当监控数据超过预设阈值时,会触发告警。可以通过配置文件或 API 设置告警规则。

示例代码:

import com.alibaba.csp.sentinel.datasource.FileDataSource;
import com.alibaba.csp.sentinel.datasource.PropertyDataSource;
import com.alibaba.csp.sentinel.init.InitFunc;
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 SentinelAlarmConfig implements InitFunc {
    @Override
    public void init() {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("helloWorld");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(10);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}
Sentinel的流控策略详解

流量控制策略的种类与特点

Sentinel 提供了多种流量控制策略,包括基于 QPS、并发数、系统负载等维度的策略。

  1. 基于 QPS 的流控策略

    • 适用于对 QPS 有明确要求的场景,如秒杀、抢购等。
    • 通过配置 QPS 限流规则,限制每秒访问次数。
  2. 基于并发数的流控策略

    • 适用于对并发数有明确要求的场景,如用户登录、订单提交等。
    • 通过配置并发数限流规则,限制并发访问数。
  3. 基于系统负载的流控策略
    • 适用于对系统负载有明确要求的场景,如 CPU、内存等。
    • 通过配置系统负载限流规则,限制系统负载。

如何选择合适的流控策略

选择合适的流控策略需要考虑以下几个因素:

  1. 业务需求:根据业务需求选择合适的流量控制策略,如秒杀场景选择 QPS 限流,登录场景选择并发数限流。
  2. 系统资源:根据系统资源情况选择合适的流量控制策略,如 CPU 占用率高时选择系统负载限流。
  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;

public class DemoService {
    public static void initFlowRules() {
        FlowRule rule = new FlowRule();
        rule.setResource("helloWorld");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(10);
        rule.setLimitApp("default");
        FlowRuleManager.loadRules(Collections.singletonList(rule));
    }

    @SentinelResource(value = "helloWorld", blockHandler = "blockHandler")
    public String helloWorld() {
        return "Hello World";
    }

    public String blockHandler(BlockException ex) {
        return "Blocked: " + ex.getClass().getSimpleName();
    }
}
实战演练:使用Sentinel保护微服务

构建简单的微服务环境

构建一个简单的微服务环境,包括服务提供者和消费者。服务提供者提供一个简单的 RESTful API,服务消费者调用服务提供者的 API。

服务提供者代码:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class ServiceProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderApplication.class, args);
    }

    @RestController
    public class HelloWorldController {
        @GetMapping("/helloWorld")
        public String helloWorld() {
            return "Hello World";
        }
    }
}

服务消费者代码:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class ServiceConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceConsumerApplication.class, args);
    }

    @RestController
    public class ConsumerController {
        @GetMapping("/consumer")
        public String consume() {
            RestTemplate restTemplate = new RestTemplate();
            return restTemplate.getForObject("http://localhost:8080/helloWorld", String.class);
        }
    }
}

应用Sentinel保护微服务的具体步骤

  1. 引入 Sentinel 依赖:在服务提供者和服务消费者中引入 Sentinel 依赖。
  2. 配置流控规则:在服务提供者中配置流控规则,限制每秒访问次数。
  3. 启动服务提供者和服务消费者:启动服务提供者和服务消费者,观察微服务的运行情况。

示例代码:


import com.alibaba.csp.sentinel.annotation.SentinelResource;
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 org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class ServiceProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderApplication.class, args);
    }

    static {
        initFlowRules();
    }

    public static void initFlowRules() {
        FlowRule rule = new FlowRule();
        rule.setResource("helloWorld");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(10);
        rule.setLimitApp("default");
        FlowRuleManager.loadRules(Collections.singletonList(rule));
    }

    @RestController
    public class HelloWorldController {
        @SentinelResource(value = "helloWorld", blockHandler = "blockHandler")
        @GetMapping("/helloWorld")
        public String helloWorld() {
            return "Hello World";
        }

        public String blockHandler(BlockException ex) {
            return "Blocked: " + ex.getClass().getSimpleName();
        }
    }
}
``

通过以上步骤,可以有效地使用 Sentinel 保护微服务,确保系统的稳定性和可靠性。
点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消