Why
在微服务体系结构中,由于调用关系的复杂性,当调用链路中的某个资源变得不稳定时,最终会将请求堆栈在一起。 服务之间的延迟增加,备份队列、线程和其他系统资源紧张,整个系统都可能发生级联故障。
为了保持服务的稳定性,在调用链路中的某个资源处于不稳定状态时(例如,调用超时或异常百分比上升),限制对该资源的调用,使请求迅速失败,影响其他资源并导致级联错误资源降级后,对该资源的调用将在下一个降级时间窗口中自动断开。 默认行为是抛出DegradeException。
霍瓦
服务熔断
一般发生在下游服务中,下游服务发生故障时,服务无法熔断使用
电路中的保险丝,超过负荷,直接熔断,切断电源,不能使用,保护整体安全
服务降级
降级后暂时无法使用某项服务,为了服务整体的稳定,牺牲一些不重要的功能,保证核心功能的进行
妈妈让qcdjz去买酱油,给了她10元。 qcdjz去超市看了2元喜欢的玩具,拿着玩具和酱油去柜台结账发现一共需要12元。 为了完成母亲的任务,我选择不买玩具。 我下次在买玩具
因此,根据上述分析,两者其实从几个角度有一定的相似性:
目的很一致:从可用性可靠性考虑,都是为了防止系统整体延迟和崩溃而采用的技术手段;
最终的表现相似。 对两者来说,最终让用户体验的是一些功能暂时无法完成或无法使用
自治性要求高:熔断模式一般来说服务是基于战略的自动触发,降级可以人工干预,但在微服务的框架下,显然不可能完全依赖人,交换机预设、配置中心都是必要的手段;
两者的区别很明显:
触发的原因不太一样。 服务熔断通常是由一个服务(下游服务)故障引起的,服务降级通常是从总体负载考虑的。
微信
我们使用sentinel进行熔断降级,因为我们使用nacos进行服务注册和发现。
首先引入依赖
//Gradle
实施(com.Alibaba.cloud : spring-cloud-starter-Alibaba-sentinel ) {
exclude module: 'guava '
}
//Maven
com.alibaba.cloud
spring-cloud-starter-Alibaba-sentinel
使用配置文件打开sentinel
feign:
sentinel:
启用:真
使用语言kotlin
当您阅读@FeignClient源代码时,您会看到fallback是由spring创建的
//*
* fallbackclassforthespecifiedfeignclientinterface.thefallbackclassmust
* implementtheinterfaceannotatedbythisannotationandbeavalidspringbean。
* @ returnfallbackclassforthespecifiedfeignclientinterface
*/
Class fallback () default void.class;
//*
* defineafallbackfactoryforthespecifiedfeignclientinterface.the fallback
* factorymustproduceinstancesoffallbackclassesthatimplementtheinterface
* annotated by { @ linkfeignclient }.thefallbackfactorymustbeavalidspringbean。
*
* @ see feign.hy strix.fallbackfactoryfordetails。
* @ returnfallbackfactoryforthespecifiedfeignclientinterface
*/
Class fallbackFactory () default void.class;
1 .闪回工厂
package com.karl.cloud;
importorg.spring framework.cloud.open feign.feign客户端;
importorg.spring帧web.bind.annotation.get mapping;
import com.karl.DTO.UserInfoDTO;
@ feign client (value=' Karl-service-user ',fallback factory=userfallbackfactory :3360 class ) )。
接口用户功能{
@getmapping(/Karl/user ) )。
fun getuser (:用户界面dto
}
@Component
classuserfallbackfactory : fallback factory {
val logger=logger factory.getlogger (userfallbackfactory 3360: class.Java )!
板载函数创建(cause : throwable ) :数据功能{
Logger.error(cause.message,cause ) )
返回用户故障后退(
}
}
classuserfallback :用户feign {
override fun getUser () : UserInfoDTO{
返回userinfo dto (
}
}
2 .闪回
package com.karl.cloud;
importorg.spring framework.cloud.open feign.feign客户端;
importorg.spring帧web.bind.annotation.get mapping;
import com.karl.DTO.UserInfoDTO;
@ feign client (value=' Karl-service-user ',fallback=user fallback :3360 class ) ) ) ) ) )。
接口用户功能{
@getmapping(/Karl/user ) )。
fun getuser (:用户界面dto
}
@Component
classuserfallback :用户feign {
override fun getUser () : UserInfoDTO{
返回userinfo dto (
}
}