【SpringCloud Alibaba】(七)学习 Sentinel 核心技术与配置规则(上)

在之前的文章中,我们实现了用户微服务、商品微服务和订单微服务
之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错。

今天,就和大家一起来聊聊Sentinel的核心技术与配置规则。

1. Sentinel 核心功能

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

所以,Sentinel 的核心功能包括:流量控制、熔断降级、系统负载保护

1.1 流量控制

在高并发、大流量场景下,进入系统的流量如果不加控制的话,系统就很有可能会被流量压垮。所以,在流量正式进入系统之前,需要对流量进行控制,以便使流量均匀、可控的方式进入系统。

Sentinel 作为一个非常出色的容错组件,能够将不可控的流量经过处理转化成均匀、可控的流量

1.2 熔断降级

如果检测到系统中的某个调用链路中某个节点出现故障,比如请求超时、服务宕机或者异常比超出一定阈值时,就会对出现故障的节点的调用频率进行限制,甚至不调用出现故障的节点,让请求能够快速失败并返回,以最大程度避免影响到其他节点的服务而导致系统的级联故障。

Sentinel 主要通过 限制并发线程数和响应时间 对资源的访问进行降级

限制并发线程数进行降级

Sentinel 可以通过限制服务节点的并发线程数量,来减少对其他服务节点的影响。例如,当某个服务节点出现故障,例如:响应时间变长,或者直接宕机。此时,对服务的直接影响就是会造成请求线程数的不断堆积。如果这些堆积的线程数达到一定的数量后,对当前服务节点的后续请求就会被拒绝,等到堆积的线程完成任务后再开始继续接收新的请求

通过响应时间进行降级

Sentinel 除了可以通过限制并发线程数进行降级外,也能够通过响应时间进行降级。如果依赖的服务出现响应时间过长的情况,则所有对该服务的请求都会被拒绝,直到过了指定的时间窗口之后才能再次访问该服务

1.3 系统负载保护

Sentinel 提供了系统维度的自适应保护能力。当系统的压力和负载比较高的时候,如果还持续让大量的请求进入系统,此时就有可能将系统压垮,进而导致系统宕机。

Sentinel 会在集群环境下,将本应服务器 A 承载的流量转发到其他服务器上,比如转发到服务器B上。如果此时服务器 B 也处于高负载的状态,则 Sentinel 会提供相应的保护机制,让系统的入口流量和系统的整体负载达到平衡,让系统整体可用,并且能够最大限度的处理请求

2. Sentinel 核心规则

Sentinel 的核心规则包括 流控规则、熔断规则、热点规则、授权规则和系统规则。每种规则的配置方式不同。

接下来,就详细介绍下 Sentinel 中的每种规则的作用与效果

2.1 流控规则

Sentinel 能够对流量进行控制,主要是监控应用的 QPS 流量或者并发线程数等指标,如果达到指定的阈值时,就会被流量进行控制,以避免服务被瞬时的高并发流量击垮,保证服务的高可靠性

2.1.1 簇点链路规则

1、点击簇点链路菜单,可以看到之前访问过的接口,如下所示:

在这里插入图片描述
2、点击右侧的流控按钮,会弹出新增流控规则的提示框,如下所示:

在这里插入图片描述
这里,每个配置项的说明如下所示:

  • 资源名:资源的唯一名称,默认就是请求的接口路径,可以自行修改,但是要保证唯一。
  • 针对来源:具体针对某个微服务进行限流,默认值为 default,表示不区分来源,全部限流。
  • 阈值类型:QPS 表示通过 QPS 进行限流,并发线程数表示通过并发线程数限流。
  • 单机阈值:与阈值类型组合使用。如果阈值类型选择的是 QPS,表示当调用接口的 QPS 达到阈值时,进行限流操作。如果阈值类型选择的是并发线程数,则表示当调用接口的并发线程数达到阈值时,进行限流操作。
  • 是否集群:选中则表示集群环境,不选中则表示非集群环境

2.1.2 配置简单限流

这里,针对 http://localhost:8080/order/test_sentinel 接口进行简单的配置,在新增流控规则里阈值类型选择 QPS,单机阈值输入 3,表示每秒钟的请求量如果超过 3,则会触发 Sentinel 的限流操作

在这里插入图片描述

点击新增按钮后,会为 http://localhost:8080/order/test_sentinel 接口新增一条限流规则,如下所示:

在这里插入图片描述

接下来,在浏览器上快速刷新 http://localhost:8080/order/test_sentinel 接口,当每秒钟的刷新频率超过 3 次时,会出现如下所示的提示信息:

在这里插入图片描述

2.1.3 配置流控模式

