Feign调用Hystrix熔断降级

Feign默认已经整合了Hystrix。

一、使用如何使用

单纯服务降级

  • 加配置,默认Feign是不启用Hystrix的,需要添加配置启用Hystrix,这样所有的Feign Client都会受到Hystrix保护!

    feign:
      hystrix:
        enabled: true
    
  • 提供Fallback:

    @FeignClient(name = "student-server", fallback = StudentFeignClientFallback.class)
    public interface StudentFeignClient {
      @GetMapping("/student/{id}")
      User findById(@PathVariable("id") Long id);
    }
    
    @Component
    class StudentFeignClientFallback implements StudentFeignClient {
      @Override
      public User findById(Long id) {
        return new User(id, "小i", "大家好,我是聪明的小i", 8);
      }
    }
    

获得造成fallback的原因

@FeignClient(name = "student-server", fallbackFactory = StudentFeignClientFallbackFactory.class)
public interface StudentFeignClient {
  @GetMapping("/student/{id}")
  User findById(@PathVariable("id") Long id);
}

@Component
@Slf4j
class UserFeignClientFallbackFactory implements FallbackFactory<UserFeignClient> {
  @Override
  public StudentFeignClient create(Throwable throwable) {
    return new UserFeignClient() {
      @Override
      public User findById(Long id) {
        log.error("进入回退逻辑", throwable);
        return new User(id, "小i", "大家好,我是聪明的小i", 8);
      }
    };
  }
}

通过工厂类获取Fallback的原因(推荐)

@Component
public class StudentFeignFallBackFactory implements FallbackFactory<StudentFeignClient> {
    @Override
    public StudentFeignClient create(Throwable throwable) {
        StudentFeignClientFallback studentFeign = new StudentFeignClientFallback();
        studentFeign.setCause(throwable);
        return studentFeign;
    }
}

二、开关配置

Feign启用/禁用Hystrix

1. 全局启用
feign.hystrix.enabled: true
2. 全局禁用(默认)
feign.hystrix.enabled: false

局部启用/禁用Hystrix

在@FeignClient的configuration中配置启用/禁用的配置类。

@FeignClient(name = "student-server", configuration = FeignDisableHystrixConfiguration.class)
public interface StudentFeignClient {
  @GetMapping("/student/{id}")
  User findById(@PathVariable("id") Long id);
}
1. 局部启用

利用Feign配置的自定义,为指定Feign Client指定如下配置类即可。

public class FeignDisableHystrixConfiguration {
  @Bean
    @Scope("prototype")
    public HystrixFeign.Builder feignBuilder() {
        return HystrixFeign.builder();
    }
}
2. 局部禁用
public class FeignDisableHystrixConfiguration {
  @Bean
    @Scope("prototype")
    public Feign.Builder feignBuilder() {
        return Feign.builder();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。