1

我正在使用来自 Playtika 的 ReactiveFeignClient 我需要使用动态 URL,尤其是对于主机部分,因为我想对具有相同请求和响应格式但主机不同的多个服务使用相同的接口。每个服务上的 URL 可以有不同的主机名和前缀,但都具有相同的后缀。例如:

  • http://localhost:3001/games/purchase
  • http://localhost:3002/gadgets/phone/purchase

实际上我不知道它是否具有与非反应式 feign 客户端相同的行为。我遵循关于如何在运行时更改假冒 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));
  }
}

但是,我收到错误消息,表明没有名称为 dummy 的服务。这确实只是一个虚拟名称,因为 @ReactiveFeignClient 注释需要 name 参数,我想将该接口用于多个服务。

如何使@ReactiveFeignClient 的动态网址成为可能

4

1 回答 1

1

从响应式 feign github 我发现了这个片段:

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

您可以通过创建客户端的新实例来更改 url。没找到其他办法。此外,我将 @PostMapping 和 @RequestLine("POST") 添加到 feign 接口,因为我无法让合同选项起作用。分享这个以供后代或直到出现更好的版本。

于 2021-06-19T13:34:08.113 回答