服务保护简介
微服务保护是为了保障系统整体的稳定性和可靠性,保证服务运行的健壮性,避免级联失败导致的雪崩问题。这个是针对于服务之间的调用所呈现的方案。
服务保护方案
请求限流:通过限制到达服务的请求数量来保护后端服务不被过多请求压垮。
线程隔离:将不同服务或任务分配到不同的线程池中执行,以避免某一个服务出现问题时影响其他服务的正常运行。
服务熔断:当某个服务出现故障或者响应时间过长时,自动切断该服务的调用,防止因为等待该服务而导致整个系统的阻塞。
安装与介绍Sentinel
下载jar包
https://github.com/alibaba/Sentinel/releases
然后运行如下命令启动控制台:(打开cmd窗口)
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
访问http://localhost:8090页面,就可以看到sentinel的控制台了:
输入用户和密码,都是sentinel,即可登录成功。
Sentinel整合微服务
在微服务模块,引入sentinel依赖
<!--sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
修改application.yaml文件,添加下面内容:
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8090 # sentinel
http-method-specify: true # 是否设置请求方式作为资源名称
随意测试CRUD的接口,观察控制台如下:即整合成功
服务保护实现
请求限流
问题描述:在流量出现突发增长时,由于并发请求过高,在面对突如其来的流量高峰时容易发生过载,进而引发服务故障。
解决方案:通过实施请求限流措施来限制或控制接口访问的并发流量,可以在很大程度上避免因流量激增而导致的服务故障,从而保障服务的正常运行。
线程隔离
问题描述:当一个业务接口响应时间长,而且并发高时,就可能耗尽服务器的线程资源,导致服务内的其它接口受到影响。
解决方案:通过实施线程隔离,我们可以将不同接口的执行分配给独立的线程池,从而防止因单一接口耗尽资源而拖垮整个服务的情况发生。这样做的目的是限制故障范围。
服务熔断
问题描述:当服务中某个组件或接口出现故障或者响应时间过长时,会导致整个系统性能下降甚至完全不可用。特别是在高并发场景下,如果某个业务接口出现问题,大量的请求会堆积等待,导致线程资源被迅速耗尽,进而影响到整个服务的正常运行。
解决方案:服务熔断正是为此设计的一种保护措施,它能够在检测到指定服务或接口出现问题时,主动切断对该部分的调用,使其进入快速失败模式,从而保护系统的其余部分不受影响,并为故障恢复争取时间。