詳解Spring WebFlux

一、異步和非阻塞

Spring WebFlux是Spring框架的一部分,是基於異步和非阻塞的Web框架。傳統的Web服務器中,每個請求都會開啟一個線程,大量的並發請求會導致線程池資源耗盡。而Spring WebFlux則採用了事件驅動、響應式編程的方式,通過少量的線程來處理大量的請求。

與傳統的Servlet容器相比,Spring WebFlux 提供了兩種不同的前端編程模型,分別是基於Servlet和基於Reactive。其中基於Servlet的WebFlux風格類似於Spring MVC的編程模型,基於Reactive的WebFlux則使用更加高級的技術。它具有異步和流異步的能力,可以支持更高的並發性和更好的響應時間。

在代碼實現上,我們可以使用Java 8的新特性reactive-streams或者是Reactor來實現。

二、響應式編程

Spring WebFlux基於響應式編程,其核心概念是流的概念。通過流的形式,我們可以將數據按照一定的模式進行傳輸,這樣就可以非阻塞地獲取數據。

在響應式編程中,數據流是不可變的,每個數據流的結果都可以是一個值、空值或錯誤。數據流中的每個值都可以進行轉換和處理,從而生成新的數據流,這樣就可以構建複雜的數據處理管道。

Spring WebFlux通過實現 reactive-streams 標準,來保證對響應式編程風格的支持。你可以將streaming 結合到你在控制器中的方法中,也可以使用Flux或Mono從數據存儲、或者某個service中讀取數據,並且實現異步的HTTP響應.

三、Router 和 Handler

Spring WebFlux沒有類似於Spring MVC的@Controller,而是通過HandlerFunction接口和RouterFunction接口來實現請求的處理。HandlerFunction是一個處理一個HTTP請求的函數,它是Spring WebFlux中的最基本的處理單元。而RouterFunction則是一個創建處理器Pipeline的函數。

當請求到達Spring WebFlux的Servlet容器時,Servlet容器會將請求傳遞給一個HandlerAdapter,該Adapter會獲取路由信息,並調用路由的方法取出對應的HandlerFunction 來處理請求。HandlerFunction就是一個處理由RouterFunction映射的請求路由的函數。

我們通過RouterFunction來實現URL映射,定義HTTP請求的路由,而HandlerFunction是用來處理請求和響應的。這樣,我們就可以實現更好的解耦——路由負責將請求路由到正確的地方,而處理程序則負責處理頁面或邏輯。

@RestController
public class GreetingController {
 
    @GetMapping("/hello/{name}")
    public Mono<String> hello(@PathVariable String name) {
        return Mono.just("Hello " + name + "!");
    }
 
    @GetMapping("/greetings")
    public Flux<String> greetings() {
        return Flux.just("Hello Reactive World!", "Bonjour le monde Reactive !", "Hallo Reactive Welt!");
    }
}

四、服務器推送(Server Sent Events)

Server Sent Event是HTML 5規範中的API之一,經過瀏覽器原生支持。它允許服務器端將數據推送到客戶端,而無需客戶端先請求。

在Spring WebFlux中,我們可以通過MediaType.TEXT_EVENT_STREAM_VALUE指定媒體類型來實現服務端推送。代碼實現時,在處理器函數中我們可以發出一個無限流包含任意對象。一個無限流可以通過Flux.generate()方法創建。

@GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<Greeting>> sse() {
    return Flux.interval(Duration.ofSeconds(1))
            .map(sequence -> ServerSentEvent.builder(new Greeting("Hello, SSE!")).build());
}

五、WebClient

WebClient是Spring WebFlux提供的一個非阻塞和響應式的HTTP客戶端,用於調用其他的HTTP服務。我們可以在不同的WebFlux應用程序之間建立連接。我們甚至可以將非WebFlux應用程序集成到我們的WebFlux應用程序中。

WebClient webClient = WebClient.create("https://api.github.com");
 
Mono<User> userMono = webClient.get()
        .uri("/users/{username}", "lovelyorg")
        .retrieve()
        .bodyToMono(User.class);
 
userMono.subscribe(user -> System.out.println("user = " + user));

六、結論

Spring WebFlux是Spring框架的一個強有力的補充,它提供異步和響應式的Web編程模型,為我們的應用程序帶來了更高的並發能力和更好的響應時間。在實際的應用程序開發中,我們可以使用Spring WebFlux來構建高性能、高可用、高並發的Web應用程序。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/237686.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:06
下一篇 2024-12-12 12:06

相關推薦

發表回復

登錄後才能評論