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文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | < 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 >< br ></ dependencies > |
3、application.yml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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、主启动类
1 2 3 4 5 6 7 8 9 | @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毫秒。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)