第八章 Sentinel演示工程搭建和流控规则介绍

第八章 Sentinel演示工程搭建和流控规则介绍



前言

本文构建了一个简单的Sentinel演示项目,并对流控规则进行介绍和具体演示,Sentinel流控规则主要有3种模式,通过简单的的案例我们可以了解这三种模式的简单应用。


一、项目搭建

1. 新建模块

cloud-sentinel-service8401

2. 导入pom依赖

  <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--sentinel-datasource-nacos后续持久化用-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.xin</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

3. 编写yml文件

server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      web-context-unify: false # 关闭context整合
      transport:
        dashboard: localhost:8080
        # 默认为8719,如果被占用会自动+1,直到找到为止
        port: 8719

      # 流控规则持久化到nacos
      datasource:
        dsl:
          nacos:
            server-addr: localhost:8848
            data-id: ${spring.application.name}
            group-id: DEFAULT_GROUP
            data-type: json
            rule-type: flow

management:
  endpoints:
    web:
      exposure:
        include: "*"


4. 编辑启动类和业务类

@RestController
public class FlowLimitController
{

    @GetMapping("/testA")
    public String testA()
    {
          return "testA-----" + testService.text() + " "
          + Thread.currentThread().getName();
    }

    @GetMapping("/testB")
    public String testB()
    {
        return "testB-----" + testService.text() + " " 
        + Thread.currentThread().getName();
    }
}

5. 启动Sentinel,查看sentinel控制台

因为Sentinel采用的懒加载,需要访问服务之后才会加载相应信息。

二、流控规则

流控规则简介

在这里插入图片描述

  • 资源名:唯一名称,默认请求路径

  • 针对来源: Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)

  • 阈值类型/单机阈值:

    • QPS(每秒钟的请求数量)︰当调用该api的QPS达到阈值的时候,进行限流。
    • 线程数:当调用该api的线程数达到阈值的时候,进行限流。
  • 是否集群:不需要集群

  • 流控模式:

    • 直接:api达到限流条件时,直接限流
    • 关联:当关联的资源达到阈值时,就限流自己
    • 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】
  • 流控效果:

    • 快速失败:直接失败,抛异常
    • Warm Up:根据codeFactor (冷加载因子,默认3)的值,从阈值/coolFactor,经过预热时长,才达到设置的QPS阈值
    • 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效

流控规则之直接模式

  1. 新建对/testA的流控规则,选择直接-快速失败模式
    在这里插入图片描述
  2. 访问http://localhost:8401/testA,当每秒访问数超过阈值时则会被限流并直接返回默认信息。
    在这里插入图片描述

流控规则之关联模式

  1. 新建对/testA的流控规则,选择关联-快速失败模式,当关联资源/testB的qps阀值超过1时,就限流/testA的Rest访问地址,即当关联资源到阈值后限制配置好的资源名,被关联的资源不受影响。
    在这里插入图片描述
  2. 通过软件连续访问http://localhost:8401/testB,这里使用的是AirPost
    在这里插入图片描述
  3. 当http://localhost:8401/testB访问超过阈值时,http://localhost:8401/testB可以正常访问。
    在这里插入图片描述
    http://localhost:8401/testA则被限流
    在这里插入图片描述

流控规则之链路模式

链路模式只记录指定链路上的流量,即多个请求调用了同一个微服务,我们给这个微服务添加链路流控规则,当该微服务访问达到阈值时会对访问该微服务的请求限流,下面我们在service层新建一个text的服务,通过@SentinelResouce(“text”)作为一个微服务。

package com.xin.springcloud.service;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;

/**
 * @author Xin
 * @date 2022/10/4 11:26
 */
@Service
public class TestServiceImpl implements TestService{
    @SentinelResource("text")
    @Override
    public String text(){
        return "text";
    }
}

testA和testB同时调用该服务

  @GetMapping("/testA")
    public String testA() {

        return "testA-----" + testService.text() + " " + Thread.currentThread().getName();
    }

    @GetMapping("/testB")
    public String testB() {
        return "testB-----" + testService.text() + " " + Thread.currentThread().getName();
    }

注意: 需要在yml配置文件中关闭context整合,因为Sentinel默认会将Controller方法做context整合,导致链路模式的流控失效。

访问成功后可以在Sentinel控制台看到相关的链路

在这里插入图片描述
然后我们添加对text的流控规则,这里入口资源只配置了/testB,而我们/testA和/testB都可以访问text服务,根据流控规则,也就是当/testA+/testB访问text的每秒请求达到阈值时,/testB将会被限流,而/testA不受限制。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值