Использование динамического URL-адреса для Spring ReactiveFeignClient

Я использую ReactiveFeignClient от Playtika. Мне нужно использовать динамический URL-адрес, особенно для части хоста, потому что я хотите использовать один и тот же интерфейс для нескольких служб, которые имеют одинаковые форматы запросов и ответов, но разные хосты. URL-адреса каждой службы могут иметь разные имя хоста и префикс, но все они имеют один и тот же суффикс. Например:

  • http: // localhost: 3001 / игры / покупка
  • http: // localhost: 3002 / гаджеты / телефон / покупка

На самом деле я не знаю, ведет ли он то же самое, что и нереактивный симулирующий клиент. Я следую предложению Как я могу изменить фиктивный URL во время выполнения?.

Вот клиентский интерфейс.

@ReactiveFeignClient(
    name = "dummy",
    configuration = TransactionClient.Configuration.class
)
public interface TransactionClient {

//  @PostMapping("/purchase") // Using @PostMapping and @RequestLine both don't work
  @RequestLine("POST /purchase")
  Mono<PurchaseResponseDto> doPurchase(
      URI baseUrl,
      @Valid @RequestBody PurchaseRequestDto requestDTO
  );

  @RequiredArgsConstructor
  class Configuration {

    @Bean
    public ReactiveStatusHandler reactiveStatusHandler() {
      return new CustomStatusHandler();
    }
  }
}

А вот и автоконфигурация

@Configuration
public class TransactionClientServiceAutoConfiguration {

  @Bean
  public Contract useFeignAnnotations() {
    return new Contract.Default();
  }

  @Bean
  @LoadBalanced
  public TransactionClient botRemoteClient() {
    return Feign.builder().target(Target.EmptyTarget.create(TransactionClient.class));
  }
}

Однако я получил ошибку, указывающую, что нет службы с фиктивным именем. На самом деле это просто фиктивное имя, потому что параметр имени требуется для аннотации @ReactiveFeignClient, и я хочу использовать интерфейс для нескольких служб.

Как сделать возможным динамический URL-адрес для @ReactiveFeignClient


person CherryBelle    schedule 11.12.2020    source источник


Ответы (1)


В реактивном симуляторе github я нашел этот фрагмент:

IcecreamServiceApi client = 
         WebReactiveFeign  //WebClient based reactive feign  
        .<IcecreamServiceApi>builder()
        .target(IcecreamServiceApi.class, "http://www.myUrl.com")

Вы можете изменить URL-адрес, создав новый экземпляр клиента. Другого пути не нашел. Кроме того, я добавил и @PostMapping, и @RequestLine (POST) в интерфейс симуляции, так как я не мог заставить работать опцию контрактов. Поделитесь этим для потомков или пока не появится лучшая версия.

person Artabaz    schedule 19.06.2021