【问题标题】:Hystrix fallback method best practiceHystrix 回退方法最佳实践
【发布时间】:2020-01-25 15:23:34
【问题描述】:

好吧,所以我找不到关于这个主题的任何有用的材料,我发现的大部分文章都有一个用 @HystrixCommand 注释的方法并定义了一个备用方法。

我找到的另一个解决方案是使用 @DefaultProperties(defaultFallback = "fallbackMethod") 但问题是方法需要具有兼容的返回类型。

不幸的是,在我的服务中,我有许多具有完全不同签名的方法,而且我需要掌握可投掷(在文档中提到您不能为默认后备方法提供任何参数)。这些方法看起来像这样:

@Service
@RequiredArgsConstructor
public class MyService {

  private final FeignClient feignClient;

  @Override
  public String methodA(final CustomObjectA o, final String entity) {
    ...
  }


  @Override
  public String methodB(final String collection, final Map<String, Object> requestBody) {
    ...
  }

  @Override
  public String methodC(final String collection, final String id, final Map<String, Object> requestBody) {
    ...
  }
}

而且我在服务中有超过 3 种方法 def...

我真正想避免的是使用 20 种 hystrix 默认回退方法。

有没有一种方法可以为所有方法定义标准回退,无论它们有什么签名,还是我坚持为每个方法定义一个回退方法?

提前致谢!!

【问题讨论】:

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


    【解决方案1】:

    您必须为每个方法实现一个回退。

    但是使用FallbackFactory 可能会使这更容易,并允许每个方法调用一个可重用的方法。

    如果每种方法的 hystrix 回退都相同,您可能并不真正想要 hystrix 回退。所有的 try catch 都可能解决同样的问题。

    【讨论】:

      【解决方案2】:

      让我分享一下我项目中使用的代码sn-p。

      要调用像 http://www.baidu.com/xxx 这样的 api,您需要遵循以下步骤。

      1.Api定义(fallback = WebServiceApiFallback.class)

      @Component
      @FeignClient(value = "webServiceApi", configuration = FeignConfiguration.class, fallback = WebServiceApiFallback.class)
      public interface WebServiceApi {
      
        @Headers(value = {"Content-Type: application/json", "Accept-Encoding: gzip,deflate"})
        @GetMapping(value = "/xxx")
        BaseResponse<YourResponse> xxx(YourRequest request);
      

      2.Fallback定义

      @Component
      public class WebServiceApiFallback implements WebServiceApi {
      
        @Override
        public BaseResponse<YourResponse> xxx(YourRequest request) {
          // Your Fallback Code here, when api request failed.
        }
      

      3.api主机配置,可能是application.properties...

      webServiceApi.ribbon.listOfServers=http://www.baidu.com
      

      4.使用它

        @Autowired
        private WebServiceApi webServiceApi;
      

      对于任何api,你都可以定义自己的request和response,feign会做request、encode、decode。

      [参考]https://github.com/spring-cloud/spring-cloud-netflix/issues/762

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-22
        • 2012-07-11
        • 2019-08-04
        • 1970-01-01
        • 2017-05-03
        • 2019-11-08
        • 1970-01-01
        • 2012-10-09
        相关资源
        最近更新 更多