-
熔断
2020-03-24 13:55:40我们知道,如果一个软件系统的并发请求数目超过了系统的最佳线程数,那么就会导致激烈的...这些技术中比较典型的就是限流、降级和熔断 1、为什么需要熔断 现在很多网站的背后都是一个庞大的《分布式》系统,多个...我们知道,如果一个软件系统的并发请求数目超过了系统的最佳线程数,那么就会导致激烈的资源竞争,随着资源的匮乏甚至枯竭,整个系统也就面临着灾难。所以,很多软件系统为了保证即使在出现并发用户数>最佳线程数时,也不至于导致整个万网站崩溃,都会采用一些技术手段来避免发生系统性灾难。这些技术中比较典型的就是限流、降级和熔断
1、为什么需要熔断
现在很多网站的背后都是一个庞大的《分布式》系统,多个系统之间的交互大多数都是采用《RPC》的方式,但是因为是远程调用,所以被调用者的服务的可用情况其实是不可控的。而越是庞大的系统,上下游的调用链就会越长,而如果在一个很长的调用链中,某一个服务由于某种原因导致响应时间很长,或者完全无响应,那么就可能把整个分布式系统都拖垮。
以上调用链,如果其中某一个服务由于自身原因导致响应很慢,那么就可能导致上游的服务影响也很慢,这样循环往复,就会导致整个系统全线崩溃,这就是服务雪崩。
其实,在分布式系统中,为了保证整体服务可用性和一致性,很多系统都会引入重试机制,在有些情况下,重试其实是可以解决问题的,比如网络问题等,都可以通过重试来解决。
但是,有些情况下,重试并不能解决问题,返而会加剧问题的严重性,比如下游系统因为请求量太大,导致CPU已经被打满,说着数据库连接池被占满,这时候上游系统调不通就会不断进行重试,这种重试请求,对于下游系统来说,无疑是雪上加霜,给下游系统造成二次伤害。
而分布式系统,大多数的服务雪崩也都是因为不断重试导致的,这种重试有可能是框架级别的自动重试、有可能是代码级别的重试逻辑、还有可能是用户的主动重试。
有些重试是无法避免的,而且如果因为防止雪崩,就不设计重试机制,也是一种因噎废食。
2、熔断器模式
熔断器模式(Circuit Breaker Pattern),是一个现代软件开发的设计模式。用以侦测错误,并避免不断地触发相同的错误(如维护时服务不可用、暂时性的系统问题或是未知的系统错误)。假设有个应用程序每秒会与数据库沟通数百次,此时数据库突然发生了错误,程序员并不会希望在错误时还不断地访问数据库。因此会想办法直接处理这个错误,并进入正常的结束程序。简单来说,熔断器会侦测错误并且“预防”应用程序不断地重试调用一个近乎毫无回应的服务(除非该服务已经安全到可重试连线了)。
熔断器模式是防止方志微服务系统雪崩的一种重要手段。
一个比较完善的熔断器,一般包含三种状态:
-
关闭
-
熔断器在默认情况下下是呈现关闭的状态,而熔断器本身带有计数功能,每当错误发生一次,计数器也就会进行“累加”的动作,到了一定的错误发生次数断路器就会被“开启”,这个时候亦会在内部启用一个计时器,一旦时间到了就会切换成半开启的状态。
-
-
开启
-
在开启的状态下任何请求都会“直接”被拒绝并且抛出异常讯息。
-
-
半开启
-
在此状态下断路器会允许部分的请求,如果这些请求都能成功通过,那么就意味着错误已经不存在,则会被切换回关闭状态并重置计数。倘若请求中有“任一”的错误发生,则会回复到“开启”状态,并且重新计时,给予系统一段休息时间。
-
上图是熔断器的三种状态的转换情况。
如果在微服务系统的调用过程中,引入熔断器,那么整个系统将天然具备以下能力:
-
快速失败:当因为调用远程服务失败次数过多,熔断器开启时,上游服务对于下游服务的调用就会快速失败,这样可以避免上游服务被拖垮。
-
无缝恢复:因为熔断器可以定期检查下游系统是否恢复,一旦恢复就可以重新回到关闭状态,所有请求便可以正常请求到下游服务。使得系统不需要认为干预。
3、熔断工具
熔断器为了实现快速失败和无缝恢复,就需要进行服务调用次数统计、服务调用切断等操作,如果想要自己实现一个熔断器其实也是可以的。
但是,市面上有一些框架已经帮我们做了这些事情。如Hystrix和Sentinel、resilience4j等。
3.1、Hystrix
Hystrix(https://github.com/Netflix/Hystrix )是Netflix开源的一款容错系统,能帮助使用者码出具备强大的容错能力和鲁棒性的程序。提供降级,熔断等功能。
但是,在2018年底,Hystrix在其Github主页宣布,不再开放新功能,推荐开发者使用其他仍然活跃的开源项目。
Hystrix虽然不再开发新功能 ,但对用户的影响应该不会太大,一是因为开发者可以继续使用Hystrix的最新版本1.5.18
3.2、resilience4j
Hystrix停更之后,Netflix官方推荐使用resilience4j(https://github.com/resilience4j/resilience4j ),它是一个轻量、易用、可组装的高可用框架,支持熔断、高频控制、隔离、限流、限时、重试等多种高可用机制。
与Hystrix相比,它有以下一些主要的区别:
-
Hystrix调用必须被封装到HystrixCommand里,而resilience4j以装饰器的方式提供对函数式接口、lambda表达式等的嵌套装饰,因此你可以用简洁的方式组合多种高可用机制;
-
Hystrix的频次统计采用滑动窗口的方式,而resilience4j采用环状缓冲区的方式;
-
关于熔断器在半开状态时的状态转换,Hystrix仅使用一次执行判定是否进行状态转换,而resilience4j则采用可配置的执行次数与阈值,来决定是否进行状态转换,这种方式提高了熔断机制的稳定性;
-
关于隔离机制,Hystrix提供基于线程池和信号量的隔离,而resilience4j只提供基于信号量的隔离。
3.3、Sentinel
Sentinel(https://github.com/alibaba/Sentinel )是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。
Hystrix 的关注点在于以隔离和熔断为主的容错机制,超时或被熔断的调用将会快速失败,并可以提供 fallback 机制。
而 Sentinel 的侧重点在于:
-
多样化的流量控制
-
熔断降级
-
系统负载保护
-
实时监控和控制台
下图是Sentinel的GitHub主页中关于Sentinel和Hystrix的对比:
4、熔断机制:
指的是在股票市场的交易时间中,当价格波动的幅度达到某一个限定的目标(熔断点)时,对其暂停交易一段时间的机制。此机制如同保险丝在电流过大时候熔断比较相似,故而得名。
熔断机制推出的目的是为了防范系统性风险,给市场更多的冷静时间,避免恐慌情绪蔓延导致市场波动,从而防止大规模股价下跌现象的发生。然而熔断机制也因切断了资金的流通性,同样会造成市场情绪加大,并令市场风险在熔断期结束后继续扩大。
美国熔断机制:
美国指数熔断机制的基准指数为标普500,单项跌幅阈值为7%、13%、20%。当指数较前一天收盘点位下跌7%、13%时,全美证券市场交易将暂停15分钟,当指数较前一天收盘点位下跌20%时,当天交易停止。2010年美股又开始实行个股熔断机制。
熔断机制最早由美国的纽约股票交易所在1987年提出,以避免发生类似“黑色星期一”的股灾。此时的熔断机制仅针对大盘指数进行熔断。1997年10月27日,道琼斯工业指数暴跌7.18%,收于7161.15点,这是熔断机制在1988年引入之后第一次被触发。
美股第二次触发熔断机制是在美东时间2020年3月9日,受2019冠状病毒病疫情和油价崩盘影响,3月9日上午9点34分,标普500指数开盘后跌7%触发第一层熔断机制,暂停交易15分钟。3天后,3月12日,标普500指数开盘后短时间内跌幅超过7%再次触发第一层熔断机制。
中国大陆熔断机制:
中华人民共和国自2016年起开始在上海证券交易所、深圳证券交易所和中国金融期货交易所同时试行熔断机制。其熔断的基准指数是沪深300指数,设置5%、7%两档指数熔断阈值,涨跌皆熔断。
-
-
-
Spring Cloud Alibaba 03_使用 Sentinel 实现服务限流降级熔断
2020-10-20 16:26:49Spring Cloud Alibaba 03_使用 Sentinel 实现服务限流降级熔断 雪崩效应 当服务A不可用时,服务B调用服务A的所有线程将处于阻塞状态,在高并发情况下,服务B中阻塞的线程越来越多,导致内存空间不足,致使服务B崩溃...Spring Cloud Alibaba 03_使用 Sentinel 实现服务限流降级熔断
雪崩效应
当服务A不可用时,服务B调用服务A的所有线程将处于阻塞状态,在高并发情况下,服务B中阻塞的线程越来越多,导致内存空间不足,致使服务B崩溃,同理,需要调用服务B的服务C也可能崩溃,这就是雪崩效应。
解决方案:- 设置线程超时释放
- 设置服务限流
- 设置熔断器Hystrix、Sentinel
降级: 系统将某些非必要功能关闭,只提供关键功能
限流: 只接收系统能够承载的访问量
熔断: 切断对某个故障服务的调用
Sentinel 实现服务限流
- 在 provider 中 添加 Sentinel 和 actuator 依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2.2.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>2.2.1.RELEASE</version> </dependency>
- 在配置文件中暴露所有端点,并指定 sentinel 的 uri (sentinel 默认端口为8080):
spring: cloud: nacos: discovery: server-addr: localhost:8848 sentinel: transport: dashboard: localhost:8080 application: name: provider server: port: 8083 # 暴露所有端点 management: endpoints: web: exposure: include: '*'
-
下载 Sentinel:https://github.com/alibaba/Sentinel/releases
-
java -jar 启动 Sentinel,然后访问:http://localhost:8080 进入控制台,登录用户名和密码都是 sentinel
-
依次启动 nacos、sentinel、 provider 后,多次访问 provider 的 /index 接口,观察到如下图表:
- 点击 簇点链路 --> 点击 /index 接口的流控,显示如下弹窗:
阈值类型选择QPS,单机阈值设为1
即每秒钟只允许1次访问- 再次短时间多次访问 /index 接口,当1s访问超过1次时,将会显示:Blocked by Sentinel (flow limiting)
同时观察到以下图表:
流控模式-关联模式- 在 provider 中添加 /list 接口,编辑流控规则,点击高级选项,流控模式选择关联,关联资源中填写/list
此时当 /list 接口每秒访问超过1次时,/index 接口将会被限流(你闯祸我背锅)
流控模式-链路模式在 provider 中添加以下两个依赖:
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>1.7.1</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-web-servlet</artifactId> <version>1.7.1</version> </dependency>
在配置文件中配置关闭 sentinel 的 filter 功能:
spring: cloud: sentinel: filter: enabled: false
FilterConfiguration 配置类:
package com.blu.configuration; import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FilterConfiguration { @Bean public FilterRegistrationBean registrationBean(){ FilterRegistrationBean registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(new CommonFilter()); //过滤所有的请求 registrationBean.addUrlPatterns("/*"); //关闭收敛功能,即可开放所有的链路 registrationBean.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY,"false"); registrationBean.setName("sentinelFilter"); return registrationBean; } }
在Service层添加test方法,并加上 @SentinelResource 注解:
package com.blu.service; import com.alibaba.csp.sentinel.annotation.SentinelResource; import org.springframework.stereotype.Service; @Service public class ProviderService { @SentinelResource("service-test") public void test(){ System.out.println("test"); } }
在 Controller 层添加 test1和test2两个方法来调用Service层的test方法:
@Autowired private ProviderService providerService; @GetMapping("/test1") public String test1(){ this.providerService.test(); return "test1"; } @GetMapping("/test2") public String test2(){ this.providerService.test(); return "test2"; }
依次启动nacos、sentinel、 provider 后,设置以下流控规则:
频繁访问 /test1 接口,当QPS大于1时,将显示错误页面:
而频繁访问 /test2 接口皆正常:
流控效果 - Warm Up(预热)
添加如下流控规则:
当点击新增后,系统会在10s内缓慢地将 /index 接口的请求阈值升至3 QPS
流控效果-排队等待
服务降级-降级策略-RT
当某个请求的响应时间超过1毫秒时,将进入准降级状态,在接下来的1s时间内如果连续5个请求的响应时间均超过1毫秒,将进入降级状态,持续时间为10秒
服务降级-降级策略-异常比例
当请求出现异常的比例达到了20%,将进入降级状态,持续时间10s
服务降级-降级策略-异常数
在1分钟内异常请求的次数达到5个,将进入降级状态,持续时间80秒(这里的降级持续时间一定要大于1分钟!)
热点规则
在Controller中添加如下方法:
@GetMapping("/hot") @SentinelResource("controller-hot") public String hot(@RequestParam(value = "num1",required = false) Integer num1, @RequestParam(value = "num2",required = false) Integer num2){ return num1+"---"+num2; }
请求示例:http://localhost:8081/hot?num1=1&num2=2
给 controller-hot 添加热点规则:
当请求参数中存在参数1(num1)时,QPS超过1将抛出异常:
在高级选项中,可设置参数例外值:
即:对参数1(num1)进行限流,阈值为1,但当num1为int类型,值为10时,限流阈值为1000
授权规则
- 在 Provider 中添加 RequestOriginParserDefinition 类:
package com.blu.configuration; import com.alibaba.csp.sentinel.adapter.servlet.callback.RequestOriginParser; import org.springframework.util.StringUtils; import javax.servlet.http.HttpServletRequest; public class RequestOriginParserDefinition implements RequestOriginParser { @Override public String parseOrigin(HttpServletRequest httpServletRequest) { String name = httpServletRequest.getParameter("name"); if (StringUtils.isEmpty(name)){ throw new RuntimeException("name is null"); } return name; } }
- 编写 SentinelConfiguration 配置类使 RequestOriginParserDefinition 类生效:
package com.blu.configuration; import com.alibaba.csp.sentinel.adapter.servlet.callback.WebCallbackManager; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; @Configuration public class SentinelConfiguration { @PostConstruct public void init(){ WebCallbackManager.setRequestOriginParser(new RequestOriginParserDefinition()); } }
此时,访问不携带name参数将报错:
-
添加授权规则:
此时,访问 /index 接口必须携带name参数,且参数值必须为admin -
修改授权规则:
此时,访问 /index 接口必须携带name参数,且参数值不能为blu
-
01、服务雪崩、服务熔断、服务降级 -- 基础概念
2020-10-13 00:00:54服务雪崩(服务像雪崩一样崩塌破坏) 服务雪崩的概念简单的理解为,一条服务链A(用户服务)、B(订单服务)、C(支付服务)三个服务,分别是A调用B,B调用C。 一般而言任务量最大的是底层服务C。...服务熔断(断开上相关参考文章:https://zhuanlan.zhihu.com/p/59109569
服务雪崩(
服务像雪崩一样崩塌破坏
)服务雪崩的概念简单的理解为,一条服务链A(用户服务)、B(订单服务)、C(支付服务)三个服务,分别是A调用B,B调用C。
一般而言任务量最大的是底层服务C。
服务C如果挂了(宕机)导致B服务间接也不可用、B服务不可用又间接导致A不可用。这样这条服务链
A->B->C
也就全部挂了,就像雪崩一样,因为一个服务不可用导致全部服务不可用
。因此这种现象就是服务雪崩。服务熔断(
断开上层服务,保护下层服务
)服务熔断:好比
保险丝(生活化打比方)、断路器(专业化打比方)
,是防止服务雪崩出现的一种保护措施。服务熔断的作用:底层服务C不可用、或者处理不过来请求,上层服务B就开启熔断,相当于保险丝断开的作用,让服务B不再调用C,等C服务恢复。服务B会按照周期性的询问C是否可用。当C恢复了。B则会恢复到正常的状态(断路器关闭、服务恢复)
服务降级(
服务按照重要性处理流量
)服务降级:将不重要或不紧急的服务 延迟或暂停这种现象叫做服务降级。好比权重分配
-
SpringCloud-Alibaba-Sentinel-服务降级-热点限流-服务熔断
2020-12-01 21:34:22除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用...前言:
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 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 "我在在另一个类中定义的方法"; } }
-
服务熔断与降级(Hystrix)
2019-01-29 13:49:01服务熔断 服务降级 熔断VS降级 Hystrix简介 使用Hystrix 引入Hystrix依赖 修改启动类 修改Controller Feign结合Hystrix 修改Feign客户端 创建Fallback处理类 修改配置 监控Hystrix 启用健康监控 启用... -
服务熔断
2020-10-21 12:30:59服务熔断熔断是什么实际操作测试原理(小总结)熔断类型官网断路器流程所有配置 断路器一句话就是家里保险丝 熔断是什么 大神论文 实际操作 修改cloud-provider-hystrix-payment8001 1、PaymentService //服务... -
熔断机制
2021-01-08 19:37:12熔断机制 雪崩效应 “雪崩效应"就是单个服务节点出现问题会造成大面积的服务节点出现异常,为了解决这种问题出现了"熔断机制”。 如果服务A访问量增加,导致线程堵塞。此时服务B和C可能需要A的某些信息才能进行... -
熔断机制什么意思_熔断机制是什么意思?熔断机制的作用
2020-12-22 13:51:30熔断机制的作用一、熔断机制是什么意思啊熔断机制(Circuit Breaker),也叫自动停盘机制,是指当股指波幅达到规定的熔断点时,交易所为控制风险采取的暂停交易措施。具体来说是对某一合约在达到涨跌停板之前,设置一... -
Hystrix服务熔断Hystrix服务熔断
2020-03-23 14:17:37服务熔断和服务降级异同 相同点:让用户体验到的是某些功能暂时不可用;都是从可用性和可靠性出发,为了防止系统崩溃; 不同点: 服务熔断:一般是某个服务(下游服务)故障引起, 服务降级:一般是从整体负荷考虑... -
服务熔断与熔断监控
2020-03-06 11:32:00熔断,就是断开与服务器的连接,熔断器是在服务不可用的时候主动断开,以免造成更多的雪崩效应,他是保护服务高可用的最后一道防线。 2.为什么需要熔断器? 为保证服务高可用,最先想到的是服务... -
熔断机制什么意思_熔断机制是什么意思 股市熔断是什么意思
2020-12-22 13:51:30在股票市场当中,我们经常会听到股市熔断,那么股票市场当中的熔断到底是什么意思呢?下面就和小编一起来了解一下熔断的含义吧。熔断,是指对某一合约在达到涨跌停板之前,设置一个熔断价格,使合约买卖报价在一段... -
熔断降级
2020-07-28 22:01:27除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。Sentinel 熔断降级会在调用链路中某个... -
Hystrix熔断
2020-01-02 18:47:36熔断机制是应对雪崩效应的一种保护机制,当某个微服务不可用或长时间不响应,会进行服务降级,进而熔断该节点微服务的调用,快速返回错误的响应信息,当微服务恢复正常后 恢复调用。 服务提供方降级 新建... -
熔断理解
2018-01-19 16:13:00服务熔断的理解 服务熔断也称服务隔离,来自于Michael Nygard 的《Release It》中的CircuitBreaker应用模式,Martin Fowler在博文CircuitBreaker中对此设计进行了比较详细说明。 本文认为服务熔断是服务降级的措施... -
从ISTIO熔断说起-轻舟网关熔断
2020-03-31 18:08:05最近大家经常被熔断洗脑,股市的动荡,让熔断再次出现在大家眼前。微服务中的熔断即服务提供方在一定时间内,因为访问压力太大或依赖异常等原因,而出现异常返回或慢响应,熔断即停止该服务的访问,防止发生雪崩效应... -
熔断机制什么意思_干货丨多国股市熔断,什么是熔断机制?
2020-12-11 02:56:12什么是熔断机制熔断机制(Circuit Breaker),也叫自动停盘机制,是指当股指波幅达到规定的熔断点时,交易所为控制风险采取的暂停交易措施。具体来说是对某一合约在达到涨跌停板之前,设置一个熔断价格,使合约买卖... -
熔断机制什么意思_什么是熔断机制,熔断机制是什么意思
2020-12-22 13:51:31熔断机制也叫自动停盘机制,是指当股指波幅达到规定的熔断点时,交易所为控制风险采取的暂停交易措施。具体来说是对某一合约在达到涨跌停板之前,设置一个熔断价格,使合约买卖报价在一段时间内只能在这一价格范围内... -
谈谈美股熔断和服务熔断Hystrix
2020-03-17 21:04:21首先说一下最近比较火热的美股熔断,美股熔断究竟是什么意思? 先看看维基百科: 熔断机制(英语:Circuit breaker / Trading curb)指的是在股票市场的交易时间中,当价格波动的幅度达到某一个限定的目标(熔断点)... -
Spring Cloud - 熔断(Hystrix)
2019-06-24 15:33:23熔断 小铭同学最近正在学Spring Cloud,最近学到熔断这块的知识点,不是很理解,于是请教了公司的大佬老王。 小铭趁空闲时间找到老王:“王哥,我最近在学习Spring Cloud,看到所有书上都说熔断是微服务必须的,可我...
-
选项模式(option)
-
iview定制化主题 .bezierEasingMixin(); ^ Inline JavaScript is not enabled. Is it set in your options
-
LeetCode 剑指 Offer 51. 数组中的逆序对 (归并排序、离散化+树状数组)
-
【数据分析-随到随学】Mysql数据库
-
计算机网络基础
-
2020年最新行政区划数据(12位编码).xlsx
-
Anaconda windows10 最新安装教程(2021-01-18)
-
手势解锁-canvas-javascript实战
-
UnitySocket异步聊天室
-
PLECS平台光伏MPPT仿真.rar
-
【数据分析-随到随学】机器学习模型及应用
-
Cannot resolve method ‘getParameter(java.lang.String)‘
-
DevExpress_VCL_v20.2.3_for_Delphi_10.4_Sydney.rar
-
hashcat.7z
-
深度剖析Java集合之ArrayDeque
-
TCS.TDS.pdf
-
2017 计蒜之道 初赛 第一场 阿里的新游戏 题解
-
WPF上位机数据采集与监控系统零基础实战
-
【数据分析-随到随学】Python语法强化与数据处理
-
115个Java面试题及回答.doc