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>
若需要獲取所有User,則需要將這個集合包裝成Flux<User>.這里的單個資料并不是指的是一個資料,而是指一個封裝好的物件,多個資料就是多個物件,
開發WebFLux的流程
1.注解式開發流程
WebFLux是回應式框架,地址映射也是通過@RequestMapping提供的,用@Controller和@RestController來代替Handler類,
2.回應式開發流程
1.創建handler類
這里的handler類相當于SpringMVC的Controller層中的方法體,在回應式編程中,請求和相應不再是HttpServletRequest和HttpServletResponse,而是變成了ServerRequest和ServerResponse,
2.配置RouterFunction
RouterFunction和注解@RequestMapping類似,都用于提供URL路徑,
實體:用注解式開發實作資料的增加,洗掉,修改和查詢
首先創建物體類
package com.example.demo.webFlux.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class User { private long id; private String name; private int age; }
然后撰寫控制器,實作WebFlux操作資料功能,
package com.example.demo.controller; import com.example.demo.webFlux.entity.User; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import javax.annotation.PostConstruct; import javax.jws.soap.SOAPBinding; import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; @RestController @RequestMapping(path = "/user") public class UserController { Map<Long, User> users = new HashMap<>(); @PostConstruct public void init() throws Exception{ users.put(Long.valueOf(1),new User(1,"Curry",34)); users.put(Long.valueOf(2),new User(2,"Iverson",44)); } /* * 獲取所有用戶 * */ @GetMapping("/list") public Flux<User> getAll(){ return Flux.fromIterable(users.entrySet().stream().map(entry->entry.getValue()).collect(Collectors.toList())); } /* * 獲取單個用戶 * */ @GetMapping("/{id}") public Mono<User> getUser(@PathVariable Long id){ return Mono.justOrEmpty(users.get(id)); } /* * 創建用戶 * */ @PostMapping("") public Mono<ResponseEntity<String>> addUser(User user){ users.put(user.getId(),user); return Mono.just(new ResponseEntity<>("添加成功", HttpStatus.CREATED)); } /* * 修改用戶 * */ @PutMapping("/{id}") public Mono<ResponseEntity<User>> putUser(@PathVariable Long id,User user){ user.setId(id); users.put(id,user); return Mono.just(new ResponseEntity<>(user,HttpStatus.CREATED)); } /* * 洗掉用戶 * */ @DeleteMapping("/{id}") public Mono<ResponseEntity<String>> deleteUser(@PathVariable Long id){ users.remove(id); return Mono.just(new ResponseEntity<>("洗掉成功",HttpStatus.ACCEPTED)); } }
最后,啟動專案,看結果

下面,來通過postman來增添一份資料,


通過put請求可以修改資料


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/511019.html
標籤:其他
上一篇:離職了,要優雅地離開!
下一篇:實踐GoF的設計模式:訪問者模式
