Hystrix-FailBack

2024-05-30 19:08
文章标签 hystrix failback

本文主要是介绍Hystrix-FailBack,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Hystrix降级技术解析-Fallback
   一、降级
       所谓降级,就是指在在Hystrix执行非核心链路功能失败的情况下,我们如何处理,比如我们返回默认值等。
   如果我们要回退或者降级处理,代码上需要实现HystrixCommand.getFallback()方法或者是HystrixObservableCommand.resumeWithFallback()。


   二、Hystrix的降级回退方式

       1、Fail Fast 快速失败 直接抛异常


       2、Fail Silent 无声失败|返回null,空Map,空List  


       3、Fallback: Static 返回默认值


       4、Fallback: Stubbed 自己组装一个值返回


       5、Fallback: Cache via Network 利用远程缓存
           通过远程缓存的方式。在失败的情况下再发起一次remote请求,不过这次请求的是一个缓存比如redis。
           由于是又发起一起远程调用,所以会重新封装一次Command,这个时候要注意,执行fallback的线程一定要跟主线程区分             开,也就是重新命名一个ThreadPoolKey。

      

通过远程缓存的方式。在失败的情况下再发起一次remote请求,不过这次请求的是一个缓存比如redis。由于是又发起一起远程调用,所以会重新封装一次Command,这个时候要注意,执行fallback的线程一定要跟主线程区分开,也就是重新命名一个ThreadPoolKey。

images/EwmcjkprGy74HKnKNwNyKrFxbic6ZXES.png

       6、Primary + Secondary with Fallback 主次方式回退(主要和次要)

         这个有点类似我们日常开发中需要上线一个新功能,但为了防止新功能上线失败可以回退到老的代码,我们会做一个开关比如使用zookeeper做一个配置开关,可以动态切换到老代码功能。那么Hystrix它是使用通过一个配置来在两个command中进行切换。

images/RypWRKYXpy3rK77fXtNbR2wynesDcDsC.png

public class CommandFacadeWithPrimarySecondary extends HystrixCommand<String> {private final static DynamicBooleanProperty usePrimary = DynamicPropertyFactory.getInstance().getBooleanProperty("primarySecondary.usePrimary", true);private final int id;public CommandFacadeWithPrimarySecondary(int id) {super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("SystemX")).andCommandKey(HystrixCommandKey.Factory.asKey("PrimarySecondaryCommand")).andCommandPropertiesDefaults(// we want to default to semaphore-isolation since this wraps// 2 others commands that are already thread isolated// 采用信号量的隔离方式HystrixCommandProperties.Setter().withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)));this.id = id;}//通过DynamicPropertyFactory来路由到不同的command@Overrideprotected String run() {if (usePrimary.get()) {return new PrimaryCommand(id).execute();} else {return new SecondaryCommand(id).execute();}}@Overrideprotected String getFallback() {return "static-fallback-" + id;}@Overrideprotected String getCacheKey() {return String.valueOf(id);}private static class PrimaryCommand extends HystrixCommand<String> {private final int id;private PrimaryCommand(int id) {super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("SystemX")).andCommandKey(HystrixCommandKey.Factory.asKey("PrimaryCommand")).andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("PrimaryCommand")).andCommandPropertiesDefaults(// we default to a 600ms timeout for primaryHystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(600)));this.id = id;}@Overrideprotected String run() {// perform expensive 'primary' service callreturn "responseFromPrimary-" + id;}}private static class SecondaryCommand extends HystrixCommand<String> {private final int id;private SecondaryCommand(int id) {super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("SystemX")).andCommandKey(HystrixCommandKey.Factory.asKey("SecondaryCommand")).andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("SecondaryCommand")).andCommandPropertiesDefaults(// we default to a 100ms timeout for secondaryHystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(100)));this.id = id;}@Overrideprotected String run() {// perform fast 'secondary' service callreturn "responseFromSecondary-" + id;}}public static class UnitTest {@Testpublic void testPrimary() {HystrixRequestContext context = HystrixRequestContext.initializeContext();try {//将属性"primarySecondary.usePrimary"设置为true,则走PrimaryCommand;设置为false,则走SecondaryCommandConfigurationManager.getConfigInstance().setProperty("primarySecondary.usePrimary", true);assertEquals("responseFromPrimary-20", new CommandFacadeWithPrimarySecondary(20).execute());} finally {context.shutdown();ConfigurationManager.getConfigInstance().clear();}}@Testpublic void testSecondary() {HystrixRequestContext context = HystrixRequestContext.initializeContext();try {//将属性"primarySecondary.usePrimary"设置为true,则走PrimaryCommand;设置为false,则走SecondaryCommandConfigurationManager.getConfigInstance().setProperty("primarySecondary.usePrimary", false);assertEquals("responseFromSecondary-20", new CommandFacadeWithPrimarySecondary(20).execute());} finally {context.shutdown();ConfigurationManager.getConfigInstance().clear();}}}
}

