SpringCloud Alibaba Sentinel实现熔断与限流
1、官网
https://github.com/alibaba/Sentinel
中文 介绍 · alibaba/Sentinel Wiki (github.com)
2、是什么: 一句话解释,之前我们讲解过的Hystrix
3、去哪下:https://github.com/alibaba/Sentinel/releases
4、能干嘛

5、怎么玩
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html
服务使用中的各种问题 :服务雪崩、服务降级、服务熔断、服务限流
安装Sentinel控制台
1、sentinel组件由2部分构成 后台和前端8080

下载地址 https://github.com/alibaba/Sentinel/releases
下载到本地sentinel-dashboard-1.8.4.jar
前提 java8环境OK 8080端口没有被占用
命令行执行 java -jar sentinel-dashboard-1.8.4.jar
访问sentinel管理界面 http://localhost:8080 用户名密码均为sentinel
初始化工程
1、新建Module cloudalibaba-sentinel-service8401
2、pom文件
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--SpringCloud ailibaba sentinel-datasource-nacos 后续做持久化用到-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!--SpringCloud ailibaba sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- SpringBoot整合Web组件+actuator -->
<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>
<!--日常通用jar包配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.6.3</version>
</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>
</dependencies>
3、application.yml文件
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
#Nacos服务注册中心地址
server-addr: localhost:8848
sentinel:
transport:
#配置Sentinel dashboard地址
dashboard: localhost:8080
#默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
port: 8719
management:
endpoints:
web:
exposure:
include: '*'
4、主启动类
@EnableDiscoveryClient
@SpringBootApplication
public class MainApp8401
{
public static void main(String[] args) {
SpringApplication.run(MainApp8401.class, args);
}
}
5、业务类
@RestController
@Slf4j
public class FlowLimitController {
@GetMapping("/testA")
public String testA()
{
try { TimeUnit.SECONDS.sleep(800); } catch (InterruptedException e) { e.printStackTrace(); }
return "------testA";
}
@GetMapping("/testB")
public String testB()
{
log.info(Thread.currentThread().getName()+"\t"+"...testB");
return "------testB";
}
}
6、启动8401微服务后查看sentienl控制台,空空如也,啥都没有
Sentinel采用的懒加载说明,执行一次访问即可 http://localhost:8401/testA http://localhost:8401/testB
效果如图 sentinel8080正在监控微服务8401

流控规则



1、直接--->快速失败
如图表示一秒内查询1次就OK,超过1次,就直接快速失败,报默认错误,快速点击访问http://localhost:8401/testA,结果报错 Blocked by Sentinel (flow limiting)

2、关联--->快速失败
当与A关联的资源B达到阀值后,就限流A自己 B惹事,A挂了
设置效果
当关联资源/testB的qps阀值超过1时,就限流/testA的Rest访问地址,当关联资源到阈值后限制配置好的资源名

postman模拟并发密集访问testB

3、预热 Warmup

公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值
默认coldFactor为3,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值。
官网 限流 冷启动 · alibaba/Sentinel Wiki (github.com)
配置如图 阀值为10+预热时长设置5秒。
系统初始化的阀值为10 / 3 约等于3,即阀值刚开始为3;然后过了5秒后阀值才慢慢升高恢复到10

多次点击http://localhost:8401/testB 刚开始不行,后续慢慢OK
应用场景 如:秒杀系统在开启的瞬间,会有很多流量上来,很有可能把系统打死,预热方式就是把为了保护系统,可慢慢的把流量放进来,慢慢的把阀值增长到设置的阀值。
4、排队等待
匀速排队,阈值必须设置为QPS
官网解释

匀速排队,让请求以均匀的速度通过,阀值类型必须设成QPS,否则无效。
设置含义:/testA每秒1次请求,超过的话就排队等待,等待的超时时间为20000毫秒。


浙公网安备 33010602011771号