深度解析阿里的Sentinel

1、前言

这是《Spring Cloud 进阶》专栏的第五篇文章,这篇文章介绍一下阿里开源的流量防卫兵Sentinel,一款非常优秀的开源项目,经过近10年的双十一的考验,非常成熟的一款产品。

文章目录如下:

图片

2、什么是sentinel?

sentinel顾名思义:卫兵;在Redis中叫做哨兵,用于监控主从切换,但是在微服务中叫做流量防卫兵

Sentinel 以流量为切入点,从流量控制熔断降级系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。

  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。

  • 完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

Sentinel 的主要特性如下图

图片

Sentinel 分为两个部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。

  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

3、sentinel和Hystrix有何区别?

具体区别如下图:

图片

4、sentinel版本如何选择?

这里选择的spring-cloud-alibaba-dependencies的版本是2.2.1.RELEASE,因此sentinel版本选择1.7.1,大家可以根据自己的版本选择对应sentinel的版本,版本对应关系如下图:

图片

注意:一定要按照官方推荐的版本适配,否则出现意想不到的BUG追悔莫及.........

5、Sentinel 控制台如何安装?

sentinel和nacos一样,都有一个控制台,但是这里不用自己手动搭建一个微服务,官方已经搭建好了,只需要下载对应得jar包运行即可。下载地址:https://github.com/alibaba/Sentinel/tags

选择对应得版本下载即可,我这里选择1.7.1版本,下载的jar包如下图:

图片

当然你可以通过源码构建:mvn clean package

注意:JDK版本必须>=1.8

此时我们只需要运行这个jar包即可,命令如下:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.1.jar

上述参数含义如下:

  • -Dserver.port:指定启动的端口,默认8080

  • -Dproject.name:指定本服务的名称

  • -Dcsp.sentinel.dashboard.server:指定sentinel控制台的地址,用于将自己注册进入实现监控自己

启动成功之后,浏览器访问:http://localhost:8080,登录页面如下图:

图片

默认的用户名和密码:sentinel/sentinel

登录成功之后页面如下:

图片

可以看到目前只有一个服务sentinel-dashboard被监控了,这个服务就是自己

注意:上述参数都是可选的,没必要可以不填。

那么问题来了:默认的用户名和密码在生产环境上肯定不能用,如何修改呢?

从 Sentinel 1.6.0 起sentinel已经支持自定义用户名和密码了,只需要在执行jar命令时指定即可,命令如下:

java -Dsentinel.dashboard.auth.username=admin -Dsentinel.dashboard.auth.password=123 -jar sentinel-dashboard-1.7.1.jar

用户可以通过如下参数进行配置:

  • -Dsentinel.dashboard.auth.username=sentinel 用于指定控制台的登录用户名为 sentinel

  • -Dsentinel.dashboard.auth.password=123456 用于指定控制台的登录密码为 123456;如果省略这两个参数,默认用户和密码均为 sentinel

  • -Dserver.servlet.session.timeout=7200 用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟;

注意:部署多台控制台时,session 默认不会在各实例之间共享,这一块需要自行改造。

除了用户名密码相关的配置,sentinel控制台还提供了其他的可配置选项,如下图:

图片

6、微服务如何接入sentinel控制台?

微服务为什么要集成sentinel控制台,sentinel不是提供了相关的API吗?

其实Spring Boot 官方一直提倡约定>配置>编码的规则,能够不硬编码何乐而不为呢?

因此本文后续内容主要还是结合sentinel控制台进行讲解,关于API的使用大家可以按照官方文档学习,讲解的非常清楚。

好了,言归正传,微服务如何接入sentinel控制台呢?

1、新建微服务模块注册进入Nacos

新建一个微服务模块:sentinel-service9008

相关配置如下:

server:
  port: 9008
spring:
  application:
    ## 指定服务名称,在nacos中的名字
    name: sentinel-service
  cloud:
    nacos:
      discovery:
        # nacos的服务地址,nacos-server中IP地址:端口号
        server-addr: 127.0.0.1:8848
management:
  endpoints:
    web:
      exposure:
        ## yml文件中存在特殊字符,必须用单引号包含,否则启动报错
        include: '*'

2、添加依赖

