一、異步和非阻塞
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