因为Spring翻车被鄙视?美团大佬公开分享解决方法,网友:我服了
2021-05-30 11:04
标签:出现 没有 内存 etc spring tcl ams 准备就绪 trie 今日分享开始啦,请大家多多指教~ RestTemplate 采用 Java Servlet API,因而是阻塞式同步调用。相反,WebClient 是异步的,等待响应的同时不会阻塞正在执行的线程。只有在响应结果准备就绪时,才会发起通知。 RestTemplate 仍然有用武之地。非阻塞模式在某些场景下比阻塞方法占用系统资源要少得多,这时 WebClient 是一种更好的选择。 非阻塞式客户端。WebClient 使用 Spring Reactive Framework 所提供的异步非阻塞解决方案。 当 RestTemplate 为每个事件(HTTP 请求)创建一个新的线程时,WebClient 将为每个事件创建类似于“任务”。幕后,Reactive 框架将对这些 “任务” 进行排队,并仅在适当的响应可用时执行它们。 Reactive 框架使用事件驱动的体系结构。它提供了通过 Reactive Streams API 组合异步逻辑的方法。因此,与同步/阻塞方法相比,Reactive 可以使用更少的线程和系统资源来处理更多的逻辑。WebClient 是 Spring WebFlux 库的一部分。因此,我们还可以使用流畅的函数式 API 编写客户端代码,并将响应类型(Mono 和 Flux)作为声明来进行组合。 阻塞式客户端。RestTemplate 使用了基于每个请求对应一个线程模型(thread-per-request)的 Java Servlet API。这意味着,直到 Web 客户端收到响应之前,线程都将一直被阻塞下去。而阻塞代码带来的问题则是,每个线程都消耗了一定的内存和 CPU 周期。这些线程将耗尽线程池或占用所有可用内存。由于频繁的 CPU 上下文(线程)切换,我们还会遇到性能下降的问题。 使用@Configuration 提前注入的 RestTemplate 服务端代码 客户端测试代码 服务端代码 客户端测试代码 服务端代码 客户端测试代码 服务端代码 客户端测试代码 服务端代码 客户端测试代码 可以获取到完整的响应信息 服务端代码 客户端测试代码 服务器端代码 客户端测试代码 服务端代码 客户端测试代码 服务端代码 客户端测试代码 服务端代码 客户端测试代码 服务端代码 客户端测试代码 小结 在Web应用中我们需要对其他服务进行HTTP调用。WebClient和RestTemplate是两个由Spring提供的客户端工具。 今日份分享已结束,请大家多多包涵和指点! 因为Spring翻车被鄙视?美团大佬公开分享解决方法,网友:我服了 标签:出现 没有 内存 etc spring tcl ams 准备就绪 trie 原文地址:https://www.cnblogs.com/pfx1995/p/14750762.html一、WebClient
1.依赖
2.创建
@Test
void webclient01Create(){
WebClient webClient = WebClient.create();
Mono
@Test
void webclient02Create(){
WebClient webClient = WebClient.create(BASE_URI);
Mono
@Test
void webclient03Builder(){
WebClient webClient = WebClient.builder()
.baseUrl(BASE_URI)
.build();
Mono
3.使用
@Test
void webclient04(){
WebClient webClient = WebClient.builder()
.baseUrl(BASE_URI)
.build();
Mono
@Test
void webclient05(){
WebClient webClient = WebClient.builder()
.baseUrl(BASE_URI)
.build();
User user = User.builder().id("0000").password("0000").build();
Mono
二、RestTemplate
1.小技巧
2.示例
2.1GET
/*
* 带请求参数的get请求
* @param pageSize
* @param pageNum
* @return String
*/
@GetMapping("/get02")
public String get02(@RequestParam Integer pageSize, @RequestParam Integer pageNum) {
return "get02() ok,请求参数为:" + pageSize + "/" + pageNum;
}
/*
* 带路径参数的get请求
* @param id
* @return String
*/
@GetMapping("/get03/{id}")
public String get03(@PathVariable("id") String id) {
return "get03() ok,路径参数为:" + id;
}
/*
* 带有请求参数和路径参数的get请求
* @param score
* @param id
* @return String
*/
@GetMapping("/get04/{id}")
public String get04(@RequestParam String score, @PathVariable("id") String id) {
return "get04() ok,请求参数为:" + score + ",路径参数为:" + id;
}
/*
* 带请求参数的get请求
* @param pageSize
* @param pageNum
* @return String
*/
@GetMapping("/get02")
public String get02(@RequestParam Integer pageSize, @RequestParam Integer pageNum) {
return "get02() ok,请求参数为:" + pageSize + "/" + pageNum;
}
@Test
void get05(){
Map
/*
* 不带参数的get请求
* @return String
*/
@GetMapping("/get01")
public String get01() {
return "get01() ok";
}
@Test
void get06(){
String uri = BASE_URI + "/test/get01";
ResponseEntity
@Test
void get07(){
String uri = BASE_URI + "/test/get05?pageSize={1}&pageNum={2}";
ResponseEntity
result = restTemplate.getForEntity(uri,List.class,10,1);
log.info("{}", result);
}
@Test
void get08(){
String uri = BASE_URI + "/test/get05?pageSize={1}&pageNum={2}";
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("token", UUID.randomUUID().toString());
ResponseEntity
result = restTemplate.exchange(
uri,
HttpMethod.GET,
new HttpEntity(httpHeaders),
List.class,
10,1
);
log.info("{}",result);
}
2.2 POST
/*
* 只有请求体的POST请求
* @param user
*/
@PostMapping("/post01")
public User post01(@RequestBody User user){
log.info("请求体:{}",user.toString());
return user;
}
/*
* 带有请求体参数、请求参数、路径参数的POST请求
* @param user
* @param status
* @param type
* @return String
*/
@PostMapping("/post02/{type}")
public String post02(@RequestBody User user,
@RequestParam("status") Integer status,
@PathVariable("type") String type) {
return "requestBody:" + user.toString() + ",requestParam:" + status + ",
pathVariable:" + type + "";
}
@Test
void post02() {
String uri = BASE_URI + "/test/post02/++++/?status={1}";
String result = restTemplate.postForObject(
uri,
User.builder().id("***").password("....").build(),
String.class,
0
);
log.info("{}",result);
}
/*
* 带有请求体参数、请求参数、路径参数的POST请求
* @param user
* @param status
* @param type
* @return String
*/
@PostMapping("/post02/{type}")
public String post02(@RequestBody User user,
@RequestParam("status") Integer status,
@PathVariable("type") String type) {
return "requestBody:" + user.toString() + ",requestParam:" + status + ",
pathVariable:" + type + "";
}
@Test
void post03(){
String uri = BASE_URI + "/test/post02/788787/?status={1}";
User user = User.builder().id("6666").password("7777").build();
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity
文章标题:因为Spring翻车被鄙视?美团大佬公开分享解决方法,网友:我服了
文章链接:http://soscw.com/index.php/essay/89538.html