亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring Boot中使用RSocket的示例代碼

 更新時間:2019年06月05日 14:40:19   作者:鍋外的大佬  
這篇文章主要介紹了Spring Boot中使用RSocket的示例代碼,特別是spring boot 如何幫助抽象出更低級別的RSocket API,具有一定的參考價值,感興趣的小伙伴們可以參考一下

1. 概述

RSocket 應用層協(xié)議支持 Reactive Streams 語義, 例如:用RSocket作為HTTP的一種替代方案。在本教程中, 我們將看到 RSocket 用在spring boot中,特別是spring boot 如何幫助抽象出更低級別的RSocket API。

2. 依賴

讓我們從添加 spring-boot-starter-rsocket 依賴開始:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-rsocket</artifactId>
</dependency>

這個依賴會傳遞性的拉取 RSocket 相關的依賴,比如: rsocket-core 和 rsocket-transport-netty

3.示例的應用程序

現(xiàn)在繼續(xù)我們的簡單應用程序。為了突出 RSocket 提供的交互模式,我打算創(chuàng)建一個交易應用程序, 交易應用程序包括客戶端和服務器。

3.1. 服務器設置

首先,我們設置由springboot應用程序引導的 RSocket server 服務器。 因為有 spring-boot-starter-rsocket dependency 依賴,所以springboot會自動配置 RSocket server 。 跟平常一樣, 可以用屬性驅(qū)動的方式修改 RSocket server 默認配置值。例如:通過增加如下配置在 application.properties 中,來修改 RSocket 端口

spring.rsocket.server.port=7000

也可以根據(jù)需要進一步修改服務器的其他屬性

3.2.設置客戶端

接下來,我們來設置客戶端,也是一個springboot應用程序。雖然springboot自動配置大部分RSocket相關的組件,但還要自定義一些對象來完成設置。

@Configuration
public class ClientConfiguration {

  @Bean
  public RSocket rSocket() {
    return RSocketFactory
     .connect()
     .mimeType(MimeTypeUtils.APPLICATION_JSON_VALUE, MimeTypeUtils.APPLICATION_JSON_VALUE)
     .frameDecoder(PayloadDecoder.ZERO_COPY)
     .transport(TcpClientTransport.create(7000))
     .start()
     .block();
  }

  @Bean
  RSocketRequester rSocketRequester(RSocketStrategies rSocketStrategies) {
    return RSocketRequester.wrap(rSocket(), MimeTypeUtils.APPLICATION_JSON, rSocketStrategies);
  }
}

這兒我們正在創(chuàng)建 RSocket 客戶端并且配置TCP端口為:7000。注意: 該服務端口我們在前面已經(jīng)配置過。 接下來我們定義了一個RSocket的裝飾器對象 RSocketRequester 。 這個對象在我們跟 RSocket server 交互時會為我們提供幫助。 定義這些對象配置后,我們還只是有了一個骨架。在接下來,我們將暴露不同的交互模式, 并看看springboot在這個地方提供幫助的。

4. springboot RSocket 中的 Request/Response

我們從 Request/Response 開始, HTTP 也使用這種通信方式,這也是最常見的、最相似的交互模式。 在這種交互模式里, 由客戶端初始化通信并發(fā)送一個請求。之后,服務器端執(zhí)行操作并返回一個響應給客戶端--這時通信完成。 在我們的交易應用程序里, 一個客戶端詢問一個給定的股票的當前的市場數(shù)據(jù)。 作為回復,服務器會傳遞請求的數(shù)據(jù)。

4.1.服務器

在服務器這邊,我們首先應該創(chuàng)建一個 controller 來持有我們的處理器方法。 我們會使用 @MessageMapping 注解來代替像SpringMVC中的 @RequestMapping 或者 @GetMapping 注解

@Controller
public class MarketDataRSocketController {

  private final MarketDataRepository marketDataRepository;

  public MarketDataRSocketController(MarketDataRepository marketDataRepository) {
    this.marketDataRepository = marketDataRepository;
  }

  @MessageMapping("currentMarketData")
  public Mono<MarketData> currentMarketData(MarketDataRequest marketDataRequest) {
    return marketDataRepository.getOne(marketDataRequest.getStock());
  }
}

