JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

SpringCloud路径-16-SpringCloud Alibaba Sentine实现熔断与限流

wys521 2024-11-17 16:58:29 精选教程 18 ℃ 0 评论

1 Sentinel简介

1.1 概述

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

  • 丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。
  • 完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  • 完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。

1.2 sentinel的主要特性



1.3 sentinel的主要优势和特性

轻量级,核心库无多余依赖,性能损耗小 方便接入,开源生态广泛 丰富的流量控制场景 易用的控制台,提供实时监控、机器发现、规则管理等能力 完善的扩展性设计,提供多样化的 SPI 接口,方便用户根据需求给 Sentinel 添加自定义的逻辑

1.4 sentinel与spring cloud Hystrix 对比



1.5 sentinel分为两个部分

核心库(Java 客户端): 不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持 控制台(Dashboard): 基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器

1.6 Sentinel 基本概念

  • 资源 资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。

只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

  • 规则 围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

1.7 Sentinel 是如何工作的

Sentinel 的主要工作机制如下:

  • 对主流框架提供适配或者显示的 API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。
  • 根据预设的规则,结合对资源的实时统计信息,对流量进行控制。同时,Sentinel 提供开放的接口,方便您定义及改变规则。
  • Sentinel 提供实时的监控系统,方便您快速了解目前系统的状态。

2 安装及演示

2.1 Sentinel控制台的下载

下载地址:https://github.com/alibaba/Sentinel/releases/tag/1.8.3

下载下来是个jar包

2.2 Sentinel控制台的启动

cmd 启动jar包

java -jar sentinel-dashboard-1.8.3.jar

2.3 访问

浏览器输入:localhost:8080 账号密码 默认都是 sentinel



2.4 为服务打开sentinel的监控

(1)引入sentinel依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>${spring-cloud-alibaba.version}</version>
</dependency>

专栏的上一篇文章已经为项目引入了sentinel的依赖,以及介绍了feign的使用 感兴趣的可以跳转 手把手教你搭建springcloud alibaba微服务–openfeign

(2)yml文件添加sentinel相关配置

server:
  port: 9090

spring:
  application:
    name: mdx-shop-user
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: mdx
        group: mdx
    sentinel:
      transport:
        dashboard: localhost:8080 #配置Sentinel dashboard地址
feign:
  sentinel:
    enabled: true

启动user服务并访问user服务的测试接口

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("getOrderNo")
    public String getOrderNo(String userId,String tenantId,HttpServletRequest request){
        return userService.getOrderNo(userId,tenantId,request);
    }
}

浏览器访问 http://localhost:9090/user/getOrderNo?userId=mdx123456&tenantId=123



然后查看sentinel控制台

发现已经监控到了我们服务的接口

3 Sentinel的控制规则

本次演示以sentinel 1.8.0版本为例,讲解sentinel中流控、降级、热点、系统、授权五大规则。

3.1 流控规则

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



  • 资源名:接口路径名
  • 针对来源:指定对哪个微服务进行限流,默认指default,意思是不区分来源,全部限制
  • 阈值类型和单机阈值: 1)QPS(每秒请求数量):: 当调用该接口的QPS达到阈值的时候,进行限流 2)线程数:当调用该接口的线程数达到阈值的时候,进行限流
  • 是否集群:暂不需要集群
  • 流控模式: 1)直接:直接流控模式是最简单的模式,当指定的接口达到限流条件时开启限流。 2)关联:当指定接口关联的接口达到限流条件时,对指定接口开启限流。 3)链路:A、B接口都在调用C接口,A、B接口谁调用C达到限流条件就限流谁。
  • 流控效果: 1)快速失败(默认):直接失败,抛出异常,不做任何额外的处理,是最简单的效果。 2)Warm Up:它从开始阈值到最大QPS阈值会有一个缓冲阶段,一开始的阈值是最大QPS阈值的1/3,然后慢慢增长,直到最大阈值,适用于将突然增大的流量转换为缓步增长的场景。 3)排队等待:让请求以均匀的速度通过,单机阈值为每秒通过数量,其余的排队等待; 它还会让设置一个超时时间,当请求超过超时间时间还未处理,则会被丢弃。

3.2 降级规则




  • 资源名:接口路径名
  • 熔断策略: 慢调用比例(以前的版本也叫RT):选择一个慢调用比例作为阈值。引入一个场景:A模块调用B模块
  • 最大RT:Response Time 最大响应时间,即A调用B,B超过这个时间响应即为慢调用。
  • 比例阈值:百分比,即访问接口慢调用达到百分之多少时,采用服务降级。
  • 熔断时长:即触发熔断后,熔断持续的时长,如A调用B,B响应太慢,因此A模块采用降级处理,在一个时间段之内不会重复调用B。超过这个时间段过后再进行调用。
  • 最小请求数:熔断触发的最小请求数(避免1次2次偶尔响应时间慢就开启降级处理,没必要)。

3.3 热点规则

