为单个 Feign 客户端禁用 Hystrix

Vin*_*Rai 6 java spring-boot hystrix spring-cloud-feign

我的 SpringBoot 应用程序启用了 Hystrix,并为某些 Feign 客户端定义了回退,其余客户端未定义。

现在,我想为尚未定义回退的那些禁用 Hystrix。因此,我按照 [第 7.4 段] https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html 中列出的步骤操作,即使用 vanilla Feign.Builder 创建单独的 Feign 配置. 但是,添加新的 @Bean Feign.Builder 会禁用我不想要的所有 Feign 客户端的 Hystrix 功能。如果我删除@Bean Feign.Builder,Hystrix 回退会像往常一样在 myhystrixclient 中启动。一个类似的问题在这里如何在多个假客户端之一中禁用 hystrix仍然是开放的。我究竟做错了什么?

public class MyFeignClientConfiguration {

@Bean
public FeignErrorDecoder feignErrorDecoder() {
    return new FeignErrorDecoder();
}

@Bean
@Scope("prototype")
public Feign.Builder feignBuilder() {
    return Feign.builder();
}
}
Run Code Online (Sandbox Code Playgroud)

我的 Feign 客户端如下所示:

@FeignClient(name = "myregularclient", configuration = MyFeignClientConfiguration.class)
public interface MyRegularClient {
//my APIs here
}
Run Code Online (Sandbox Code Playgroud)

我的 Hystrix Feign 配置如下所示:

public class MyFeignClientHystrixConfiguration {

@Bean
public FeignErrorDecoder feignErrorDecoder() {
    return new FeignErrorDecoder();
}
}
Run Code Online (Sandbox Code Playgroud)

这是我的 Feign 客户端,其中实施了 Hystrix 回退

@FeignClient(name = "myhystrixclient", configuration = MyFeignClientHystrixConfiguration.class, fallback = MyFallbackService.class)
public interface MyHystrixClient {
//my APIs here
}
Run Code Online (Sandbox Code Playgroud)

更新

添加我的 Application.java 以进一步审查组件扫描方面。

@ComponentScan(basePackages ="com.demo.xyz")
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, 
MetricFilterAutoConfiguration.class,         
MetricRepositoryAutoConfiguration.class})
@EnableDiscoveryClient
@EnableFeignClients
@EnableCircuitBreaker
public class MyApplication {

/** Start the app **/
}
Run Code Online (Sandbox Code Playgroud)

Con*_*rad 2

我设法在 Spring Cloud vDalston.SR5 上重现问题,似乎我找到了解决方案。它不会阻止其他使用 hystrix 的假客户端。手动测试并通过集成测试进行测试。

创建没有 hystrix 的 feign 客户端。请注意,配置类使用@Configuration 注解进行注解。

@FeignClient(name = "withoutHystrix",
      url = "conrad.fake",
      fallback = FeignClientWithoutHystrix.FallbackThatShouldNotOccur.class,
      configuration = FeignClientWithoutHystrixConfig.class)
public interface FeignClientWithoutHystrix {

   @RequestMapping(method = RequestMethod.GET, value = "/fake/url")
   String getFromFakeUrl();

   @Component
   class FallbackThatShouldNotOccur implements FeignClientWithoutHystrix {

      private final Logger log = LoggerFactory.getLogger(this.getClass());

      @Override
      public String getFromFakeUrl() {
         log.error("This fallback shouldn't occur");
         return "Fallback";
      }
   }
}

@Configuration
public class FeignClientWithoutHystrixConfig {

   @Bean
   public Feign.Builder feignBuilder() {
      return Feign.builder();
   }

}
Run Code Online (Sandbox Code Playgroud)

使用 exceptFilters 从 @ComponentScan 中排除 feign 客户端配置:

@EnableFeignClients
@SpringBootApplication
@ComponentScan(basePackages = "konrad",
      excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = FeignClientWithoutHystrixConfig.class)})
public class CloudClient {

   public static void main(String[] args) {
      SpringApplication.run(CloudClient.class, args);
   }

}
Run Code Online (Sandbox Code Playgroud)

启用hystrix

feign:
  hystrix:
    enabled: true
Run Code Online (Sandbox Code Playgroud)

如果您想检查任何内容或运行测试,这是我的存储库https://github.com/MrJavaNoHome/spring-cloud-client