ToB企服应用市场:ToB评测及商务社交产业平台

标题: SpringBoot实战派读书笔记---响应式编程 [打印本页]

作者: 怀念夏天    时间: 2022-10-8 14:55
标题: SpringBoot实战派读书笔记---响应式编程
1.什么是WebFlux?
  WebFlux不需要Servlet API,在完全异步且无阻塞,并通过Reactor项目实现了Reactor Streams规范。
  WebFlux可以在资源有限的情况下提高系统的吞吐量和伸缩性。
  WebFlux除支持Restful Web服务外,还可以用于提供动态HTML内容。
2.比较MVC和WebFlux
  SpringMVC采用命令式编程的方式,代码被一句一句的执行,便于开发者理解与调试代码,WebFlux则是基于异步响应式编程!
  1.工作方式
  MVC
  MVC的工作流程是:主线程接收到请求(request)-> 准备数据 ->返回数据。
  整个过程是单线程阻塞的,用户会感觉等待时间长是因为,在结果处理好之后才会返回结果给浏览器。。因此,如果请求过多,则吞吐量会上不去。
  WebFlux
  工作流程:主线程接收到请求 -> 立刻返回数据与函数的组合 -> 开启一个新的work线程去做实际的数据准备工作,进行真正的业务操作 -> work线程完成工作 -> 返回用户真实数据(结果)
  这种方式给人的感觉是响应时间很短,因为返回的是不变的常数,它不随用户数量的增加而变化!不支持MySql等关系型数据库。
3/认识Mono和Flux
  Mono和Flux属于事件发布者,为消费者提供订阅接口。当有事件发生时,Mono和Flux会回调消费者的相应方法,然后通知消费者相应的事件。
  Mono和Flux用于处理异步数据流,它不像MVC中那样直接返回String/list,而是将异步数据流包装Mono和Flux对象。
  Mono和Flux的区别
  Mono主要用于返回单个数据,Flux主要用于返回多个数据。
  举例:如果要根据id查询某个User对象,则返回的肯定是单个User,那么需要将其包装成Mono
  若需要获取所有User,则需要将这个集合包装成Flux.这里的单个数据并不是指的是一个数据,而是指一个封装好的对象。多个数据就是多个对象。
开发WebFLux的流程
  1.注解式开发流程
  WebFLux是响应式框架。地址映射也是通过@RequestMapping提供的,用@Controller和@RestController来代替Handler类。
  2.响应式开发流程
  1.创建handler类
  这里的handler类相当于SpringMVC的Controller层中的方法体。在响应式编程中,请求和相应不再是HttpServletRequest和HttpServletResponse,而是变成了ServerRequest和ServerResponse。
  2.配置RouterFunction
  RouterFunction和注解@RequestMapping类似,都用于提供URL路径。
实例:用注解式开发实现数据的增加,删除,修改和查询
  首先创建实体类
  1. package com.example.demo.webFlux.entity;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. @Data
  6. @AllArgsConstructor
  7. @NoArgsConstructor
  8. public class User {
  9.     private long id;
  10.     private String name;
  11.     private int age;
  12. }
复制代码
  然后编写控制器,实现WebFlux操作数据功能,
  
  1. package com.example.demo.controller;
  2. import com.example.demo.webFlux.entity.User;
  3. import org.springframework.http.HttpStatus;
  4. import org.springframework.http.ResponseEntity;
  5. import org.springframework.web.bind.annotation.*;
  6. import reactor.core.publisher.Flux;
  7. import reactor.core.publisher.Mono;
  8. import javax.annotation.PostConstruct;
  9. import javax.jws.soap.SOAPBinding;
  10. import java.util.HashMap;
  11. import java.util.Map;
  12. import java.util.stream.Collectors;
  13. @RestController
  14. @RequestMapping(path = "/user")
  15. public class UserController {
  16.     Map<Long, User> users = new HashMap<>();
  17.     @PostConstruct
  18.     public void init() throws Exception{
  19.         users.put(Long.valueOf(1),new User(1,"Curry",34));
  20.         users.put(Long.valueOf(2),new User(2,"Iverson",44));
  21.     }
  22.     /*
  23.     * 获取所有用户
  24.     * */
  25.     @GetMapping("/list")
  26.     public Flux<User> getAll(){
  27.         return Flux.fromIterable(users.entrySet().stream().map(entry->entry.getValue()).collect(Collectors.toList()));
  28.     }
  29.     /*
  30.     * 获取单个用户
  31.     * */
  32.     @GetMapping("/{id}")
  33.     public Mono<User> getUser(@PathVariable Long id){
  34.         return Mono.justOrEmpty(users.get(id));
  35.     }
  36.     /*
  37.     * 创建用户
  38.     * */
  39.     @PostMapping("")
  40.     public Mono<ResponseEntity<String>> addUser(User user){
  41.         users.put(user.getId(),user);
  42.         return Mono.just(new ResponseEntity<>("添加成功", HttpStatus.CREATED));
  43.     }
  44.     /*
  45.     * 修改用户
  46.     * */
  47.     @PutMapping("/{id}")
  48.     public Mono<ResponseEntity<User>> putUser(@PathVariable Long id,User user){
  49.         user.setId(id);
  50.         users.put(id,user);
  51.         return Mono.just(new ResponseEntity<>(user,HttpStatus.CREATED));
  52.     }
  53.     /*
  54.     * 删除用户
  55.     * */
  56.     @DeleteMapping("/{id}")
  57.     public Mono<ResponseEntity<String>> deleteUser(@PathVariable Long id){
  58.         users.remove(id);
  59.         return Mono.just(new ResponseEntity<>("删除成功",HttpStatus.ACCEPTED));
  60.     }
  61. }
复制代码
  最后,启动项目,看结果
  
 
 下面,来通过postman来增添一份数据,

 

 
 
通过put请求可以修改数据

 
 
 
 
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4