Spring WebClient vs. RestTemplate

  • 2019 年 10 月 3 日
  • 笔记

1. ??

?????????? Spring ??? Web ????? —— RestTemplate ? Spring 5 ???? Reactive ???? WebClient?

2. ??? vs ???????

Web ??????????? HTTP ????????????????????? Web ??????

2.1. RestTemplate ??????

?????????Spring ???? RestTemplate ?? Web ??????????RestTemplate ??????????????????thread-per-request?? Java Servlet API?

??????? Web ????????????????????????????????????????????????? CPU ???

?????????????????????????????????

?????????????????????????????????????????????????????? CPU ????????????????????????

2.2. WebClient ???????

?????WebClient ?? Spring Reactive Framework ??????????????

? RestTemplate ??????HTTP ????????? ?? ??WebClient ???????????“??”???????Reactive ?????? “??” ?????????????????????

Reactive ???????????????????? Reactive Streams API ????????????????/???????Reactive ???????????????????????

WebClient ? Spring WebFlux ?????????????????????? API ???????????????Mono ? Flux???????????

3. ????

?????????????????????????????????????????????????????????????????

?????????????????/????????????????

????????????? REST ??????? RestTemplate?????? WebClient???????????????? REST Web ?????????? Tweet List?

????????? Spring Boot WebFlux starter ???

<dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-webflux</artifactId>  </dependency>

???????????? REST ???

@GetMapping("/slow-service-tweets")  private List<Tweet> getAllTweets() {      Thread.sleep(2000L); // delay      return Arrays.asList(        new Tweet("RestTemplate rules", "@user1"),        new Tweet("WebClient is better", "@user2"),        new Tweet("OK, both are useful", "@user1"));  }

3.1. ?? RestTemplate ?????

???????????? REST ??????? Web ????????????

???????? RestTemplate?

@GetMapping("/tweets-blocking")  public List<Tweet> getTweetsBlocking() {      log.info("Starting BLOCKING Controller!");      final String uri = getSlowServiceUri();        RestTemplate restTemplate = new RestTemplate();      ResponseEntity<List<Tweet>> response = restTemplate.exchange(        uri, HttpMethod.GET, null,        new ParameterizedTypeReference<List<Tweet>>(){});        List<Tweet> result = response.getBody();      result.forEach(tweet -> log.info(tweet.toString()));      log.info("Exiting BLOCKING Controller!");      return result;  }

????????????? RestTemplate ???????????????????????????????????????????????????????????

Starting BLOCKING Controller!  Tweet(text=RestTemplate rules, username=@user1)  Tweet(text=WebClient is better, username=@user2)  Tweet(text=OK, both are useful, username=@user1)  Exiting BLOCKING Controller!

3.2. ?? WebClient ?????

???????? WebClient ???????

@GetMapping(value = "/tweets-non-blocking",              produces = MediaType.TEXT_EVENT_STREAM_VALUE)  public Flux<Tweet> getTweetsNonBlocking() {      log.info("Starting NON-BLOCKING Controller!");      Flux<Tweet> tweetFlux = WebClient.create()        .get()        .uri(getSlowServiceUri())        .retrieve()        .bodyToFlux(Tweet.class);        tweetFlux.subscribe(tweet -> log.info(tweet.toString()));      log.info("Exiting NON-BLOCKING Controller!");      return tweetFlux;  }

????WebClient ???? Flux ???????????????????????????????? tweets?????? /tweets-non-blocking ????????????? Web ??????????? Flux ???

????????????

Starting NON-BLOCKING Controller!  Exiting NON-BLOCKING Controller!  Tweet(text=RestTemplate rules, username=@user1)  Tweet(text=WebClient is better, username=@user2)  Tweet(text=OK, both are useful, username=@user1)

?????????????????????

4. ??

?????????? Spring ??? Web ???????????

RestTemplate ?? Java Servlet API??????????????WebClient ?????????????????????????????????????????

RestTemplate ??????????????????????????????????????????????????WebClient ??????????

??????????????? GitHub ????

???https://www.baeldung.com/spring-webclient-resttemplate

???Drazen Nikolic

?????——

????~ ???????????????PDF?
?
?????????002?????~
?
????????PDF?????????

img