在spring 5中,spring mvc引入了webflux的概念,webflux的底層是基於reactor-netty來的,而reactor-netty又使用了reactor庫。
本文將會介紹在spring boot中reactive在webflux中的使用。
前面我們講到了,webflux的基礎是reactor。 於是spring boot其實擁有了兩套不同的web框架,第一套框架是基於傳統的servlet api和spring mvc,第二套是基於最新的reactive框架,包括 spring webflux 和spring data的reactive repositories。
我們用上面的一張圖可以清晰的看到兩套體系的不同。
對於底層的資料來源來說,mongodb, redis, 和 cassandra 可以直接以reactive的方式支援spring data。而其他很多關係型資料庫比如postgres, microsoft sql server, mysql, h2 和 google spanner 則可以通過使用r2dbc 來實現對reactive的支援。
而spring cloud stream甚至可以支援rabbitmq和kafka的reactive模型。
下面我們將會介紹乙個具體的spring boot中使用spring webflux的例子,希望大家能夠喜歡。
要使用spring webflux,我們需要新增如下的依賴:
>
>
org.springframework.bootgroupid
>
>
spring-boot-starter-webfluxartifactid
>
dependency
>
不同之處在於,我們請求的產生方式和返回值。
熟悉reactor的朋友可能都知道,在reactor中有兩種產生序列的方式,一種是flux一種是mono,其中flux表示1或者多,而mono表示0或者1。
看一下我們的controller該怎麼寫:
@restcontroller
public
class
welcomecontroller
("/hellos"
)public flux
getall()
}
這個例子中,我們提供了兩個get方法,第乙個是hello,直接使用mono.just返回乙個mono。
第二個方法是hellos,通過flux的一系列操作,最後返回乙個flux物件。
有了mono物件,我們怎麼取出裡面的資料呢?
public
class
welcomewebclient
}
我們通過webclient來獲取get的結果,通過exchange將其轉換為clientresponse。
然後提供了乙個getresult方法從result中獲取最終的返回結果。
這裡,我們先呼叫flatmap對clientresponse進行轉換,然後再呼叫block方法,產生乙個新的subscription。
最後,我們看一下spring boot的啟動類:
@slf4j
public
class
",welcomewebclient.
getresult()
);}}
剛剛的註解方式其實跟我們常用的spring mvc基本上是一樣的。
接下來,我們看一下,如果是以程式設計的方式來編寫上面的邏輯應該怎麼處理。
首先,我們定義乙個處理hello請求的處理器:
@component
public
class
welcomehandler
}
和普通的處理一樣,我們需要返回乙個mono物件。
注意,這裡是serverrequest,因為webflux中沒有servlet。
有了處理器,我們需要寫乙個router來配置路由:
@configuration
public
class
welcomerouter
}
上面的**將/hello和welcomehandler::hello進行了繫結。
public
class
welcomewebclient
}
public
class
",welcomewebclient.
getresult()
);}}
怎麼對webflux**進行測試呢?
本質上是和welcomewebclient的實現是一樣的,我們去請求對應的物件,然後檢測其返回值,最後判斷返回值是否我們所期待的內容。
如下所示:
@extendwith
(springextension.
class
)@springboottest
(webenvironment = springboottest.webenvironment.random_port)
public
class
welcomeroutertest
}
webflux使用了reactor作為底層的實現,和通常我們習慣的web請求方式是有很大不同的,但是通過我們的spring框架,可以盡量保證原有的**編寫風格和習慣。
只需要在個別部分做微調。希望大家能夠通過這個簡單的例子,熟悉reactive的基本編碼實現。
本文的例子可以參考:springboot-reactive-web
響應式開發中的rem
用rem做為響應式開發中的單位 包括字型,寬度,高度 頁面的顯示可以自適應裝置寬高。比如我們的設計稿是根據iphone6 375 x 667 的尺寸設計的,我們用rem為單位,就按照inphone6的尺寸做好頁面就ok了,頁面在其他裝置裡就可以響應顯示。1.設定rem 字型和高度我們可以使用rem,...
CSS中的響應式布局
在小型 建設中,有運用一套 來適應不同終端解析度的需求,優點 節約製作時間 節約製作成本 便於維護等優點。css3利用 查詢 media queries 即可針對不同的 型別定義不同的樣式,從而實現響應式布局 也可以針對不同的解析度設定不同的樣式。1024解析度以上 pc端 1024 768 pad...
Vue中的響應式原理
vue最獨特的特性之一,是其非侵入性的響應式系統。響應式原理 資料變,頁面變 vue實現資料雙向繫結主要是 採用資料劫持結合發布者 訂閱者模式的方式 當把乙個普通的js物件傳入vue例項作為data選項時,vue將遍歷此物件的所有屬性,並使用object.defineproperty把這些屬性全部轉...