SpringCloud Sentinel如何成为流量防卫兵的进阶利器?
摘要:Sentinel 流量防卫兵 之前,我们了解到了微服务雪崩问题,就是一个微服务出现问题,有可能导致整个联络直接不可用,这时候就需要进行即使的熔断和降级,之前我们使用Hystrix来实现。现在我们使用Sentinel 。 Sentinel 有
Sentinel 流量防卫兵
之前,我们了解到了微服务雪崩问题,就是一个微服务出现问题,有可能导致整个联络直接不可用,这时候就需要进行即使的熔断和降级,之前我们使用Hystrix来实现。现在我们使用Sentinel 。
Sentinel 有以下特征:
丰富的应用场景:例如秒杀、消息削峰填谷、集群流量控制、实时熔断下游不可用服务等。
完备的实时监控:Sentinel 提供实时监控功能。
广泛的开源生态:Sentinel 可以与其他开源框架整合。
完善的SPI扩展机制:Sentinel 提供简单易用的SPI接口。可以通过接口快速定制逻辑、规则。
安装与部署
下载并安装下载地址
下载下来是一个jar包,直接启动这个jar包。端口默认8080,我这里指定了8858端口。
访问地址就是localhost:8858 ; 用户名和密码都是sentinel
在服务中引入sentinel依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
在配置文件进行配置
spring:
cloud:
sentinel:
transport:
# 添加监控页面地址
dashboard: localhost:8858
然后启动服务,注意,这里要先调用一次服务,sentinel才会加载这个服务(它使用了懒加载机制)
流量控制
我们不能无限制的接收和处理客户端请求,如果不加以限制,当发生高并发情况时,系统资源很快就会被耗尽。
这时可以使用流量控制(限流),当一段时间内的流量达到一定的阈值时,新的请求将不再进行处理。这样能合理应对高并发,也能保护服务器不受外界的攻击。
那么,实现限流的策略有哪些呢?
快速拒绝:不再接收新请求。直接返回一个拒绝信息,告诉用户访问频率过高。
预热:基于方案一,但由于某些情况下高并发请求时在某一时刻突然到来,我们可以缓慢地将阈值提高到指定阈值,形成一个缓冲保护
排队等待:不接受新请求,也不直接拒绝,而是进入排队,要是规定时间内能执行就执行,超时就算了。
针对是否超过流量阈值的判断,有4种算法:
漏桶算法
令牌桶算法
现在有一个令牌桶,这个桶专门存放令牌,每隔一段时间就向桶中丢入一个令牌(速度由我们指定)当新的请求到达时,将从桶中删除令牌,接着请求就可以通过并给到服务,但是如果桶中的令牌数量不足,那么不删除令牌,而是然那个此数据包等待。
当流量下降时,令牌桶中的令牌会逐渐积累,这样如果突然出现高并发,那么就能在短时间内拿到大量的令牌。
固定时间窗口算法:
滑动时间窗口算法
具体使用哪种算法和策略可以由我们自己制定。
按照上图指示进入流控规则页面。
阈值类型:QPS就是每秒种的请求数量,并发线程数是按服务当前十一月的线程数据进行统计的。
流控模式:当达到阈值时,流控的对象,这里暂时使用直接。
流控效果:对应上面的三种限流策略。
这里我们选择QPS、阈值设为1,流控模式选择直接、流控效果选择快速失败。可以看到当我们快速地进行请求时,会直接返回失败信息。
那这些流控模式有什么区别?
直接:只针对于当前接口
关联:当关联的其他接口超过阈值时,会导致当前接口被限流
链路:更细粒度的限流,能精确到具体的方法。
比如关联模式,我们将/borrow/{uid}和自带的/error接口关联,然后进行限流
此时,如果对/error的请求达到阈值时,请求/borrow/{uid}就会被限流,会访问失败!
注意:限流是作用于关联资源的,一旦关联资源超过阈值,那么就会对当前资源进行限流!
那什么是链路流控模式呢?
链路流控模式指的是当从指定接口过来的请求达到限流条件时,开启限流。需要@SentinelResource注解配合使用。
@SentinelResource注解用来标注一个方法。将这个方法纳入限流控制。