在进行RESTful 设计的时候,一般都需要在 Action 的处理方法中进行请求参数的接收,于是这个时候可以针对于参数进行限流,这种规则就称为热点规则。

热点参数流控规则是一种更细粒度的流控规则, 它允许将规则具体到参数上。





  • 资源名:接口路径名
  • 参数索引:一般接口都有参数,从接口的第一个参数开始,以0为下标累加,每个参数都有一个下标。每个接口独立计算。
  • 单机阈值:接口每秒的访问数。
  • 统计窗口时长:限流接口的时效。
  • 是否集群:默认不集群。
  • 参数例外项:参数例外项就是可以达到更加细粒度的控制,比如我们的某个被设置为限流的参数,可以通过参数例外项设置参数具体等于某个特殊的值的时候,触发不同的限流效果。例如有参数userId,普通设置为一个阈值,当userId等于某个具体的数时,设置特殊阈值。

3.4 系统规则




系统保护规则是从应用级别的入口流量进行控制,从单台机器的总体 Load、RT、入口 QPS 、CPU使用率和线程数五个维度监控应用数据,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量 (进入应用的流量) 生效。

  • Load(仅对 Linux/Unix-like 机器生效):当系统 load1 超过阈值,且系统当前的并发线程数超过 系统容量时才会触发系统保护。系统容量由系统的 maxQps * minRt 计算得出。设定参考值一般 是 CPU cores * 2.5。
  • RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
  • 线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。
  • CPU使用率:当单台机器上所有入口流量的 CPU使用率达到阈值即触发系统保护

3.5 授权规则




授权规则可以对请求方来源做判断和控制。

  • 白名单:来源(origin)在白名单内的调用者允许访问
  • 黑名单:来源(origin)在黑名单内的调用者不允许访问
  • 资源名:接口名
  • 流控应用:是来源者的名单。

3.6 使用@SentinelResource配置流控规则

controller

    /**
     * 使用@SentinelResource标签开启热点参数限流功能
     * @SentinelResource(value)对应Sentinel控制台-流控规则-资源名
     * @SentinelResource(blockHandeler)指定流控规则生效后的处理函数
     */
    @GetMapping("byResource")
    @SentinelResource(value = "byResource", blockHandler = "handleException")
    public String byResource(){
        return "----------------- 按资源名称设置流控规则 -------------------";
    }

    public String handleException(BlockException exception){
        return "-------------------- 流控规则生效后执行的函数 ------------------";

    }

Sentinel控制台




使用@SentinelResource标签的好处在于能够自定义流控规则生效后返回的消息。

4 Sentinel 原理及核心概念

4.1 核心概念

  • ResourceWrapper

Sentinel 控制的对象即为资源,调用 Entry 方法的时候会 New 一个资源对象,资源由一个全局唯一的资源名称标识。

  • Context

Sentinel 的上下文,包含了上下文名称,一个调用链一个 Context,可以显示创建或者在调用 Entry 的时候隐式创建。

  • Node

持有运行时的资源的各种统计数据。

  1. 一个 Resource 在同一个 Context 中有且仅有一个 DefaultNode 与之对应
  2. 一个 Resource 全局有且仅有一个 ClusterNode
  • Entry

代表一次对资源的访问,每访问一个资源都会创建一个 Entry,在 Context 中以一个双向链表存在。

必须调用 exit() 方法的原因就在于这个链表:exit 方法中会判断上下文的当前 entry 是不是 this,此时其他 entry 掉用 exit 会发现不相等,从而抛出异常。

  • ProcessorSlot

处理插槽,资源的各种控制都通过不同的 Slot 实现类去完成。

  • ProcessorSlotChain

由各个处理插槽组成的链表,每个资源在整个服务中对应一个处理链。

  • Rule

用户定义的各种规则。

  • RuleManager

加载并管理 Rule。

4.2 工作原理

在 Sentinel 里,所有的资源都对应一个资源名称(resourceName),每次资源调用都会创建一个 Entry 对象。Entry 可以通过对主流框架的适配自动创建,也可以通过注解的方式或调用 SphU API 显式创建。Entry 创建的时候,同时也会创建一系列功能插槽(slot chain),这些插槽有不同的职责,例如:

  • NodeSelectorSlot 负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;
  • ClusterBuilderSlot 则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, Thread Count 等等,这些信息将用作为多维度限流,降级的依据;
  • StatisticSlot 则用于记录、统计不同纬度的 runtime 指标监控信息;
  • FlowSlot 则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制;
  • AuthoritySlot 则根据配置的黑白名单和调用来源信息,来做黑白名单控制;
  • DegradeSlot 则通过统计信息以及预设的规则,来做熔断降级;
  • SystemSlot 则通过系统的状态,例如 load1 等,来控制总的入口流量。

整体框架图:



Sentinel 将 SlotChainBuilder 作为 SPI 接口进行扩展,使得 Slot Chain 具备了扩展的能力。可以自行加入自定义的 slot 并编排 slot 间的顺序,来为 Sentinel 添加自定义功能:


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表