QPS(Queries Per Second)即每秒查询率
TPS,每秒处理的事务数目
PV(page view)即页面浏览量
UV 访问数(Unique Visitor)指独立访客访问数
一、初识Sentinel
什么是雪崩问题?
微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。
如何避免因瞬间高并发流量而导致服务故障?
流量控制
如何避免因服务故障引起的雪崩问题?
超时处理
线程隔离
降级熔断

认识sentinel
Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址: https://sentinelquard.io/zh-cn/index.html
Sentinel具有以下特征:
丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
**完备的实时监控:**Sentinel同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至500 台以下规模的集群的汇总运行情况。
广泛的开源生态:Sentinel提供开箱即用的与其它开源框架/库的整合模块,例如与Spring Cloud、Dubbo、qRPC的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
完善的 SPI 扩展点:Sentinel提供简单易用、完善的 SPI扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
安装Sentinel控制台
sentinel官方提供了U控制台,方便我们对系统做限流设置。大家可以在GitHub下载。
https://github.com/alibaba/Sentinel/releases

将其拷贝到一个你能记住的非中文目录,然后运行命令:
java -jar sentinel-dashboard-1.8.7.jar
然后访问:localhost:8080 即可看到控制台页面,默认的账户和密码都是sentinel

微服务整合Sentinel
我们在order-sentinel中整合Sentinel,并且连接Sentinel的控制台,步骤如下:
1.引入sentinel依赖:
2.配置控制台地址:
spring:
application:
name: meitemayikt-sentinel
cloud:
nacos:
discovery:
server-addr: 192.168.0.111:8848
#register-enabled: true
sentinel:
enabled: true
transport:
dashboard: 192.168.0.111:8080 # Sentinel 控制台地址
clientIp: 192.168.0.103 # 很重要,要告诉Sentinel服务端的ip
eager: true # 是否立即加载 Sentinel 规则
3、访问微服务的任意端点,触发sentinel监控
我这里访问的 http://localhost:7090/test/15099meitemayikt-sentinel服务的一个接口我这里访问的 http://localhost:7090/test/15099
访问sentinel控制台就看到了

限流规则-快速入门
簇点链路 : 就是项目内的调用链路,链路中被监控的每个接口就是一个资源。
默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint),因此SpringMVC的每一个端点(Endpoint)就是调用链路中的一个资源。
点击资源http://localhost:7090/test/112后面的流控按钮,就可以弹出表单。表单中可以添加流控规则,如下图所示:
给 /test/111这个资源设置流控规则,QP5不能超过 5。然后利用jemeter测试。



流量控制
在添加限流规则时,点击高级选项,可以选择三种流控模式:
直接: 统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
关联: 统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
链路: 统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流
流控模式-关联
关联模式: 统计与当前资源相关的另一个资源,触发值时,对当前资源限流。
使用场景: 比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是有限支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流。
测试案例
在Controller新建两个端点:/test/query和/test/update,无需实现业务.
配置流控规则,当/test/update资源被访问的QPS超过5时,对/test/query请求限流

jemeter测试

浏览器访问test/query,可以看到限流结果

流控模式 - 关联
链路模式: 只针对从指定链路访问到本资源的请求做统计,判断是否超过阈值
案例
查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计并设置限流。
步骤:
- 添加一个queryGoods方法,不用实现业务
在Controller中,改造/test/query端点,调用TestService中的queryGoods方法
2.在Controller中添加一个/test/save的端点,调用TestService的queryGoods方法给queryGoods设置限流规则,从/test/query进入queryGoods的方法限制QPS必须小于2
Sentinel默认只标记Controller中的方法为资源,如果要标记其它方法,需要利用
@SentinelResource("goods")注解,示例:

Sentinel默认会将Controler方法做context整合,导致链路模式的流控失效,需要修改application.yml,添加配置:
spring:
cloud:
sentinel:
web-context-unify: false #关context型合

流控效果
流控效果是指请求达到流控阈值时应该采取的措施,包括三种:
快速失败 : 达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。
warm up : 预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阔值会动态变化,从一个较小值逐渐增加到最大阈值
排队等待: 让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长
流控效果-warm up
需求:给/test/warm_up 这个资源设置限流,最大QPS为10,利用warmup效果,预热时长为5秒


