自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

90-Webflux響應(yīng)式編程怎么去理解?

開發(fā) 前端
現(xiàn)在網(wǎng)關(guān)都采用spring-cloud-gateway,我們看使用過程中發(fā)現(xiàn)編碼已經(jīng)采用響應(yīng)式編程,直接集成了spring-boot-starter-webflux依賴,這就捎帶著把響應(yīng)式編程帶火了一把。
本文轉(zhuǎn)載自微信公眾號「Java時間屋」,作者 Jack佳。轉(zhuǎn)載本文請聯(lián)系一個Java時間屋公眾號。
  • 前言
    • 1.什么是響應(yīng)式編程:
    • 2.使用spring-boot-starter-webflux:
    • 3.Jetty、tomcat、undertow、netty怎么區(qū)分:
  • 總結(jié)

前言

現(xiàn)在網(wǎng)關(guān)都采用spring-cloud-gateway,我們看使用過程中發(fā)現(xiàn)編碼已經(jīng)采用響應(yīng)式編程,直接集成了spring-boot-starter-webflux依賴,這就捎帶著把響應(yīng)式編程帶火了一把。本文結(jié)合我的理解對響應(yīng)式編程做一個總結(jié)性的介紹,希望能幫助到大家。

1.什么是響應(yīng)式編程:

提到響應(yīng)式編程,跟傳統(tǒng)的編程區(qū)別可能剛開始不太好區(qū)分,其中最重要的區(qū)別就是傳統(tǒng)的是阻塞的,響應(yīng)式編程是非阻塞異步。官網(wǎng)介紹響應(yīng)式編程:

  1. In computing, reactive programming is an asynchronous programming paradigm  
  2. concerned with data streams and the propagation of change.  
  3. This means that it becomes possible to express static (e.g. arrays) or  
  4. dynamic (e.g. event emitters) data streams with ease via the employed  
  5. programming language(s), and that an inferred dependency within the  
  6. associated execution model exists, which facilitates the automatic propagation of  
  7. the change involved with data flow. 
  8.  
  9. 在計算機領(lǐng)域,響應(yīng)式編程是一個專注于數(shù)據(jù)流和變化傳遞的異步編程范式。 
  10. 這意味著可以使用編程語言很容易地表示靜態(tài)(例如數(shù)組)或動態(tài)(例如事件發(fā)射器)數(shù)據(jù)流, 
  11. 并且在關(guān)聯(lián)的執(zhí)行模型中,存在著可推斷的依賴關(guān)系,這個關(guān)系的存在有利于自動傳播與數(shù)據(jù)流有關(guān)的更改。 

在計算機領(lǐng)域,響應(yīng)式編程是一個專注于數(shù)據(jù)流和變化傳遞的異步編程范式。

這意味著可以使用編程語言很容易地表示靜態(tài)(例如數(shù)組)或動態(tài)(例如事件發(fā)射器)數(shù)據(jù)流,

并且在關(guān)聯(lián)的執(zhí)行模型中,存在著可推斷的依賴關(guān)系,這個關(guān)系的存在有利于自動傳播與數(shù)據(jù)流有關(guān)的更改。

可能這段話還是不好理解,但是可以著重看下數(shù)據(jù)變化,響應(yīng)式編程就是基于數(shù)據(jù)變化的新的編程模式,實現(xiàn)異步非阻塞,就是當請求來了之后進行訂閱數(shù)據(jù)的變化,后續(xù)業(yè)務(wù)處理發(fā)布變化,然后進行監(jiān)聽到變化,進行響應(yīng)。而傳統(tǒng)的springmvc則是創(chuàng)建新線程等待阻塞,知道請求完畢,釋放線程的過程。

2.使用spring-boot-starter-webflux:

比較經(jīng)典的圖示:

從圖中我們可以看到基于spring-webmvc和spring-webflux的路線和區(qū)別。其中webflux默認是使用netty的通信框架作為web容器,相比較tomcat,netty的優(yōu)勢不再贅述了,并發(fā)高、傳輸快、封裝好,其中netty的零拷貝等等。我們在使用webflux的時候注意兩個需要經(jīng)常使用的對象Mono和Flux:

Mono Flux
實現(xiàn)發(fā)布者,并返回 0 或 1 個元素,即單對象 實現(xiàn)發(fā)布者,并返回 N 個元素,即 List 列表對象

3.Jetty、tomcat、undertow、netty怎么區(qū)分:

