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
?????——
????~ ???????????????PDF?
?
?????????002?????~
?
????????PDF?????????