这篇文章主要介绍了SpringCloud中如何使用Sentinel实现限流的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringCloud中如何使用Sentinel实现限流文章都会有所收获,下面我们一起来看看吧。
Sentinel 是面向微服务的轻量级流量控制框架,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel可以作为Hystrix
的替代品,为系统提供服务熔断和服务降级的功能。

Sentinel的限流原理
所以Sentinel
是基于滑动窗口算法来实现的。
设置Sentinel的阈值指标:
线程数模式
线程数的模式采用信号隔离的方式来防止线程池被占用。
用于防止线程池被占用,一般有两种方式:
线程池隔离:为应对太多线程占用的情况,业内有使用隔离的方案,比如通过不同业务逻辑使用不同线程池来隔离业务自身之间的资源争抢,这种隔离方案虽然隔离性比较好,但是代价就是线程数目太多,线程上下文切换的 overhead
比较大,特别是对低延时的调用有比较大的影响。
信号隔离:sentinel
采用的是信号隔离的方案,简单统计当前请求上下文的线程数目(正在执行的调用数目),如果超出阈值,新的请求会被立即拒绝。
所以业务处理是多线程的情况下使用线程数模式。
Sentinel
采用信号隔离的方式,通过并发线程数模式,并结合基于响应时间的熔断降级模式,可以在不稳定的平均相应时间比较高的时候自动降级,防止过多的慢调用占满并发数,影响整个系统,避免慢调用引起依赖雪崩的现象。
QPS模式
QPS
即每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
QPS
模式适合单读线程情况(如servlet
请求),这种模式下提供了三种更加精确的流控方式:
Sentinel 两种计算阈值的模式:
集群总体模式:即限制整个集群内的某个资源的总体 qps
不超过此阈值。
单机均摊模式:单机均摊模式下配置的阈值等同于单机能够承受的限额,token server
会根据连接数来计算总的阈值(比如独立模式下有 3个 client
连接到了 token server
,然后配的单机均摊阈值为 10,则计算出的集群总量就为30),按照计算出的总的阈值来进行限制。这种方式根据当前的连接数实时计算总的阈值,对于机器经常进行变更的环境非常适合。
这里要说明的是:qps
是每秒查询数, tps
是每秒内的事务数, pv
是指页面被浏览的次数。
Sentinel流控模式
Sentinel限流的方式
第一步:部署sentinel-dashboard
sentinel-dashboard(点击下载jar
包)是一个单独的应用,通过spring-boot
进行启动,主要提供一个轻量级的控制台,它提供机器发现、单机资源实时监控、集群资源汇总,以及规则管理的功能。
这里可以理解为sentinel
服务治理中心。
java -Dserver.port=18080 -jar sentinel-dashboard.jar

第二步:在项目中整合sentinel
注入依赖
<!--springCloud-Alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--sentinel限流-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
在application.properties中的相关配置
spring.application.name=imagerepair
server.port=8080
spring.cloud.sentinel.transport.dashboard=127.0.0.1:18080
spring.cloud.sentinel.eager=true
Controller层
@RestController
public class UserController {
@Autowired
UserService userService;
@RequestMapping("/hello")
public String hello(){
return userService.sayHello();
}
}
Service
@Service
public class UserService {
@SentinelResource(value = "sayHello",fallback = "sayHellofail")
public String sayHello(){
return "Hello,World";
}
public String sayHellofail(){
return "I'am sorry";
}
}

设置限流,快速访问,从而触发服务降级
设置Sentinel的资源

当请求超过设定的阈值,启动限流降级,展示如下:

关于“SpringCloud中如何使用Sentinel实现限流”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“SpringCloud中如何使用Sentinel实现限流”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注天达云行业资讯频道。