点击 http://localhost:8080/order/test_sentinel 接口流控规则后面的编辑按钮,打开编辑流控规则弹出框(如果是首次配置的话,就是新增流控规则弹出框),点击高级选项配置
在这里插入图片描述
会显示出如下所示的界面:

在这里插入图片描述
可以看到,Sentinel 主要提供了三种流控模式,分别为直接、关联和链路

  • 直接:默认的流控模式,当接口达到限流条件时,直接开启限流功能。
  • 关联:当关联的资源达到限流条件时,开启限流功能。
  • 链路:当从某个接口请求过来的资源达到限流条件时,开启限流功能

2.1.3.1 演示直接流控模式

Sentinel 默认就是使用的直接流控模式,我们之前在订单微服务中集成的就是 Sentinel的直接流控模式。

在本文的流控规则-配置简单限流中,也是使用的直接流控模式,这里不再赘述

2.1.3.2 演示关联流控模式

1、在订单微服务的 iOrderController 类中新增 /test_sentinel2 接口,如下所示:

2、在浏览器上访问下 http://localhost:8080/order/test_sentinel2 接口,以便使 Sentinel 检测到此接口

3、回到为 http://localhost:8080/order/test_sentinel 接口配置流控规则的页面,如下所示:

在这里插入图片描述

4、在流控模式中选择关联,在关联资源中输入 /test_sentinel2 ,如下所示

在这里插入图片描述
点击保存按钮保存配置。

5、打开JMeter,对 http://localhost:8080/order/test_sentinel2 接口进行测试,使其每秒钟的访问次数大于 3,JMeter的具体配置如下所示:

在这里插入图片描述
在线程组中配置每秒访问 4 次

在这里插入图片描述
6、在浏览器上刷新 http://localhost:8080/order/test_sentinel 接口,发现已经触发了 Sentinel 的限流功能:

在这里插入图片描述
至此,关联流控模式演示完毕

2.1.3.3 演示链路流控模式

1、在订单微服务 com.zzc.service 包下新增 SentinelService 接口、SentinelServiceImpl 。如下所示:

@Service
public class SentinelServiceImpl implements SentinelService {
    
    

    @Override
    @SentinelResource("sendMessage")
    public void sendMessage() {
    
    
        System.out.println("测试Sentinel的链路流控模式");
    }
}

我们在 sendMessage()方法上使用了 @SentinelResource 注解。@SentinelResource 注解会在后续文章中介绍,这里不再赘述。

2、在订单微服务 com.zzc.controller 包下新增 SentinelController。如下所示:

@Slf4j
@RestController
public class SentinelController {
    
    

    @Autowired
    private SentinelService sentinelService;

    @GetMapping(value = "/request_sentinel1")
    public String requestSentinel1(){
    
    
        log.info("测试Sentinel1");
        sentinelService.sendMessage();
        return "sentinel1";
    }

    @GetMapping(value = "/request_sentinel2")
    public String requestSentinel2(){
    
    
        log.info("测试Sentinel2");
        sentinelService.sendMessage();
        return "sentinel2";
    }

}

3、修改是 shop-springcloud-alibaba 父工程的 pom.xml 配置。升级SpringCloud Alibaba 的依赖版本到 2.2.7.RELEASE,升级 SpringCloud 版本到 Hoxton.SR12,并且加入 SpringBoot 的管理依赖。修改后的配置文件如下所示:

<properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
    <spring-cloud-alibaba.version>2.2.7.RELEASE</spring-cloud-alibaba.version>
    <spring.boot.version>2.3.12.RELEASE</spring.boot.version>
    <logback.version>1.1.7</logback.version>
    <slf4j.version>1.7.21</slf4j.version>
    <common.logging>1.2</common.logging>
    <fastjson.version>1.2.51</fastjson.version>
    <mybatis.version>3.4.6</mybatis.version>
    <mybatis.plus.version>3.4.1</mybatis.plus.version>
    <mysql.jdbc.version>8.0.19</mysql.jdbc.version>
    <druid.version>1.1.10</druid.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>${spring.boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

4、升级 Nacos,将 Nacos 注册中心由 1.4.3 版本升级为 2.1.0 版本,并进入Nacos 的 bin 目录启动 Nacos

5、在订单微服务的 application.yml 文件中新增链路配置,如下所示:

spring:
  cloud:
    sentinel:
      web-context-unify: false

7、在浏览器中分别访问 http://localhost:8080/order/request_sentinel1
http://localhost:8080/order/request_sentinel2 ,查看 Sentinel 中的簇点链路,如下所示:

在这里插入图片描述
8、点击sendMessage后面的流控按钮,如下所示:

在这里插入图片描述

9、在弹出的新增流控规则编辑框中阈值类型选择 QPS,单机阈值输入 3,在打开的高级选项中的流控模式选择链路,入口资源输入 /request_sentinel1,如下所示:

在这里插入图片描述

点击新增按钮保存配置。

此时,如果是通过 http://localhost:8080/order/request_sentinel1 接口调用 com.zzc.service.SentinelService#sendMessage() 方法时,如果调用的频率每秒钟超过 3 次,就会触发 Sentinel 的限流操作;

而通过http://localhost:8080/order/request_sentinel2 接口调用
com.zzc.service.SentinelService#sendMessage() 方法时,则不受限制

10、在浏览器中不断访问 http://localhost:8080/order/request_sentinel1 ,使得每秒的访问次数超过 3,则会触发 Sentinel 的限流操作,如下所示:

在
这里插入图片描述

访问 http://localhost:8080/order/request_sentinel2 接口则不会被限流。

至此,链路流控模式演示完毕

附加说明

在流控规则的高级选项中还有三个流控效果,如下所示:

在这里插入图片描述
接下来,就对这三个选项进行简单的说明:

  • 快速失败:会直接失败,抛出异常,期间不会做任何其他的处理操作
  • Warm Up:从开始阈值到最大 QPS 阈值会有一个缓冲,可以设置一个预热时长,这个选项比较适合突发瞬时高并发流量的场景,能够将突发的高并发流量转换为均匀、缓慢增长的场景
  • 排队等待:能够使请求均匀的通过,单机的阈值为每秒通过的请求数量,其余的请求会排队等待。另外,还会设置一个超时时间,当请求超过超时时间未处理时,会被丢弃

2.2 熔断规则

降级规则一般情况下,指的是满足某些条件时,对服务进行降级操作。

Sentinel 主要提供了三个熔断策略,分别为:慢调用比例、异常比例和异常数
在这里插入图片描述

2.2.1 演示基于慢调用比例熔断

1、首先在浏览器中访问 http://localhost:8080/order/request_sentinel2 ,在 Sentinel 的簇点链路里找到 /request_sentinel2

在这里插入图片描述

2、点击熔断按钮,进入熔断规则配置框,按照如下方式进行配置:

在这里插入图片描述

上述配置表示最大响应时长为 1ms,比例阈值达到 0.1 时,会触发熔断操作,并且熔断的时长为2s,最小请求数为 5,统计的时长为 1000ms

3、点击新增按钮后,不断在浏览器中刷新http://localhost:8080/order/request_sentinel2 ,会发现触发了 Sentinel 的熔断操作,如下所示:

在这里插入图片描述

2.2.2 演示基于异常比例熔断

1、在订单微服务的 com.zzc.controller.SentinelController 类中定义一个成员变量 count,用来记录访问计数,同时,新增一个 requestSentinel4() 方法用来测试基于异常比例的熔断,如下所示:

private int count;

@GetMapping(value = "/request_sentinel4")
@SentinelResource("request_sentinel4")
public String requestSentinel4(){
    
    
    log.info("测试Sentinel4");
    count++;
    //模拟异常,比例为50%
    if (count % 2 == 0){
    
    
        throw new RuntimeException("演示基于异常比例熔断");
    }
    return "sentinel4";
}

2、首先在浏览器中访问 http://localhost:8080/order/request_sentinel4 ,在 Sentinel 的簇点链路里找到 /request_sentinel4

3、点击熔断按钮,进入熔断规则配置框,按照如下方式进行配置:


com.zzc.controller.SentinelController#requestSentinel4() 方法中,设置的异常比例为 50%,这里在 Sentinel 的比例阈值中设置的异常比例为 0.3,也就是 30%,所以,在访问 http://localhost:8080/order/request_sentinel4 接口时,会触发 Sentinel 的熔断操作

4、点击新增按钮后,不断在浏览器中刷新 http://localhost:8080/order/request_sentinel4 ,会发现触发了 Sentinel 的熔断操作,如下所示:

在这里插入图片描述

2.2.3 演示基于异常数熔断

1、首先在浏览器中访问 http://localhost:8080/order/request_sentinel4 ,在 Sentinel 的簇点链路里找到 /request_sentinel4

2、点击熔断按钮,进入熔断规则配置框,按照如下方式进行配置:

在这里插入图片描述
上述配置表示,在 1 秒钟内最少请求 2 次,当异常数大于 1 时,会触发熔断操作,熔断的时长为 5 秒

3、点击新增按钮后,不断在浏览器中刷新 http://localhost:8080/order/request_sentinel4 ,会发现触发了 Sentinel 的熔断操作,如下所示:

在这里插入图片描述

代码地址

代码已经上传至码云,码云地址

其中,数据库文件位于 db 文件夹下。

猜你喜欢

转载自blog.csdn.net/sco5282/article/details/131991413
今日推荐