除了Nacos的依赖,还需要添加一个sentinel的依赖:

<!--sentinel的依赖-->
<dependency>
 <groupId>com.alibaba.cloud</groupId>
 <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

3、添加配置集成控制台

只需要添加如下配置即可集成sentinel控制台:

spring:
  cloud:
    sentinel:
      transport:
       ## 指定控制台的地址,默认端口8080
        dashboard: localhost:8080

4、新建一个测试接口

下面新建一个测试接口,用于测试相关规则,如下:

@RestController
@RequestMapping("/sentinel")
public class FlowLimitController {

    @GetMapping("/test")
    public String test(){
        return "接收到一条消息--------";
    }
}

5、启动微服务

启动9008这个微服务,然后浏览器输入:http://localhost:9008/sentinel/test,此时查看sentinel控制台,将会看见sentinel-service这个服务已经被监控了,如下图:

图片

注意:sentinel是懒加载机制,只有访问过一次的资源才会被监控。

不过可以通过配置关闭懒加载,在项目启动时就连接sentinel控制台,配置如下:

spring:
    sentinel:
      # 取消控制台懒加载,项目启动即连接Sentinel
      eager: true

7、流量控制如何配置?

流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性

QPS:每秒请求数,即在不断向服务器发送请求的情况下,服务器每秒能够处理的请求数量。

并发线程数:指的是施压机施加的同时请求的线程数量。

同一个资源可以创建多条限流规则,一条限流规则由以下元素组成:

  • resource:资源名,即限流规则的作用对象。

  • count: 限流阈值

  • grade:限流阈值类型(1:QPS  0:并发线程数),默认值QPS

  • limitApp:流控针对的调用来源,若为 default 则不区分调用来源,默认值default

  • strategy:判断的根据是资源自身**(0),还是根据其它关联资源 (1),还是根据链路入口(2)**,默认值根据资源本身。

  • controlBehavior: 流控效果(直接拒绝(0) / 排队等待(2) / 预热冷启动(1)),默认值直接拒绝。

以上元素限流元素对应的类是com.alibaba.csp.sentinel.slots.block.flow.FlowRule,各元素如下图:

图片

注意:各个元素的取值以及默认值一定要记住,后续配置将会用到。

以上几个元素在sentinel控制台对应规则如下图:

图片

1、三种流控效果

流控效果总共分为三种,对应元素controlBehavior,分别如下:

快速失败

默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException

warm up

预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。

注意:这一效果只针对QPS流控,并发线程数流控不支持。

预热底层是根据令牌桶算法实现

