欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Spring5 響應式編程

 更新時間:2018年01月08日 15:25:29   作者:oschina  
本篇文章主要介紹了淺談Spring5 響應式編程,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

近年來,響應式編程在開發(fā)者社區(qū)和客戶中很受歡迎,由于其以聲明的方式構建應用程序的能力,而不是強制,形成更加敏感和有彈性的應用。Spring 5 將反應系統納入其核心框架的事實已經顯示出向聲明式編程的范式轉變。

響應式編程管理數據生產者和消費者之間的異步數據流,它們需要以流暢的方式對數據進行響應。所以,響應式編程都是異步和事件驅動的流暢應用程序,需要少量的線程進行縮放。

響應式編程很難構建基于線程的架構,由于在基于共享可變狀態(tài)、線程和鎖的應用程序擴展過程中涉及到高度復雜性。

在響應式編程的上下文中,“在流中有數據時,所有事物都是流并以流暢方式行為?!?nbsp;

為什么是響應式編程

高層次的抽象與響應式編程導致了代碼可讀性的提高,因此開發(fā)人員可以主要關注定義業(yè)務邏輯的事件的相互依存性。

在高度并發(fā)的環(huán)境中,響應模式自然地適合于消息處理,這是一個常見的企業(yè)用例。

由于執(zhí)行反壓力的特性,響應式方法最適合控制生產者和消費者之間的流量,這將有助于避免內存不足。

對于一個或幾個線程,IO綁定任務可以通過異步和非阻塞方式執(zhí)行,而且不阻塞當前線程。

在高交互和實時應用程序或任何操作/事件時,都可能觸發(fā)多個連接子系統的通知,在這種情況下響應式編程可以更有效的進行管理。

 用于響應式編程實現的理想案例

  1. 大量的交易處理服務,如銀行部門。
  2. 大型在線購物應用程序的通知服務,如亞馬遜。
  3. 股票價格同時變動的股票交易業(yè)務。

響應流 (Reactive Streams)

“響應流”定義一個 API 規(guī)范,其中包含一組最小的接口,這些接口公開了定義非阻塞反壓力的數據流的操作和實體的方法。

隨著反壓力的引入,響應流允許用戶控制來自出版商的數據交換速率。

響應流 API java.util.concurrent.flow 已正式成為 java 9 的一部分。

響應流主要用作互操作層。

 Spring 5 提供的響應式編程

Spring-Web-Reactive 模塊和 Spring MVC 都支持相同的 @Controller 編程,但 Spring-Web-Reactive 是在 Reactive 和非阻塞引擎上執(zhí)行的。

遵循這個文檔,見:
http://docs.spring.io/spring-framework/docs/5.0.0.BUILD-SNAPSHOT/spring-framework-reference/html/web-reactive.html

Spring-Web-Reactive 模塊和 Spring MVC 共享許多通用的算法,但 Spring-Web-Reactive 模塊已經重新定義了許多 Spring MVC 契約,例如 HandlerMapping和HandlerAdapter,以使它們變得異步和非阻塞,以及啟用響應式 HTTP 請求和響應(以 RouterFunction 和 HandlerFunction 的形式)。

除了現有的 RestTemplate 外,新的響應式 WebClient 也在 Spring 5 中引入。

支持響應式編程的 HTTP 客戶端(例如 Reactor、Netty、Undertow)已經采用了一系列響應式的 ClientHttpRequest 和 ClientHttpResponse 抽象,它們將請求和響應體作為 Flux <DataBuffer> 公開,并且在讀寫端提供全面的背壓支持。

Spring 5 Framework 引入了 Reactor,作為 Reactive Streams 規(guī)范的實現。

Reactor 是用于在 JVM 上構建非阻塞應用程序的下一代 Reactive 庫。

Reactor 擴展了基本的 Reactive Streams Publisher 契約,并定義了 Flux 和 Mono API 類型,分別為 0..N 和 0..1 的數據序列提供聲明性操作。

Spring Web Reactive 使用 Servlet 3.1 提供了非阻塞 I/O,并運行在 Servlet 3.1 容器上。

Spring WebFlux 提供了兩種編程模型可供選擇。

  1. 注解式控制器:這些與 Spring MVC 相同,在使用一些 Spring-Web 模塊提供的附加注解的情況下。Spring MVC 和 WebFlux 控制器都支持 Reactive 返回類型。另外,WebFlux 還支持 Reactive @RequestBody 參數。
  2. 函數式編程模型:基于 lambda 的輕量級小型庫,用于給出路由和處理請求的實用程序。

 Spring Web Reactive vs. Spring Web MVC

Spring 5 包含了 Spring Web Reactive(在 spring-web-reactive 模塊下)和 Spring Web MVC(在 spring-webmvc 模塊下)。

雖然 Spring Web Reactive 和 Spring Web MVC 模塊共享了很多算法,但是由于 Spring Web Reactive 能夠在響應式的非阻塞 Reactive Streams HTTP 適配器層上運行,因此它們之間不共享代碼。

Spring MVC 執(zhí)行需要 Servlet 容器,而 Spring Web Reactive 也可以在非 Servlet 運行時上運行,比如在 Netty 和 Undertow 上運行。

如果對具有輕量級、函數式的 Web 框架的非阻塞 Web 棧的必要要求,并與 Java 8 lambda 或 Kotlin一起使用,則應該考慮從 Spring MVC 應用程序切換到 Spring Web Reactive。

響應式編程的基本結構

這是一個 2.0.0 M5 版本的  pom.xml ,依賴于 WebFiux。

<parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.0.0.M5</version>
</parent>
<dependencies>   
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-webflux</artifactId>        </dependency>
</dependencies>

傳統方法 VS. 響應方法

