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注解用来标注一个方法。将这个方法纳入限流控制。
阅读全文