來研究下我們的控制器。 我們將使用 @Controller 注解來定義一個控制器來處理進入RSocket的請求。 另外,注解 @MessageMapping 讓我們定義我們感興趣的路由和如何響應一個請求。 在這個示例中, 服務器監(jiān)聽路由 currentMarketData , 并響應一個單一的結果 Mono<MarketData> 給客戶端。

4.2. 客戶端

接下來, 我們的RSocket客戶端應該詢問一只股票的價格并得到一個單一的響應。 為了初始化請求, 我們該使用 RSocketRequester 類,如下:

@RestController
public class MarketDataRestController {

  private final RSocketRequester rSocketRequester;

  public MarketDataRestController(RSocketRequester rSocketRequester) {
    this.rSocketRequester = rSocketRequester;
  }

  @GetMapping(value = "/current/{stock}")
  public Publisher<MarketData> current(@PathVariable("stock") String stock) {
    return rSocketRequester
     .route("currentMarketData")
     .data(new MarketDataRequest(stock))
     .retrieveMono(MarketData.class);
  }
}

注意:在示例中, RSocket 客戶端也是一個 REST 風格的 controller ,以此來訪問我們的 RSocket 服務器。因此,我們使用 @RestController 和 @GetMapping 注解來定義我們的請求/響應端點。 在端點方法中, 我們使用的是類 RSocketRequester 并指定了路由。 事實上,這個是服務器端 RSocket 所期望的路由,然后我們傳遞請求數(shù)據(jù)。最后,當調(diào)用 retrieveMono() 方法時,springboot會幫我們初始化一個請求/響應交互。

5. Spring Boot RSocket 中的 Fire And Forget 模式

接下來我們將查看 Fire And Forget 交互模式。正如名字提示的一樣,客戶端發(fā)送一個請求給服務器,但是不期望服務器的返回響應回來。 在我們的交易程序中, 一些客戶端會作為數(shù)據(jù)資源服務,并且推送市場數(shù)據(jù)給服務器端。

5.1.服務器端

我們來創(chuàng)建另外一個端點在我們的服務器應用程序中,如下:

@MessageMapping("collectMarketData")
public Mono<Void> collectMarketData(MarketData marketData) {
  marketDataRepository.add(marketData);
  return Mono.empty();
}

我們又一次定義了一個新的 @MessageMapping 路由為 collectMarketData 。此外, Spring Boot自動轉(zhuǎn)換傳入的負載為一個 MarketData 實例。 但是,這兒最大的不同是我們返回一個 Mono<Void> ,因為客戶端不需要服務器的返回。

5.2. 客戶端

來看看我們?nèi)绾纬跏蓟覀兊?nbsp;fire-and-forget 模式的請求。 我們將創(chuàng)建另外一個REST風格的端點,如下:

@GetMapping(value = "/collect")
public Publisher<Void> collect() {
  return rSocketRequester
   .route("collectMarketData")
   .data(getMarketData())
   .send();
}

這兒我們指定路由和負載將是一個 MarketData 實例。 由于我們使用 send() 方法來代替 retrieveMono() ,所有交互模式變成了 fire-and-forget 模式。

6. Spring Boot RSocket 中的 Request Stream

請求流是一種更復雜的交互模式, 這個模式中客戶端發(fā)送一個請求,但是在一段時間內(nèi)從服務器端獲取到多個響應。 為了模擬這種交互模式, 客戶端會詢問給定股票的所有市場數(shù)據(jù)。

6.1.服務器端

我們從服務器端開始。 我們將添加另外一個消息映射方法,如下:

@MessageMapping("feedMarketData")
public Flux<MarketData> feedMarketData(MarketDataRequest marketDataRequest) {
  return marketDataRepository.getAll(marketDataRequest.getStock());
}

正如所見, 這個處理器方法跟其他的處理器方法非常類似。 不同的部分是我們返回一個 Flux<MarketData> 來代替 Mono<MarketData> 。 最后我們的RSocket服務器會返回多個響應給客戶端。

6.2.客戶端

在客戶端這邊, 我們該創(chuàng)建一個端點來初始化請求/響應通信,如下:

@GetMapping(value = "/feed/{stock}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Publisher<MarketData> feed(@PathVariable("stock") String stock) {
  return rSocketRequester
   .route("feedMarketData")
   .data(new MarketDataRequest(stock))
   .retrieveFlux(MarketData.class);
}

