Hystrix 回退方法最佳实践

问题描述 投票:0回答:2

好吧,我找不到关于这个主题的任何有用的材料,我发现一大堆文章有一种用

@HystrixCommand
注释的方法,并定义了 fallback 方法

我发现的另一个解决方案是使用

@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 个方法。

我真正想避免的是制作 20 个 Hystrix 默认后备方法。

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

提前致谢!

java spring-boot spring-cloud hystrix fallback
2个回答
1
投票

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

但是,使用

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

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


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.后备定义

@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 会做请求、编码、解码。

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

© www.soinside.com 2019 - 2024. All rights reserved.