<think>好的,用户之前问过关于数据库字段类型的问题,现在又转向了Sentinel。我需要先确定他们指的是哪个Sentinel。常见的有两种可能性:阿里巴巴Sentinel(流量控制组件)或者HashiCorp的Sentinel(策略即代码工具)。根据用户的技术背景,可能更关注阿里巴巴Sentinel,因为之前的问题是关于数据库的,而阿里巴巴的中间件在开发者中比较流行。 接下来,我需要明确用户的需求。他们可能是在开发分布式系统时遇到了流量控制、熔断降级等问题,所以想了解Sentinel的功能和用途。用户可能是一名开发人员或系统架构师,希望了解如何保证系统的高可用性。 用户可能没有明确说明,但深层需求可能是想了解如何选择适合的流量管理工具,或者如何在项目中集成Sentinel。因此,回答需要涵盖Sentinel的核心功能、应用场景以及与其他工具(如Hystrix)的区别,帮助用户做出决策。 需要确保回答结构清晰,分点说明,包括定义、核心功能、应用场景、与Hystrix的对比等。同时,要使用中文,避免技术术语过于晦涩,保持易懂。还要注意之前的回答格式,使用标题、列表和代码示例,所以可能需要类似的结构来保持一致性。 需要验证Sentinel的主要特点,比如流量控制、熔断降级、系统保护、实时监控等,并确认其开源状态和社区支持。另外,对比Hystrix时,要强调Sentinel的优势,如更细粒度的控制、动态规则配置等。 最后,总结部分需要简明扼要,帮助用户快速抓住重点,明确适用场景,以便他们决定是否采用Sentinel作为解决方案。</think>--- ### 逐步解析Sentinel 的核心功能与应用场景 --- #### 1. **基本定义** - **Sentinel** 是阿里巴巴开源的 **分布式系统流量防卫兵**,专注于 **流量控制、熔断降级、系统保护** 等场景,保障微服务的高可用性。 - **核心定位**:通过动态规则控制流量和资源访问,防止系统因突发流量、资源耗尽或依赖服务故障而崩溃。 --- #### 2. **核心功能** | 功能 | 说明 | 典型场景 | |---------------------|------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| | **流量控制** | 根据QPS、线程数、调用关系等限制流量,避免服务过载 | 秒杀活动、突发流量 | | **熔断降级** | 当服务调用失败率或响应时间超过阈值时,自动熔断对故障服务的访问,防止级联故障 | 依赖服务宕机、接口响应缓慢 | | **系统自适应保护** | 根据系统负载(CPU、内存、请求响应时间)动态调整流量阈值,保护系统稳定 | 服务器资源不足时自动限流 | | **实时监控** | 提供秒级粒度的资源访问统计(QPS、响应时间、异常比例) | 快速定位性能瓶颈 | --- #### 3. **核心概念解析** 1. **资源(Resource)**: - 被保护的对象,如接口、方法、数据库操作等。 - 示例:定义一个HTTP接口为资源,限制其每秒最大调用量。 2. **规则(Rule)**: - 流量控制规则(如QPS阈值)、熔断规则(如异常比例)、系统保护规则等。 - **动态配置**:支持通过控制台或API实时修改规则,无需重启服务。 3. **流量控制策略**: - **直接拒绝**:超过阈值直接返回错误。 - **排队等待**:请求进入队列,按阈值速率处理(类似漏桶算法)。 - **Warm Up**:逐步增加允许的流量,避免冷启动时突发压力。 --- #### 4. **与 Hystrix 的对比** | 特性 | Sentinel | Hystrix | |---------------------|-----------------------------------------------|----------------------------------------------| | **设计目标** | **流量控制为核心**,支持熔断、系统保护 | **熔断降级为核心**,侧重容错 | | **流量控制** | 支持QPS、线程数、调用链等多维度限流 | 仅支持线程池隔离和信号量隔离 | | **动态规则** | 支持实时修改规则,无需重启服务 | 需通过配置中心更新规则 | | **监控能力** | 提供实时统计面板和细粒度指标 | 依赖Hystrix Dashboard | | **开源生态** | 深度集成Spring Cloud Alibaba | 已停止维护(官方推荐Resilience4j替代) | --- #### 5. **应用场景示例** 1. **秒杀系统限流**: - 使用 `QPS流控规则`,限制商品详情接口每秒最多处理1000次请求,超出部分直接拒绝。 ```java // 定义资源 @SentinelResource(value = "getProductDetail", blockHandler = "handleBlock") public ProductDetail getProductDetail(String productId) { ... } // 配置规则(QPS=1000) FlowRule rule = new FlowRule("getProductDetail") .setGrade(RuleConstant.FLOW_GRADE_QPS) .setCount(1000); FlowRuleManager.loadRules(Collections.singletonList(rule)); ``` 2. **服务熔断**: - 当支付接口的异常比例超过50%时,触发熔断,10秒内拒绝所有请求。 ```java DegradeRule rule = new DegradeRule("paymentService") .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) .setCount(0.5) // 异常比例阈值50% .setTimeWindow(10); // 熔断时间10秒 DegradeRuleManager.loadRules(Collections.singletonList(rule)); ``` --- #### 6. **部署与扩展** - **控制台(Sentinel Dashboard)**: - 提供可视化规则配置、实时监控和集群流量管理。 - 支持对接Nacos、ZooKeeper等配置中心动态同步规则。 - **扩展能力**: - 适配Spring Cloud、Dubbo、gRPC等主流框架。 - 支持自定义埋点资源和扩展流量控制策略。 --- #### 7. **总结** - **适用场景**: - 需要精细化流量控制的分布式系统。 - 高并发场景下保障核心服务稳定。 - 快速响应突发的服务故障。 - **优势**: - 轻量级、低延迟(基于滑动窗口统计)。 - 动态规则配置与实时监控一体化。 - 活跃的社区支持和持续迭代。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值