在傳統方法中,執(zhí)行將被阻塞,并將一直等到您的服務執(zhí)行完成為止。在下面的代碼中,在第一個 print 語句之后,程序執(zhí)行將被阻塞并等待服務執(zhí)行完成。在服務執(zhí)行完成后,將恢復程序執(zhí)行,并執(zhí)行第二個 print 語句。

@GetMapping("/traditional")
public List < Product > getAllProducts() {
 System.out.println("Traditional way started");
 List < Product > products = prodService.getProducts("traditional");
 System.out.println("Traditional way completed");
 return products;
}

在響應方法中,程序執(zhí)行將繼續(xù),而不用等待服務執(zhí)行的完成。在下面的代碼中,在第一個 print 語句之后,第二個 print 語句將以非阻塞的方式執(zhí)行,而無需等待服務執(zhí)行的完成。Flux stream 將隨著產品數據的可用性而被填充。

@GetMapping(value = "/reactive", .TEXT_EVENT_STREAM_VALUE)
public Flux < Product > getAll() {
 System.out.println("Reactive way using Flux started");
 Flux < Product > fluxProducts = prodService.getProductsStream("Flux");
 System.out.println("Reactive way using Flux completed");
 return fluxProducts;
}

Reactive Web Client

除了現有的 RestTemplate 之外,Spring 5 還引入了 Reactive WebClient。

ClientHttpRequest 和 ClientHttpResponse 抽象將請求和響應主體使用 Flux <DataBuffer> 公開,并在讀和寫端提供完全背壓支持。

來自 Spring Core 的編碼器和解碼器抽象也用在客戶端,用于將字節(jié)序的 Flus 序列化或發(fā)序列化成類型對象。

下面是一個 Reactive WebClient 的示例,它調用終端并接收及處理 Reactive Stream Flux 對象。

@GetMapping("/accounts/{id}/alerts")
public Flux < Alert > getAccountAlerts(@PathVariable Long id) {
 WebClient webClient = new WebClient(new ReactorClientHttpConnector());
 return this.repository.getAccount(id).flatMap(account -> webClient.perform(get("/alerts/{key}", account.getKey())).extract(bodyStream(Alert.class)));
}

Spring 5 的局限

  1. 對 Reactive 應用程序進行故障診斷有點困難,并且你有可能在解決問題的同時,意外地阻塞了已經引入的代碼。
  2. 大多數傳統的基于 Java 的集成庫仍然是阻塞的。
  3. 可用于 Reactive 數據存儲的選項是非常有限的,少數 NoSQL 數據庫(如 MongoDB)除外。
  4. Spring Security 仍然不被支持。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 基于BIO的Java Socket通信詳解

    基于BIO的Java Socket通信詳解

    這篇文章主要為大家詳細介紹了基于BIO的Java Socket通信相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java中的ArrayList、LinkedList、HashSet等容器詳解

    Java中的ArrayList、LinkedList、HashSet等容器詳解

    這篇文章主要介紹了Java中的ArrayList、LinkedList、HashSet等容器詳解,集合表示一組對象,稱為其元素,有些集合允許重復元素,而另一些則不允許,有些是有序的,有些是無序的,需要的朋友可以參考下
    2023-08-08
  • Java反射機制的適用場景及利弊詳解

    Java反射機制的適用場景及利弊詳解

    這篇文章主要介紹了Java反射機制的適用場景及利弊詳解,Spring用到很多反射機制,在xml文件或者properties里面寫好了配置,然后在Java類里面解析xml或properties里面的內容,得到一個字符串,然后用反射機制,需要的朋友可以參考下
    2023-08-08
  • mybatis如何使用Map接收返回值

    mybatis如何使用Map接收返回值

    這篇文章主要介紹了mybatis如何使用Map接收返回值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • SpringBoot2 整合FreeMarker實現頁面靜態(tài)化示例詳解

    SpringBoot2 整合FreeMarker實現頁面靜態(tài)化示例詳解

    這篇文章主要介紹了SpringBoot2 整合FreeMarker實現頁面靜態(tài)化示例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java基礎學習之標簽

    Java基礎學習之標簽

    在Java中,標簽必須在循環(huán)之前使用, 一個循環(huán)之中嵌套另一個循環(huán)的開關,從多重嵌套中continue或break,該文詳細介紹了標簽的相關知識,對正在學習java基礎的小伙伴們還很有幫助,需要的朋友可以參考下
    2021-05-05
  • springboot使用Mybatis(xml和注解)過程全解析

    springboot使用Mybatis(xml和注解)過程全解析

    這篇文章主要介紹了springboot使用Mybatis(xml和注解)過程全解析 ,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • 手把手教你用Java給暗戀對象發(fā)送一份表白郵件

    手把手教你用Java給暗戀對象發(fā)送一份表白郵件

    隨著我們學習java的深入,也漸漸發(fā)現了它的一些樂趣,比如發(fā)送郵件,下面這篇文章主要給大家介紹了關于如何利用Java給暗戀對象發(fā)送一份表白郵件的相關資料,需要的朋友可以參考下
    2021-11-11
  • SpringBoot中使用Thymeleaf模板詳情

    SpringBoot中使用Thymeleaf模板詳情

    這篇文章主要介紹了SpringBoot中使用Thymeleaf模板詳情,hymeleaf是適用于Web和獨立環(huán)境的現代服務器端Java模板引擎,能夠處理HTML,XML,JavaScript,CSS甚至純文本,下文更多相關資料介紹需要的小伙伴可以參考一下
    2022-04-04
  • Spring Boot CLI使用教程

    Spring Boot CLI使用教程

    本篇文章主要介紹了Spring Boot CLI使用教程,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10

最新評論