java 限流熔断_SpringCloud-Alibaba-Sentinel服务降级,热点限流,服务熔断
前言:除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 api 等。例如,支付的时候,可能需要远程调用银联提供的 api;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用
熔断策略
sentinel 提供以下几种熔断策略:
慢调用比例 (slow_request_ratio):选择以慢调用比例作为阈值,需要设置允许的慢调用 rt(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statintervalms)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(half-open 状态),若接下来的一个请求响应时间小于设置的慢调用 rt 则结束熔断,若大于设置的慢调用 rt 则会再次被熔断。
异常比例 (error_ratio):当单位统计时长(statintervalms)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(half-open 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
异常数 (error_count):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(half-open 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断、
慢调用比例:
最大 rt:200意思是 在200毫秒处理完这个请求
比例阀值:1 意思是是 在200毫秒处理一个请求 你设置几就就200毫秒处理几个
熔断时长:1意思是一秒内不可用
最小请求数:5 意思是 一秒5次请求
异常比例:
比例阀值:官网:(异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%)0.3意思错误的达到了百分之30的时候 触发熔断
熔断时间:1的意思是一秒之间不可用
最小请求数:5一秒5个
异常数
异常数:3意思是超过3个异常,就是第4次进入熔断服务降级,当第五次请求是对的就会恢复
熔断时长:1秒
热点参数限流何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 top k 数据,并对其访问进行限制。比如:
商品 id 为参数,统计一段时间内最常购买的商品 id 并进行限制
用户 id 为参数,针对一段时间内频繁访问的用户 id 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
示例:
这里有两个 参数一个是a 一个是b热点限流是根据设置参数的下标设置的,下表是从0开始的,
@sentinelresource注解设置要限流的id, blockhandler设置返回可预知的响应体
@getmapping(value = "select/test")
@sentinelresource(value = "test",blockhandler = "teat1")
public string test(@requestparam(value = "a",required = false) integer a,@requestparam(value = "b",required = false) integer b){
return "我是:sentinel";
}
设置的可预知的响应体这个的blockexception是必须的参数
public string teat1(@requestparam(value = "a",required = false) integer a,@requestparam(value = "b",required = false)integer b, blockexception e){
return "没错我就是我了";
}
配置
test是@sentinelresource(value = "test",blockhandler = "teat1")
参数索引:0就是0下标
单机阀值:1处理的个数
统计窗口时长 1是一秒处理完成
高级选项
参数类型:选择参数的数据类型
参数值:1就参数如果等于1就限流
限流阀: 3就是3次
这些可以自己测试
服务熔断
sentinel 提供了 @sentinelresource 注解用于定义资源,并提供了 aspectj 的扩展用于自动定义资源、处理 blockexception 等。
@sentinelresource 注解
@sentinelresource 用于定义资源,并提供可选的异常处理和 fallback 配置项。 @sentinelresource 注解包含以下属性:
value:资源名称,必需项(不能为空)
entrytype:entry 类型,可选项(默认为 entrytype.out)
blockhandler / blockhandlerclass: blockhandler 对应处理 blockexception 的函数名称,可选项。blockhandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 blockexception。blockhandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockhandlerclass 为对应的类的 class 对象,注意对应的函数必需为 static 函数,否则无法解析。
fallback / fallbackclass:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionstoignore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:
返回值类型必须与原函数返回值类型一致;
方法参数列表需要和原函数一致,或者可以额外多一个 throwable 类型的参数用于接收对应的异常。
fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackclass 为对应的类的 class 对象,注意对应的函数必需为 static 函数,否则无法解析。
defaultfallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了 exceptionstoignore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultfallback,则只有 fallback 会生效。defaultfallback 函数签名要求:
返回值类型必须与原函数返回值类型一致;
方法参数列表需要为空,或者可以额外多一个 throwable 类型的参数用于接收对应的异常。
defaultfallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackclass 为对应的类的 class 对象,注意对应的函数必需为 static 函数,否则无法解析。
exceptionstoignore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。
1.8.0 版本开始,defaultfallback 支持在类级别进行配置。
注:1.6.0 之前的版本 fallback 函数只针对降级异常(degradeexception)进行处理,不能针对业务异常进行处理。
特别地,若 blockhandler 和 fallback 都进行了配置,则被限流降级而抛出 blockexception 时只会进入 blockhandler 处理逻辑。若未配置 blockhandler、fallback 和 defaultfallback,则被限流降级时会将 blockexception 直接抛出(若方法本身未定义 throws blockexception 则会被 jvm 包装一层 undeclaredthrowableexception)。
示例:
1,fallback处理java异常
@sentinelresource(value = "select",fallback = "errorfallback")
代码
@getmapping(value = "select/{id}")
@sentinelresource(value = "select",fallback = "errorfallback")
public commonresult getid(@pathvariable long id){
if(id>3) {
throw new nullpointerexception(id+"没有记录");
}else {
return resttemplate.getforobject(url + "/select/" + id, commonresult.class);
}
}
fallback 处理方法
public commonresult errorfallback(@pathvariable long id,throwable e){
return new commonresult<>(500,"不好意,没有此记录");
}
处理结果
blockhandler 处理sentinel配置异常 java的异常无法处理
@sentinelresource(value = "select",blockhandler = "errorfallback")
public commonresult errorfallback(@pathvariable long id, blockexception e){
return new commonresult<>(500,"不好意,没有此记录"+e.getmessage());
}
测试
这设置的是异常比例 异常达到百分之30进行熔断
两个注解同时用
@sentinelresource(value = "select",blockhandler = "errorfallback",fallback = "errorfallback1")
public commonresult errorfallback1(@pathvariable long id, throwable e){
return new commonresult<>(500,"fallback:不好意,没有此记录"+e.getmessage());
}
public commonresult errorfallback(@pathvariable long id, blockexception e){
return new commonresult<>(500,"blockhandler:不好意,没有此记录"+e.getmessage());
}
但是 要是blockhandler 和fallback 同时配置则被限流降级抛出异常blockexception 处理
exceptionstoignore
@sentinelresource(value = "select",blockhandler = "errorfallback",fallback = "errorfallback1"
,exceptionstoignore = {illegalaccessexception.class})
blockhandlerclass=定义返回统一返回方法.class
业务
@getmapping(value = "select/test")
@sentinelresource(value = "test",blockhandlerclass= mysentinel.class,blockhandler = "a")
public string test(@requestparam(value = "a",required = false) integer a,@requestparam(value = "b",required = false) integer b){
return "我是:sentinel";
}
熔断降级
package com.tang.cloud.mysentinel;
import com.alibaba.csp.sentinel.slots.block.blockexception;
import jdk.nashorn.internal.ir.block;
import org.bouncycastle.crypto.engines.blowfishengine;
import org.springframework.web.bind.annotation.requestparam;
/**
* 统一返回降级处理
*/
public class mysentinel {
//返回的的类型和调用的方法的类型一致,参数的类型和个数相同
public static string a(@requestparam(value = "a",required = false) integer a, @requestparam(value = "b",required = false) integer b, blockexception excep){
return "我在在另一个类中定义的方法";
}
}
到此这篇关于springcloud-alibaba-sentinel服务降级热点限流服务熔断的文章就介绍到这了,更多相关springcloud-alibaba-sentinel-服务降级内容请搜索萬仟网以前的文章或继续浏览下面的相关文章希望大家以后多多支持萬仟网!
希望与广大网友互动??
点此进行留言吧!
java 限流熔断_SpringCloud-Alibaba-Sentinel服务降级,热点限流,服务熔断相关推荐
- java 限流熔断_SpringCloud Alibaba微服务实战五 - 限流熔断
简介 Sentinel是面向分布式服务框架的轻量级流量控制框架,主要以流量为切入点,从流量控制,熔断降级,系统负载保护等多个维度来维护系统的稳定性.在SpringCloud体系中,sentinel主要 ...
- Sentinel系列之热点限流
热点数据:就是那些经常被访问或者经常出现的数据,所以针对这种数据就会进行限流,比如针对刷单,同一个账号或者同一个ip进来的用户进行限流等等 Sentinel提供了热点参数限流的策略,其实就是一种特殊的 ...
- dubbo服务降级与限流
前言 作为RPC框架,dubbo在调用过程中不可避免的会出现各种异常问题,在使用springcloud进行微服务治理时,会接触到hystrix,sentinel等服务限流降级框架,同样对于dubbo来 ...
- 服务降级,限流,削峰
服务降级 举例:淘宝的搜索功能,平时的时候 搜全站.高峰期的时候,限制只能搜店内或者一些品类不给搜. 削峰 把瞬时流量拉长.强行把并行变成串行 举例:12306的春运票,一段时间一段时间的放,一个地方 ...
- Alibaba Sentinel DegradeRule 降级规则源码
降级方式 Alibaba Sentinel 支持多种降级方式: 根据响应时间:判断单位时间内平均响应时间是否达到阈值: 根据异常比例:判断单位时间内,异常数量和异常比例是否达到阈值: 根据异常数量:判 ...
- SpringCloud Alibaba Sentinel限流详解 这一次别在错过
点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 sentinel,即可免费获取源码 熔断规则 在上一篇文章中我们讲解了 ...
- 技术圈儿002---高并发整体可用性:一文详解降级、限流和熔断
水满则溢,月盈则亏,任何事物都不可能无限制的发展,我们的系统服务能力也一样. 当随着流量的不断增长,达到或超过服务本身的可承载范围,系统服务的自我保护机制的建立就显得很重要了. 本文希望可以用最通俗的 ...
- SpringCloudAlibaba 六、Sentinel 服务保护 ( 服务降级/ 熔断/ 数据持久化 / gateway 整合 Sentinel )
一.Sentinel 描叙 1.Sentinel作用 Sentinel,中文翻译为哨兵,是为微服务提供流量控制.熔断降级的功能,它和Hystrix提供的功能一样,可以有效的解决微服务调用产生的&quo ...
- 高并发整体可用性:一文详解降级、限流和熔断
水满则溢,月盈则亏,任何事物都不可能无限制的发展,我们的系统服务能力也一样. 当随着流量的不断增长,达到或超过服务本身的可承载范围,系统服务的自我保护机制的建立就显得很重要了. 本文希望可以用最通俗的 ...
最新文章
- android mp4流格式,将RTSP流保存到android中的mp4文件
- 做好信贷业务必须了解这八大问题!
- linux查看文件的编码格式的方法 set fileencoding
- PostgreSQL 统计所有数据表各自的总行数
- 汤姆克兰西全境封锁服务器维护时间,汤姆克兰西全境封锁无法登录怎么解决 无法登录解决方法攻略...
- MySQL数据库初识
- 第6章 访问权限控制
- idea阅读器插件开发实现
- spring boot 2.0 与FASTDFS进行整合
- 联通企业专线_上海联通数据专线-企业宽带网
- 圣诞素材网站推荐 这几个网站超多免费可商用素材
- Linux-菜鸟入门自学 (二)
- 联通链:5G时代的信任链
- Plant Simulation中的“开机自启”-autoexec
- 计算机视觉两个入门数据集(mnist和fashion mnist)本地下载地址
- 第1.7章 elasticsearch线上问题集1
- matlab 悬架,基于MATLAB的汽车悬架仿真研究.doc
- 大数据:Trino的前世今生
- K8S 安装 Metric-server
- SPOJ - GCJ1C09C Bribe the Prisoners