好吧,我找不到关于这个主题的任何有用的材料,我发现一大堆文章有一种用
@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 默认后备方法。
有没有一种方法可以为所有方法定义标准后备方法,无论它们具有什么签名,还是我坚持为每个方法定义一个后备方法?
提前致谢!
您必须为每个方法实施回退。
但是,使用
FallbackFactory
可能会使这变得更容易,并允许每个方法调用一个可重用的方法。
如果每种方法的 hystrix 回退都相同,也许您并不真正想要 hystrix 回退。所有的 try catch 都可能解决同样的问题。
让我分享一下我的项目中使用的代码片段。
要调用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