Разумно ли снова и снова создавать Webclient в Webflux, поскольку мой базовый URI не фиксирован?

В моем микросервисе мне нужно извлекать данные из разных мест. Некоторые URL-адреса являются фиксированными, а некоторые - нет. Так что мне нужно снова и снова создавать Webclient, если мой базовый URL изменится. Если нет, то следующий способ создания веб-клиента является правильным. WebClient.create (); а позже меняю URI снова и снова, когда я звоню. Насколько я понимаю, создание WebClient должно быть сложной операцией.

ReactorClientHttpConnector connector = new ReactorClientHttpConnector(
                options -> options.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, requestTimeout).compression(true)
                        .afterNettyContextInit(ctx ->  ctx.addHandlerLast(new ReadTimeoutHandler(readTimeout, TimeUnit.MILLISECONDS))));
        return WebClient.builder()
                        .clientConnector(connector)
                        .baseUrl(hostURL)
                        .build();

person naval jain    schedule 19.12.2018    source источник
comment
Есть ответ stackoverflow.com/a/49107545/10264430   -  person Alexander Pankin    schedule 19.12.2018
comment
спасибо @AlexanderPankin Но нашел его, разместив здесь :)   -  person naval jain    schedule 19.12.2018
comment
Возможный дубликат Правильный способ использования Spring WebClient в мульти- среда потока   -  person Brian Clozel    schedule 19.12.2018
comment
@BrianClozel Моя проблема немного другая. Мой базовый URI будет меняться большую часть времени, и в этом случае предоставленное объяснение будет действовать.   -  person naval jain    schedule 19.12.2018
comment
Я создаю ReactorClientHttpConnector для каждого запроса. и передав его в WebClient.create (). clientConnector (ReactorClientHttpConnector) .baseURL (новый URL) .build ()   -  person naval jain    schedule 19.12.2018


Ответы (1)


WebClient экземпляры предназначены для многократного использования. Единственная причина, по которой вам понадобятся разные экземпляры клиентов, - это конкретные потребности: инструментарий для наблюдения, определенные фильтры клиента аутентификации, определенные тайм-ауты соединения / чтения / записи.

Разные базовые URI не являются веской причиной для создания разных экземпляров. Совершенно нормально создать экземпляр и не устанавливать базовый URI, это просто удобство, позволяющее избежать дублирования при многократном вызове одного и того же хоста.

Это прекрасно:

WebClient webClient = WebClient.builder().build();

Mono<Resource> resource = webClient.get().uri("http://example.org/resource").retrieve()...;
Mono<Project> project = webClient.get().uri("http://spring.io/projects/spring-boot").retrieve()...;

Обратите внимание: если вы используете Spring Boot, вам следует подумать о создании экземпляра веб-клиента с использованием предоставленного WebClient.Builder (см. справочная документация по Spring Boot).

person Brian Clozel    schedule 19.12.2018
comment
Итак, единственное, что нужно иметь в виду, если я беру под контроль HTttpConnector, мне нужно использовать один и тот же экземпляр во всем приложении. - person naval jain; 20.12.2018
comment
Вы можете установить его в конструкторе веб-клиентов, как в вашем примере. - person Brian Clozel; 20.12.2018