Sentinel简介
背景分析
Sentinel限流入门
第一步:在提供方sca-provider配置sentinel依赖
第二步:配置
第三步:创建类
第四步:启动sca-provider服务,然后对指定服务进行访问
第五步:刷新sentinel 控制台,实时监控信息
Sentinel限流入门实践
我们设置一下指定接口的流控(流量控制),QPS(每秒请求次数)单机阈值为1,代表每秒请求不能超出1次,要不然就做限流处理,处理方式直接调用失败。
第一步:设置限流策略
第二步:设置限流策略
第三步:反复刷新访问消费端端服务,检测是否有限流信息输出
第四步:查看Sentinel控制台,会发现有拒绝的次数
Sentinel流控规则分析
阈值类型
- QPS(Queries Per Second):当调用相关url对应的资源时,QPS达到单机阈值时,就会限流。
- 线程数:当调用相关url对应的资源时,线程数达到单机阈值时,就会限流。
设置限流模式
Sentinel的流控模式代表的流控的方式,默认【直接】,还有关联,链路。
直接模式
Sentinel默认的流控处理就是【直接->快速失败】。
关联模式
当关联的资源达到阈值,就限流自己。例如设置了关联资源为/ur2时,假如关联资源/url2的qps阀值超过1时,就限流/url1接口(是不是感觉很霸道,关联资源达到阀值,是本资源接口被限流了)。这种关联模式有什么应用场景呢?我们举个例子,订单服务中会有2个重要的接口,一个是读取订单信息接口,一个是写入订单信息接口。在高并发业务场景中,两个接口都会占用资源,如果读取接口访问过大,就会影响写入接口的性能。业务中如果我们希望写入订单比较重要,要优先考虑写入订单接口。那就可以利用关联模式;在关联资源上面设置写入接口,资源名设置读取接口就行了;这样就起到了优先写入,一旦写入请求多,就限制读的请求。
第一步:在ProviderSentinelController中添加一个方法
第二步:在sentinel中做限流设计
第三步:打开两个测试窗口,对/provider/sentinel02进行访问,检查/provider/sentinel01的状态
链路模式
链路模式只记录指定链路入口的流量。也就是当多个服务对指定资源调用时,假如流量超出了指定阈值,则进行限流。被调用的方法用@SentinelResource进行注解,然后分别用不同业务方法对此业务进行调用,假如A业务设置了链路模式的限流,在B业务中是不受影响的。现在对链路模式做一个实践,
第一步:在指定包创建一个ResourceService类,
第二步:在ProviderSentinelController中添加一个方法,
第三步::在sentinel中配置限流规则
第四步:设置链路流控规则后,再频繁对限流链路进行访问,检测是否会出现500异常
后端会报错
说明,流控模式为链路模式时,假如是sentinel 1.7.2以后版本,Sentinel Web过滤器默认会聚合所有URL的入口为sentinel_spring_web_context,因此单独对指定链路限流会不生效,需要在bootstrap.yml添加如下语句来关闭URL PATH聚合
当我们也可以基于@SentinelResource注解描述的方法进行限流后的异常进行自定义处理,其步骤如下:
第一步:定义blockHandlerClass
第二步:修改@SentinelResource注解中的属性定义,
第三步:在controller方法中,调用@Sentinel注解描述的方法
第四步:访问网页并查看
如何将Sentinel限流中自定义内容?
第一步:在idea中通过ctrl+n查找
第二步:通过ctrl+h查找BlockExceptionHandler接口中的类,找到
第三步:自定义一个类来实现BlockExceptionHandler接口
第四步:在sentinel中设置限流后访问,出现自定义内容