Spring

SpringBoot webClient

개구리는 개꿀개꿀 2022. 2. 9. 16:19

이제 webClient 적용을 피할수 없게 되었다.

 

webFlux, reactor 관련해서 좀더 자세히 공부를 해야겠다.

 

https://happycloud-lee.tistory.com/220

 

Spring WebClient 쉽게 이해하기

1. Spring WebClient 이해 1) WHY ? 우리가 개발하는 어플리케이션들을 크게 2개로 나눠보면 요청자와 제공자라고 할 수 있습니다. 요청자를 consumer 또는 subscriber라고 하고, 제공자를 producer 또는 provider..

happycloud-lee.tistory.com

 

https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-client

 

Web on Reactive Stack

The original web framework included in the Spring Framework, Spring Web MVC, was purpose-built for the Servlet API and Servlet containers. The reactive-stack web framework, Spring WebFlux, was added later in version 5.0. It is fully non-blocking, supports

docs.spring.io

 

WebClient client = WebClient.create(); // DefaultWebClientBuilder

@Override
public WebClient build() {
    ClientHttpConnector connectorToUse =
            (this.connector != null ? this.connector : initConnector());

    ExchangeFunction exchange = (this.exchangeFunction == null ?
            ExchangeFunctions.create(connectorToUse, initExchangeStrategies()) :
            this.exchangeFunction);

    ExchangeFunction filteredExchange = (this.filters != null ? this.filters.stream()
            .reduce(ExchangeFilterFunction::andThen)
            .map(filter -> filter.apply(exchange))
            .orElse(exchange) : exchange);

    HttpHeaders defaultHeaders = copyDefaultHeaders();

    MultiValueMap<String, String> defaultCookies = copyDefaultCookies();

    return new DefaultWebClient(filteredExchange, initUriBuilderFactory(),
            defaultHeaders,
            defaultCookies,
            this.defaultRequest, new DefaultWebClientBuilder(this));
}

DefaultWebClient(ExchangeFunction exchangeFunction, UriBuilderFactory uriBuilderFactory,
			@Nullable HttpHeaders defaultHeaders, @Nullable MultiValueMap<String, String> defaultCookies,
			@Nullable Consumer<RequestHeadersSpec<?>> defaultRequest, DefaultWebClientBuilder builder) {
    this.exchangeFunction = exchangeFunction;
    this.uriBuilderFactory = uriBuilderFactory;
    this.defaultHeaders = defaultHeaders;
    this.defaultCookies = defaultCookies;
    this.defaultRequest = defaultRequest;
    this.builder = builder;
}

https://github.com/reactor/reactor-netty

 

GitHub - reactor/reactor-netty: TCP/HTTP/UDP/QUIC client/server with Reactor over Netty

TCP/HTTP/UDP/QUIC client/server with Reactor over Netty - GitHub - reactor/reactor-netty: TCP/HTTP/UDP/QUIC client/server with Reactor over Netty

github.com

httpClient 구현체가 netty-http로 바뀌었다.

 

//DefaultWebClientBuilder.java
private ClientHttpConnector initConnector() {
   if (reactorClientPresent) {
      return new ReactorClientHttpConnector();
   }
   else if (jettyClientPresent) {
      return new JettyClientHttpConnector();
   }
   else if (httpComponentsClientPresent) {
      return new HttpComponentsClientHttpConnector();
   }
   throw new IllegalStateException("No suitable default ClientHttpConnector found");
}

@Override
public WebClient build() {
    ClientHttpConnector connectorToUse =
            (this.connector != null ? this.connector : initConnector());

    ExchangeFunction exchange = (this.exchangeFunction == null ?
            ExchangeFunctions.create(connectorToUse, initExchangeStrategies()) :
            this.exchangeFunction);

    ExchangeFunction filteredExchange = (this.filters != null ? this.filters.stream()
            .reduce(ExchangeFilterFunction::andThen)
            .map(filter -> filter.apply(exchange))
            .orElse(exchange) : exchange);

    HttpHeaders defaultHeaders = copyDefaultHeaders();

    MultiValueMap<String, String> defaultCookies = copyDefaultCookies();

    return new DefaultWebClient(filteredExchange, initUriBuilderFactory(),
            defaultHeaders,
            defaultCookies,
            this.defaultRequest, new DefaultWebClientBuilder(this));
}

 

httpClient.create()에서 pool을 따로 안 만들어주면 모든 요청이 하나의 이벤트 루프 큐로 들어가는것 주의