tomcat:市場占有率仍然非常高,雖然性能上跟其他web服務(wù)器比較會有欠缺,但是因為其成熟,實踐度很高。undertow和Jetty都是基于NIO實現(xiàn)高并發(fā)的輕量級服務(wù)器,支持servlet3.1和websocket springboot2以后增加了webflux的web容器,而webflux是基于netty的,netty是nio的,加上其零拷貝的實現(xiàn),保證其性能上占據(jù)優(yōu)勢。

3.1 springboot中使用jetty:

  1. <!-- web剔除tomcat容器= --> 
  2. <parent> 
  3.  <groupId>org.springframework.boot</groupId> 
  4.  <artifactId>spring-boot-starter-parent</artifactId> 
  5.  <version>1.5.10.RELEASE</version> 
  6.  <relativePath/> <!-- lookup parent from repository --> 
  7. </parent> 
  8. <dependency> 
  9.     <groupId>org.springframework.boot</groupId> 
  10.     <artifactId>spring-boot-starter-web</artifactId> 
  11.     <exclusions> 
  12.         <exclusion> 
  13.             <artifactId>spring-boot-starter-tomcat</artifactId> 
  14.             <groupId>org.springframework.boot</groupId> 
  15.         </exclusion> 
  16.     </exclusions> 
  17. </dependency> 
  18. <!-- 引入Jetty容器--> 
  19. <dependency> 
  20.     <groupId>org.springframework.boot</groupId> 
  21.     <artifactId>spring-boot-starter-jetty</artifactId> 
  22. </dependency> 

 

3.2 springboot中使用Webflux/Netty:

  1. <!-- 添加spring-boot-starter-web,默認使用tomcat作為web容器 --> 
  2.         <dependency> 
  3.             <groupId>org.springframework.boot</groupId> 
  4.             <artifactId>spring-boot-starter-web</artifactId> 
  5.             <exclusions> 
  6.                 <exclusion> 
  7.                     <groupId>org.springframework.boot</groupId> 
  8.                     <artifactId>spring-boot-starter-logging</artifactId> 
  9.                 </exclusion> 
  10.                 <exclusion> 
  11.                     <groupId>org.springframework.boot</groupId> 
  12.                     <artifactId>spring-boot-starter-tomcat</artifactId> 
  13.                 </exclusion> 
  14.             </exclusions> 
  15.         </dependency> 
  16.         <!-- 去除tomcat,將undertow作為容器 --> 
  17.          <dependency> 
  18.             <groupId>org.springframework.boot</groupId> 
  19.             <artifactId>spring-boot-starter-undertow</artifactId> 
  20.         </dependency> 

 

總結(jié)

 

其實Spring提供的webflux框架簡化了我們操作Netty使用的復(fù)雜性,提供了Reactor Netty庫,因為網(wǎng)關(guān)性能的要求,所有spring-cloud-gateway直接集成了webflux,使用Netty的nio的特性極大的滿足了網(wǎng)關(guān)高并發(fā),高性能要求的場景,個人覺得不見得響應(yīng)式編程未來會遍地開發(fā),但是網(wǎng)關(guān)這種特殊的場景確實比較適合響應(yīng)式編程的應(yīng)用。

 

責任編輯:武曉燕 來源: Java時間屋
相關(guān)推薦

2022-09-22 08:19:26

WebFlux函數(shù)式編程

2022-03-09 23:02:30

Java編程處理模型

2023-11-27 07:42:27

Reactor響應(yīng)式

2022-09-26 08:54:39

Spring函數(shù)式編程

2020-08-31 07:19:57

MonoFlux Reactor

2019-07-01 13:34:22

vue系統(tǒng)數(shù)據(jù)

2021-07-14 13:12:51

2022-06-16 13:08:30

Combine響應(yīng)式編程訂閱

2022-07-15 08:16:56

Stream函數(shù)式編程

2023-01-28 08:04:08

AOPSpring框架

2024-03-06 07:52:21

Spring框架響應(yīng)式編程微服務(wù)架構(gòu)

2016-11-03 13:19:38

vue.jsjavascript前端

2023-07-12 08:16:54

JVM工具包Vert.x

2022-08-25 11:00:19

編程系統(tǒng)

2022-10-25 08:05:12

Kotlin響應(yīng)式編程

2022-03-29 07:32:38

R2DBC數(shù)據(jù)庫反應(yīng)式

2022-09-01 08:00:00

響應(yīng)式編程集成

2024-09-02 16:10:19

vue2前端

2020-10-27 10:26:03

編程開發(fā)Java

2023-09-21 08:01:27

SpringR2DBC實現(xiàn)數(shù)據(jù)庫
點贊
收藏

51CTO技術(shù)棧公眾號