【问题标题】:Disable Hystrix for a single Feign client为单个 Feign 客户端禁用 Hystrix
【发布时间】:2020-10-21 10:43:32
【问题描述】:

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

现在,我想为尚未定义回退的那些禁用 Hystrix。所以我按照[第 7.4 段]https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html 中列出的步骤,使用普通 Feign.Builder 创建一个单独的 Feign 配置。但是,添加新的 @Bean Feign.Builder 会在我不想要的所有 Feign 客户端上禁用我的 Hystrix 功能。如果我删除 @Bean Feign.Builder,Hystrix 后备会像往常一样在 myhystrixclient 中启动。 How to disable hystrix in one of multiple feign clients 这里的一个类似的 SO 问题仍然存在。我做错了什么?

public class MyFeignClientConfiguration {

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

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

我的 Feign 客户端如下所示:

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

我的 Hystrix Feign 配置如下所示:

public class MyFeignClientHystrixConfiguration {

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

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

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

更新

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

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

/** Start the app **/
}

【问题讨论】:

  • 我在这里的帖子中也专门提到了这个问题。那里建议的解决方案对我不起作用。
  • 您的 MyFeignClientConfiguration 是否使用 @Configuration 注解?
  • @stacker 我没有。我的两个配置类都没有注释。我已经用我的 Spring Boot 配置更新了这个问题,以防万一。
  • @VinodKumarRai 添加你的 pom 文件

标签: java spring-boot hystrix spring-cloud-feign


【解决方案1】:

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

创建没有 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();
   }

}

使用 excludeFilters 从 @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);
   }

}

启用 hystrix

feign:
  hystrix:
    enabled: true

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

【讨论】:

  • 这对我不起作用。行为与以前相同,如果我引入 Feign.Builder bean,我的 Hystrix 回退根本不起作用。官方文档中也不建议添加@Configuration,如下所示cloud.spring.io/spring-cloud-netflix/multi/…
  • 我已经更新了我的答案@VinodKumarRai 看看
【解决方案2】:

请试试这个配置:

import feign.Feign;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
public class MyFeignClientConfiguration {

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

还有:

import feign.hystrix.HystrixFeign;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
public class MyFeignClientHystrixConfiguration {  

  @Bean
  @Scope("prototype")
  public HystrixFeign.Builder feignBuilder() {
    return HystrixFeign.builder();
  }
}

【讨论】:

    【解决方案3】:

    feign-hystrix 是 spring-cloud-starter-openfeign 的一部分,版本低于 3.0.0。

    从 3.0.0 开始,不再包含 feign-hystrix

    【讨论】:

      猜你喜欢
      • 2019-04-21
      • 2019-09-05
      • 2015-12-05
      • 2016-05-17
      • 2021-09-27
      • 2019-08-07
      • 2020-11-27
      • 2020-09-23
      • 2019-11-04
      相关资源
      最近更新 更多