日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
這會是下一代的Java程序員的技術棧嗎?

前面的文章給大家介紹了 SpringBoot 的應用 web 類型推斷,并且結合了 Reactive web 類型給大家分析了一下 SpringBoot 是如何進行 web 類型推斷和創(chuàng)建內(nèi)置 web 服務器的。

有小伙伴在后臺留言就問了 Servlet web 我們天天使用很熟悉,那什么是 Reactive web 呢?兩者的區(qū)別是啥?今天阿粉就給大家介紹一下。

Servlet 與 Reactive 技術棧

打開 Spring 的官方文檔我們在 Reactive 一欄中可以看到下面的架構圖,其中可以很明顯的看到 Reactive 的技術棧跟 Servlet 技術棧是完全并行的。意思是說我們?nèi)粘i_發(fā)的 Servlet web 類型只是一半的內(nèi)容,還有另外一半世界就是 Reactive,兩者對應的依賴如下所示。



org.springframework.boot
spring-boot-starter-web



org.springframework.boot
spring-boot-starter-webflux

servlet-reactive

通過架構圖我們可以知道常用的 Servlet web 就是我們經(jīng)常說的 Spring MVC,底層的技術棧支持 JDBC 等,而 Reactive web 就是 Spring WebFlux 底層的持久層支持 Mongo 等但是不支持 JDBC。

什么是 Spring WebFlux

由上圖我們看到 Spring WebFlux 是一個異步非阻塞式的 Web 框架,它能夠充分利用多核 CPU 的硬件資源去處理大量的并發(fā)請求。相對于 Spring MVC 來說的話,Spring MVC 構建于 Servlet API 之上,使用的是同步阻塞式 I/O 模型。

由于 Spring WebFlux 底層是使用響應式編程,基于事件的異步驅(qū)動,所以可以在很大程度上提升系統(tǒng)的吞吐量。但是要知道這并不會縮短請求的響應時間,只是提升吞吐量。

而且根據(jù)上面的架構圖我們可以發(fā)現(xiàn),Spring WebFlux 底層的持久層是不支持 JDBC 的,也就是說不支持 MySQL 等事務性數(shù)據(jù)庫,

舉個栗子

前面說了這么多那 Spring WebFlux 到底是怎么開發(fā)的呢?下來通過一個簡單的 case 來給大家演示一下。在演示之前通過官方文檔我們可以發(fā)現(xiàn),Spring WebFlux 和 Spring MVC 是可以共用很多組件的,比如 @Controller,Tomcat 等,但是也會存在很多差異。

Spring 官方 Reactive 地址為:https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html

springmvc-springwebflux

基于我們之前的 demo-reactive 項目的代碼,或者小伙伴也可以在 starter.spring.io 上面下載一個 SpringBoot 的項目代碼,增加上 spring-boot-starter-webflux 依賴即可。

定義 DTO

package com.example.reactive.demoreactive.dto;

public class User {
private String name;
private int age;

//省略 getter setter
}

定義 Controller

package com.example.reactive.demoreactive.controller;

import com.example.reactive.demoreactive.dto.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.ArrayList;
import java.util.List;


@RestController
public class UserController {

@GetMapping("/hello")
public String sayHello(){
return "hello";
}

@GetMapping("/user/get")
public Mono getUser(){
User user = new User();
user.setName("Java極客技術");
user.setAge(18);
return Mono.just(user);
}

@GetMapping("/user/list")
public Flux> getAllUser() {
User user = new User();
user.setName("Java極客技術");
user.setAge(18);
List list = new ArrayList<>();
list.add(user);
return Flux.just(list);
}
}

隨后啟動我們的服務,再通過瀏覽器訪問我們的接口就可以了。

上面三個接口的訪問結果如下:

hello

user-get

user-list

可以看到我們在瀏覽器可以正常獲取到數(shù)據(jù),上面的代碼跟我們平時寫 SpringMVC 的代碼很相似,不太一樣的地方是有兩個類 Mono 和 FLux。

關于 Mono 和 Flux 是反應式編程的概念,Mono 是返回 0 或 1 個元素,F(xiàn)lux 是返回 0 - N 個元素,更詳細的內(nèi)容大家可以通過官方文檔 https://projectreactor.io/docs/core/release/api/  來查看。

總結

雖然從上面的寫法來看,Spring WebFlux 的寫法與 SpringMVC 的寫法沒有很大的區(qū)別,但是兩者的底層機制是完全不一樣的,而且技術棧也不完全相同,所以大家在日常技術選型的時候需要根據(jù)實際情況去選擇。

阿粉這里給出的建議就是,如果當下的項目就是 SpringMVC 的,那么不要想著換成 Spring WebFlux 架構,因為沒必要,如果說要新開發(fā)一個項目,需要高吞吐量而且底層也不依賴事務性數(shù)據(jù)庫的話,那么可以嘗試使用一下 Spring WebFlux。


網(wǎng)站題目:這會是下一代的Java程序員的技術棧嗎?
標題網(wǎng)址:http://m.5511xx.com/article/dpiisis.html