SpringBoot中的響應式web應用

2021-10-25 09:54:35 字數 2968 閱讀 5645

在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把這些屬性全部轉...