Лучшая практика Hystrix резервный метод - PullRequest
1 голос
/ 25 сентября 2019

Хорошо, поэтому я не смог найти никаких полезных материалов по этой теме, большая часть статей, которые я нашел, содержала один метод, который был аннотирован @HystrixCommand и определил запасной метод.

Другое решение, которое я нашел, было использование @DefaultProperties (defaultFallback = "fallbackMethod"), но проблема в том, что методы должны иметь совместимые типы возврата.

К сожалению, для меня в моем сервисеУ меня есть много методов с совершенно разными сигнатурами, а также мне нужно заполучить throwable (в документации упоминается, что вы не можете иметь никаких параметров для резервного метода по умолчанию).Методы выглядят примерно так:

@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 по умолчаниюметодов.

Есть ли способ, которым я мог бы определить стандартный запасной вариант для всех методов, независимо от того, какие сигнатуры у них есть, или я застрял с определением запасного метода для каждого отдельного метода?

Спасибо заранее !!

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Позвольте мне поделиться фрагментом кода, использованным в моем проекте.

Чтобы вызвать API, например, http://www.baidu.com/xxx,, у вас есть следующие шаги.

1. Определение определения (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 выполнит запрос 、 кодирует 、 и декодирует.

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

1 голос
/ 25 сентября 2019

Вам нужно будет выполнить откат для каждого метода.

Однако использование FallbackFactory может упростить это и позволить каждому методу вызывать один метод многократного использования.

Возможно, вы недействительно не нужны запасные варианты Hystrix, если они одинаковы для каждого метода.Все попытки поймать могут решить ту же проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...