在分布式系统中,微服务保护的核心使命是确保服务的健壮性,防止因单个服务异常而引发级联失败(Cascading Failure),最终导致整个系统崩溃的**“雪崩效应”**。
本章,我们将深入探讨微服务保护的通用策略及核心技术实现。
1.1 服务保护方案
主流的微服务保护方案主要包括以下三种:
- 请求限流(Traffic Limiting)
- 线程隔离(Thread Isolation)
- 服务熔断(Circuit Breaking)
从本质上讲,这些方案都属于**“有损服务”策略——即服务降级**。
- 请求限流:牺牲了并发上限,换取流量可控;
- 线程隔离:限制了部分资源的可用性,换取故障隔离;
- 服务熔断:牺牲了服务的完整度(暂时不可用),换取系统的止损。
虽然这会导致短期内服务体验略有下降,但却能构筑起一道坚固的防线,确保系统在极端情况下依然屹立不倒。接下来,我们逐一解析这些方案的底层原理。
1.1.1 请求限流
服务故障的罪魁祸首,往往是突发的高并发流量。只要能有效管控流量,就能规避绝大多数系统崩溃风险。
现实中,接口流量并非恒定,而是伴随着不可预测的突发脉冲。请求限流的核心,就是对进入系统的并发流量进行整形与控制,防止瞬间的流量洪峰压垮服务。
形象地理解: 限流器就像是水电站的大坝。
- 无限流时:上游的洪水(突发流量)会直接冲毁下游村庄(服务)。
- 有限流时:大坝起到蓄水和调节作用,无论上游洪水滔天,通过开关控制,下游的水流始终维持在一个平稳、安全的速率。这就是所谓的**“削峰填谷”**。
1.2.Sentinel
微服务保护的技术有很多,但在目前国内使用较多的还是Sentinel,所以接下来我们学习Sentinel的使用
Sentinel是阿里巴巴开源的一款服务保护框架 目前以及被集成到SpringCloudAlibaba 官方网址 home | Sentinel
我们可以采用本地安装的方式 或者docker安装的方式去安装:
docker run -d \ --name sentinel \ -p 8858:8858 \ --restart=always \ bladex/sentinel-dashboard:1.8.8
安装完了之后访问http://localhost:8858 (如果是虚拟机安装 记得把地址换成虚拟机的地址)
账号和密码都是Sentinel 登录以后就能看到这个页面
然后可以在你的微服务项目里面引入
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> 依赖
修改application.yaml文件,添加下面内容
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8090
启动对应微服务就可以看到控制台有了信息 - 因为我们一般开发都用的是RestFul接口 就会出现地址相同的问题 我们可以开启这个设置
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8090
http-method-specify: true # 开启请求方式前缀
这里我启动一个简单的Demo做演示
当我们访问这个服务的任一端口的时候 Sentinel就会检测到这个端口我们就可以做一系列操作
我们先设置为6方便测试
我们利用Jemeter做限流测试,我们每秒发出10个请求:
结果如下
可以看出这个接口的通过QPS稳定在6附近 而拒绝的QPS在4附近,符合我们的预期
这就是 Sentinel 的限流作用