我們來研究下RSocket請求。 首先我們定義了路由和請求負載。 然后,我們定義了使用 retrieveFlux() 調(diào)用的響應期望。這部分決定了交互模式。 另外注意:由于我們的客戶端也是 REST 風格的服務器,客戶端也定義了響應媒介類型 MediaType.TEXT_EVENT_STREAM_VALUE 。

7.異常的處理

現(xiàn)在讓我們看看在服務器程序中,如何以聲明式的方式處理異常。 當處理請求/響應式, 我可以簡單的使用 @MessageExceptionHandler 注解,如下:

@MessageExceptionHandler
public Mono<MarketData> handleException(Exception e) {
  return Mono.just(MarketData.fromException(e));
}

這里我們給異常處理方法標記注解為 @MessageExceptionHandler 。作為結果, 這個方法將處理所有類型的異常, 因為 Exception 是所有其他類型的異常的超類。 我們也可以明確地創(chuàng)建更多的不同類型的,不同的異常處理方法。 這當然是請求/響應模式,并且我們返回的是 Mono<MarketData> 。我們期望這里的響應類型跟我們的交互模式的返回類型相匹配。

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

相關文章

  • java+opencv實現(xiàn)人臉識別功能

    java+opencv實現(xiàn)人臉識別功能

    這篇文章主要介紹了java+opencv實現(xiàn)人臉識別功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • SpringBoot接口數(shù)據(jù)加解密實戰(zhàn)記錄

    SpringBoot接口數(shù)據(jù)加解密實戰(zhàn)記錄

    現(xiàn)今對于大多數(shù)公司來說,信息安全工作尤為重要,下面這篇文章主要給大家介紹了關于SpringBoot接口數(shù)據(jù)加解密的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • Java內(nèi)存泄漏問題處理方法經(jīng)驗總結

    Java內(nèi)存泄漏問題處理方法經(jīng)驗總結

    今天小編就為大家分享一篇關于Java內(nèi)存泄漏問題處理方法經(jīng)驗總結,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Idea導入多個maven項目到同一目錄下的方法示例

    Idea導入多個maven項目到同一目錄下的方法示例

    這篇文章主要介紹了Idea導入多個maven項目到同一目錄下,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java線程和操作系統(tǒng)線程的關系解讀

    Java線程和操作系統(tǒng)線程的關系解讀

    這篇文章主要介紹了Java線程和操作系統(tǒng)線程的關系解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java開源工具iText生成PDF簡單實例

    Java開源工具iText生成PDF簡單實例

    這篇文章主要介紹了Java開源工具iText生成PDF簡單實例,本文給出了3段代碼實例,講解創(chuàng)建一個簡單PDF文件,在PDF中添加表格以及在PDF中添加圖片,需要的朋友可以參考下
    2015-07-07
  • Java 讀取PDF中的文本和圖片的方法

    Java 讀取PDF中的文本和圖片的方法

    本文將介紹通過Java程序來讀取PDF文檔中的文本和圖片的方法。分別調(diào)用方法extractText()和extractImages()來讀取,需要的朋友可以參考下
    2019-07-07
  • SpringBoot結合mockito測試實戰(zhàn)

    SpringBoot結合mockito測試實戰(zhàn)

    與集成測試將系統(tǒng)作為一個整體測試不同,單元測試更應該專注于某個類。所以當被測試類與外部類有依賴的時候,尤其是與數(shù)據(jù)庫相關的這種費時且有狀態(tài)的類,很難做單元測試。但好在可以通過“Mockito”這種仿真框架來模擬這些比較費時的類,從而專注于測試某個類內(nèi)部的邏輯
    2022-11-11
  • Java中IO流簡介_動力節(jié)點Java學院整理

    Java中IO流簡介_動力節(jié)點Java學院整理

    Java io系統(tǒng)的設計初衷,就是為了實現(xiàn)“文件、控制臺、網(wǎng)絡設備”這些io設置的通信。接下來通過本文給大家介紹Java中IO流簡介,感興趣的朋友一起看看吧
    2017-05-05
  • 詳解Java中Duration類的使用方法

    詳解Java中Duration類的使用方法

    Duration類通過秒和納秒相結合來描述一個時間量,最高精度是納秒。本文將通過示例詳細為大家講講Duration類的使用,需要的可以參考一下
    2022-05-05

最新評論