文章目录
- 前言
- 一、雪崩问题
- 二、如何解决
- 三、Sentinel
- 四、Sentinel解决雪崩前置
- 总结
前言
微服务中,雪崩问题可以用Sentinel来实现限流,隔离,熔断等操作。浅学一下,掌握原理和基本操作。
一、雪崩问题
这里区别于之前在缓存中提到的缓存雪崩。在微服务中,由于整个项目功能被拆分成若干个模块,而模块间存在一些相互远程调用的需要。而在一整个体系中如果某一个服务发生故障,会引起整个链路所有服务集体失效。下图参考雪崩中故障扩散的模式。 
发生雪崩的原因无非就是从服务提供者,服务调用者和服务链路来看:
-
微服务相互调用中,服务提供者出现故障或阻塞。
-
服务调用者没有做好异常处理,导致自身故障。
-
调用链中的所有服务级联失败,导致整个集群故障。
二、如何解决
针对上述三个原因,解决的思路也是从这些角度思考。第一个,服务提供者尽量避免服务的堵塞,比如:保证代码的健壮性;保证服务网络畅通;对于高并发请求有较好性能等。第二个,服务调用者做好远程调用异常的方案,避免故障扩散。
依据上述思路,解决雪崩问题的常见方案有四个:
-
请求限流——将流量限制在服务接受范围内,避免流量过高等突发情况导致故障。
-
线程隔离——控制业务可用的线程数量,将故障隔离在一定范围内。
-
服务熔断——将异常比例过高的接口断开,拒绝所有请求,直接走fallback。
-
失败处理——定义fallback逻辑,让业务失败时不在抛出异常,而是返回默认数据或友好提示。
三、Sentinel
Alibaba Sentinel是指阿里开源的微服务流量治理组件,和 Redis Sentinel 不是同一个工具 —— 它专门解决微服务架构中的流量控制、熔断降级、系统负载保护等问题,能防止服务被突发流量压垮,保障微服务的稳定性。如何使用一个已配置好的sentinel呢?
第一步,安装对应的控制台-jar包。sentinel是由控制台和相应的DashBoard构成。相关包下载链接
第二步,cmd启动jar包。输入下述命令,server命令指定端口为8090,name命令指定了项目名,-jar则是运行对应的jar包。
java –Dserver.port=8090 –Dcsp.sentinel.dashboard.server=localhost:8090 –Dproject.name=sentinel-dashboard –jar sentinel-dashboard.jar
下图为jar包启动成功。 
第三步,回到java编译器中,在pom文件引入相关依赖。
<!—sentinel—>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring–cloud–starter–alibaba–sentinel</artifactId>
</dependency>
第四步,配置文件,这里可以用nacos进行共享配置。
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8090
http–method–specify: true #开启请求访问路径
这里就可以运行好一个已配置的sentinel。 
四、Sentinel解决雪崩前置
在解决问题前,先要提一个概念:簇点链路。它是单机调用链路。是一次请求进入服务后经过的每一个被Sentinel监控的资源链。默认Sentinel会监控SpringMVC的每一个Endpoint(http接口)。限流、熔断等都是针对簇点链路中的资源设置的。而资源名默认就是接口的请求路径——也就是Controllor中RequestMapping中"“的值。但Restful风格都以同一个字段开头,比如”\\cart"。 这会导致所有接口的资源名都相同,所以为了区分开,配置中还要加一句:
http–method–specify: true #开启请求访问路径
这样我们就可以开始模拟解决雪崩问题了。
总结
只差最后实践部分,等之后学明白了,再来填坑。





