服务降级和服务熔断的区别_微服务容错框架:Hystrix实现服务熔断、降级、限流...

业务背景

在微服务架构体系下,服务间不可避免地会发生依赖关系,一般来说会通过REST Api来进行通信,这里先盗一个图来举例说明一个具体的业务场景(逃):

f3588a2bf18f5c7f1dad762b1e10661a.png

比如一个商城系统的微服务化结构,订单、商品、库存这三个服务是紧密依赖的,在理想情况下,什么问题都不发生当然是最好的。但服务运行期间难免会出现各种问题,如网络阻塞,延迟过高(比如因为内存泄露导致的Full GC次数飙高) ,甚至服务直接挂掉(比如流量激增把服务打挂了)等情况都是很有可能发生的。倘若库存服务挂掉了,那对于所有对库存服务有依赖关系的服务都会受到很大影响,最终甚至会扩散到整个微服务体系,这种就称之为雪崩效应。

因此,在某一个服务发生故障时,我们要及时对该服务的故障进行隔离,不能让其扩散到整个微服务体系中。因为,为了搭建一个稳定且可靠的微服务系统,我们就需要给系统加上自我保护,出现故障自动隔离的能力。而**Hystrix**就能做到这一点

什么是Hystrix

Hystrix是Netflix开源的一款分布式容错框架,Netflix旗下还有Eureka,Zuul等优秀的分布式开源项目,Spring Cloud也提供了对Netflix中部门项目的支持,成为了SpringCloud下的一些子项目 。

Hystrix的功能:

  • 阻止故障的连锁反应,实现熔断

  • 快速失败,实现优雅降级

  • 提供实时的监控和告警

Hystrix简单实现

public class QueryUserIdCommand extends HystrixCommand<Integer> {private final static Logger logger = LoggerFactory.getLogger(QueryUserIdCommand.class);private UserServiceProvider userServiceProvider;public QueryUserAgeCommand(UserServiceProvider userServiceProvider) {super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("userService")).andCommandKey(HystrixCommandKey.Factory.asKey("queryByUserId")).andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withCircuitBreakerRequestVolumeThreshold(10)//至少有10个请求,熔断器才会开始进行错误率计算.withCircuitBreakerSleepWindowInMilliseconds(5000)//熔断器中断请求,5秒后会进入一个半打开状态,放开部分请求去进行重试.withCircuitBreakerErrorThresholdPercentage(50)//错误率达到50%就开启熔断保护.withExecutionTimeoutEnabled(true)).andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter().withCoreSize(10)));this.userServiceProvider = userServiceProvider;}@Overrideprotected Integer run() {return userServiceProvider.queryByUserId();}@Overrideprotected Integer getFallback() {return -1;}}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值