Hystrix后备方法最佳做法

时间:2019-09-25 12:24:20

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

好吧,所以我找不到关于该主题的任何有用的材料,我发现很多文章都提供了一种方法,该方法使用@HystrixCommand进行了注释,并定义了一个后备方法。

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

不幸的是,在我的服务中,我有许多签名完全不同的方法,而且我还需要掌握throwable(在docs中提到,默认回退方法没有任何参数)。方法看起来像这样:

@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种以上的方法...

我真正要避免的事情是制作20种hystrix默认后备方法。

是否有一种方法可以定义所有方法的标准后备方法,无论它们具有什么签名,还是我坚持为每个方法定义一个后备方法?

提前谢谢!

2 个答案:

答案 0 :(得分:1)

您将必须为每种方法实现一个后备。

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

如果每种方法的hystrix后备相同,也许您并不是真的想要它们。所有尝试捕获都可以解决相同的问题。

答案 1 :(得分:1)

让我分享我的项目中使用的代码段。

要调用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,您都可以定义自己的请求和响应,然后feign会进行请求,编码和解码。

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