免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

SpringBoot實(shí)戰(zhàn)派讀書(shū)筆記---響應(yīng)式編程

1.什么是WebFlux?
WebFlux不需要Servlet API,在完全異步且無(wú)阻塞,并通過(guò)Reactor項(xiàng)目實(shí)現(xiàn)了Reactor Streams規(guī)范 。
WebFlux可以在資源有限的情況下提高系統(tǒng)的吞吐量和伸縮性 。
WebFlux除支持Restful Web服務(wù)外,還可以用于提供動(dòng)態(tài)HTML內(nèi)容 。
2.比較MVC和WebFlux
SpringMVC采用命令式編程的方式,代碼被一句一句的執(zhí)行,便于開(kāi)發(fā)者理解與調(diào)試代碼,WebFlux則是基于異步響應(yīng)式編程!
1.工作方式
MVC
MVC的工作流程是:主線程接收到請(qǐng)求(request)-> 準(zhǔn)備數(shù)據(jù) ->返回?cái)?shù)據(jù) 。
整個(gè)過(guò)程是單線程阻塞的,用戶會(huì)感覺(jué)等待時(shí)間長(zhǎng)是因?yàn)椋诮Y(jié)果處理好之后才會(huì)返回結(jié)果給瀏覽器 。。因此,如果請(qǐng)求過(guò)多,則吞吐量會(huì)上不去 。
WebFlux
工作流程:主線程接收到請(qǐng)求 -> 立刻返回?cái)?shù)據(jù)與函數(shù)的組合 -> 開(kāi)啟一個(gè)新的work線程去做實(shí)際的數(shù)據(jù)準(zhǔn)備工作,進(jìn)行真正的業(yè)務(wù)操作 -> work線程完成工作 -> 返回用戶真實(shí)數(shù)據(jù)(結(jié)果)
這種方式給人的感覺(jué)是響應(yīng)時(shí)間很短,因?yàn)榉祷氐氖遣蛔兊某?shù),它不隨用戶數(shù)量的增加而變化!不支持MySql等關(guān)系型數(shù)據(jù)庫(kù) 。
3/認(rèn)識(shí)Mono和Flux
Mono和Flux屬于事件發(fā)布者,為消費(fèi)者提供訂閱接口 。當(dāng)有事件發(fā)生時(shí),Mono和Flux會(huì)回調(diào)消費(fèi)者的相應(yīng)方法,然后通知消費(fèi)者相應(yīng)的事件 。
Mono和Flux用于處理異步數(shù)據(jù)流,它不像MVC中那樣直接返回String/list,而是將異步數(shù)據(jù)流包裝Mono和Flux對(duì)象 。
Mono和Flux的區(qū)別
Mono主要用于返回單個(gè)數(shù)據(jù),F(xiàn)lux主要用于返回多個(gè)數(shù)據(jù) 。
舉例:如果要根據(jù)id查詢某個(gè)User對(duì)象,則返回的肯定是單個(gè)User,那么需要將其包裝成Mono<User>
若需要獲取所有User,則需要將這個(gè)集合包裝成Flux<User>.這里的單個(gè)數(shù)據(jù)并不是指的是一個(gè)數(shù)據(jù),而是指一個(gè)封裝好的對(duì)象 。多個(gè)數(shù)據(jù)就是多個(gè)對(duì)象 。
開(kāi)發(fā)WebFLux的流程
1.注解式開(kāi)發(fā)流程
WebFLux是響應(yīng)式框架 。地址映射也是通過(guò)@RequestMapping提供的,用@Controller和@RestController來(lái)代替Handler類(lèi) 。
2.響應(yīng)式開(kāi)發(fā)流程
1.創(chuàng)建handler類(lèi)
這里的handler類(lèi)相當(dāng)于SpringMVC的Controller層中的方法體 。在響應(yīng)式編程中,請(qǐng)求和相應(yīng)不再是HttpServletRequest和HttpServletResponse,而是變成了ServerRequest和ServerResponse 。
2.配置RouterFunction
RouterFunction和注解@RequestMapping類(lèi)似,都用于提供URL路徑 。
實(shí)例:用注解式開(kāi)發(fā)實(shí)現(xiàn)數(shù)據(jù)的增加,刪除,修改和查詢
首先創(chuàng)建實(shí)體類(lèi)
package com.example.demo.webFlux.entity;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class User {private long id;private String name;private int age;}然后編寫(xiě)控制器,實(shí)現(xiàn)WebFlux操作數(shù)據(jù)功能,
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<>();@PostConstructpublic 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()));}/** 獲取單個(gè)用戶* */@GetMapping("/{id}")public Mono<User> getUser(@PathVariable Long id){return Mono.justOrEmpty(users.get(id));}/** 創(chuàng)建用戶* */@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));}}

經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