 三、总结
        降级的处理方式,返回默认值,返回缓存里面的值(包括远程缓存比如redis和本地缓存比如jvmcache)。
        但回退的处理方式也有不适合的场景:
        1、写操作
        2、批处理
        3、计算
        以上几种情况如果失败,则程序就要将错误返回给调用者。    

这篇关于Hystrix-FailBack的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1016743

相关文章

Spring Cloud的Ribbon-Hystrix-Feign

Ribbon 作为负载均衡,在客户端实现,服务段可以启动两个端口不同但servername一样的服务 Hystrix作为熔断流量控制,在客户端实现,在方法上注解,当请求出错时可以调用注解中的方法返回 Feign 可以定义请求到其他服务的接口,用于微服务间的调用,不用自己再写http请求,在客户端实现,调用此接口就像远程调用其他服务一样,当请求出错时可以调用接口的实现类来返回 一、客户端负载均

Hystrix熔断降级组件学习

Hystrix熔断降级组件学习 一、Hystrix是什么?二、Hystrix的作用三、Spring Cloud整合Hystrix代码示例3.1. 添加依赖3.2. 启用Hystrix3.3. 定义服务调用 四、熔断器仪表盘4.1. 添加依赖4.2. 启用Hystrix Dashboard4.3. 访问Dashboard(仪表盘) 五、Spring Cloud整合Hystrix原理5.1. 整

springcloud+Hystrix断路器

springcloud+Hystrix断路器 1.Hystrix简介及相关概念 1.1简介 Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等; Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。 1.2相关概念 1.服务雪崩: ​ 一个服务,依赖于另一个功

【SpringCloud】(十二):Fegion的Hystrix支持

Fegion也支持Hystrix。当服务提供者出现异常的时候,使用Hystrix回调方法。   在前面文章中提到的microservice-comsumer-movie-feign的基础上进行修改,主要是有一个回调的方法。 启动类: package com.dynamic.cloud;import org.springframework.boot.Spring

【SpringCloud】(十一):超时机制和断路器及 Hystrix简单实践

上篇文章我们配置了Eureka集群,实现了高可用。在微服务框架中,一个服务消费者可能是其他服务消费者的提供者,而当低层次的服务提供者出现问题时,会导致系统资源被耗尽。出现雪崩效应。 Hystrix是解决解决方案的实践。 消费者服务:microservice-comsumer-movie-ribbon-withhystrix 1.POM.xml中加入依赖 <dep

Spring Cloud(五)断路器监控(Hystrix Dashboard)

在上两篇文章中讲了,服务提供者 Eureka + 服务消费者 Feign,服务提供者 Eureka + 服务消费者(rest + Ribbon),本篇文章结合,上两篇文章中代码进行修改加入 断路器监控(Hystrix Dashboard) 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon

feign配合hystrix使用

1.添加pom文件 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> 2.在启动类上,添加feign注解 @SpringBootApplication@EnableFeign

SpringCloud Hystrix初体验

文章目录 简介实验步骤bookstore应用初始化应用主程序应用配置访问应用 reading应用初始化应用主程序BookService应用配置运行应用 参考资料 简介 Hystrix是SpringCloud Netflix下的一个库,实现了Circuit Breaker(电路熔断器)模式。关于Circuit Breaker模式的原理,可以参考:Circuit Breaker(电

Spring Cloud Hystrix快速入门demo

1.什么是Spring Cloud Hystrix? Spring Cloud Hystrix 是一个用于处理分布式系统中故障的库。它实现了熔断器模式,可以防止由于故障服务的连锁反应而导致整个系统崩溃。Spring Cloud Hystrix 提供了丰富的功能,如熔断、降级、限流、缓存等,可以帮助开发人员更好地处理分布式系统中的故障。 2.原理 在使用 Spring Cloud Hystri

SpringCloud:服务保护——Hystrix

一,Hystrix     SpringCloud体系中,自提供了Hystrix进行服务保护。对客户端访问进行了服务降级,服务隔离以及服务熔断等等处理。 二,环境搭建     Eureka实现基本服务调用环境搭建参考博文:SpringCloud:注册中心——Eureka,本篇博文在基础上进行处理 三,添加Maven坐标依赖 <!-- hystrix断路器 --><dependency><