Sentinel是Alibaba开源的一款微服务流控组件,用于解决分布式应用场景下服务的稳定性问题。Sentinel具有丰富的应用场景,它基于流量提供一系列的服务保护措施,例如多线程秒杀情况下的系统承载,并发访问下的流量控制,实时熔断等。
在分布式应用架构中,服务间的关系错综复杂,一个服务往往依赖多个其他服务,如果其中一个服务发生了故障,那么依赖于当前服务的服务也会被阻塞,以此类推下去,就算其他服务没有直接的依赖于故障服务,也会受到影响,最终导致雪崩,因此雪崩问题是指微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。
。
1.超时处理
为请求设定超时时间,当请求超过一定时间没有被响应时,直接返回错误信息。这种方式依然会占用一部分的时间。
2.舱壁模式
为每个业务逻辑设定一定线程数,这样一来,在服务阻塞的时候,就只会占用有限的资源,而不会将消耗全部资源。该模式也叫线程隔离。
3.断路器
由断路器统计业务执行的异常比例,如果超出阈值会熔断该业务,拦截访问该业务的一切请求
4.限流
限流是指限制业务访问的QPS,避免服务因为突增的流量而故障
QPS:每秒能够处理的请求数
上述解决雪崩问题的措施可以分为两类:
1.预防
限流就是一种预防措施,它在检测高并发访问时,采取措施,从而使当前服务不受影响
2.补救
超时处理,线程隔离,熔断都是补救措施,这个时候服务已经受到了影响,后续操作只是将影响控制在一定范围内。
1.下载
sentinel官方提供了UI控制台,方便我们对系统做限流设置。可以在GitHub下载。
2.运行
将jar包放到任意非中文目录,执行命令:
java -jar sentinel-dashboard-1.8.1.jar
3.访问
访问http://localhost:8080页面,就可以看到sentinel的控制台了:
需要输入账号和密码,默认都是:sentinel
由于Sentinel采取懒加载,而我们还没有整合微服务,因此这个时候控制台上还什么都没有
这里如果是properties文件l应该是 spring.cloud.sentinel.transport.dashboard = localhost:8080,我上面也没写spring,是因为还有nacos在它上面
用postman发送请求,出发Sentinel监控
雪崩问题虽然有四种方案,但是限流是避免服务因突发的流量而发生故障,是对微服务雪崩问题的预防。所以这里主要说的就是流量控制啦。
刚刚我们在访问任意资源后,Sentinel控制台中就显示了一个调用信息,其中过程是 请求进入微服务后,首先访问DispatcherServlet,然后进入Controller,Service,Mapper,这样的调用链就叫做簇点链路。簇点链路中被监控的每一个接口都是一个资源。
如果需要设置某项规则,可以点击链路后的按钮。
step1:对我们刚刚访问过的资源,新增一条流控规则,设置QPS为5,即每秒最多响应5个请求
新增后可以在流控规则中查看到刚刚增加的流控规则
2、使用jmeter进行测试
2.1先把jmeter跑起来,找到文件夹bin目录下的jmeter.bat双击就了
2.2创建一个测试线程组
2.3右击线程组,创建HTTP请求
2.4右击线程组,创建结果树
2.5 Sentinel查看结果
流控模式有三种,在设置流控规则的时候,可以点击高级选项进行设置
统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是优先支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流。
统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流
使用场景:比如有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流。
在流控的高级选项中,还有一个流控效果选项:
流控效果是指请求达到流控阈值时应该采取的措施,包括三种:
快速失败
达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。
预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。在一个服务刚刚启动时,一切资源尚未初始化(冷启动),如果直接将QPS跑到最大值,可能导致服务瞬间宕机。而warm up也叫预热模式,是应对服务冷启动的一种方案。请求阈值初始值是 maxThreshold / coldFactor,持续指定时长后,逐渐提高到maxThreshold值。而coldFactor的默认值是3.
例如,我设置QPS的maxThreshold为10,预热时间为5秒,那么初始阈值就是 10 / 3 ,也就是3,然后在5秒后逐渐增长到10
让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长。当请求超过QPS阈值时,快速失败和warm up 会拒绝新的请求并抛出异常。而排队等待则是让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。
总结
关于Sentinel流控组件的介绍就到这里,感谢收看,再见啦~