第八章 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,否则无效
流控规则之直接模式
- 新建对/testA的流控规则,选择直接-快速失败模式
- 访问http://localhost:8401/testA,当每秒访问数超过阈值时则会被限流并直接返回默认信息。
流控规则之关联模式
- 新建对/testA的流控规则,选择关联-快速失败模式,当关联资源/testB的qps阀值超过1时,就限流/testA的Rest访问地址,即当关联资源到阈值后限制配置好的资源名,被关联的资源不受影响。
- 通过软件连续访问http://localhost:8401/testB,这里使用的是AirPost
- 当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不受限制。