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

SpringBoot創(chuàng)建RSocket服務(wù)器的全過(guò)程記錄

 更新時(shí)間:2021年05月16日 09:05:28   作者:老K的Java博客  
RSocket應(yīng)用層協(xié)議支持 Reactive Streams語(yǔ)義, 例如:用RSocket作為HTTP的一種替代方案。這篇文章主要給大家介紹了關(guān)于SpringBoot創(chuàng)建RSocket服務(wù)器的相關(guān)資料,需要的朋友可以參考下

前言

在微服務(wù)的多樣化世界中,HTTP是代理到代理通信中無(wú)可爭(zhēng)議的領(lǐng)導(dǎo)者。它成熟,無(wú)處不在。但在某些情況下,HTTP請(qǐng)求-響應(yīng)可能很麻煩。如果您需要傳統(tǒng)請(qǐng)求-響應(yīng)之外的通信模式,如fire-and-forget或streaming,該怎么辦?如果你想向任何一個(gè)方向發(fā)送信息呢?

有了HTTP,有很多方法可以實(shí)現(xiàn)這一點(diǎn),但這不是構(gòu)建協(xié)議的目的。許多解決方案都帶有額外的權(quán)衡或缺點(diǎn)。另外,這里沒(méi)有規(guī)則手冊(cè)說(shuō)“你應(yīng)該一直使用HTTP”,像AMQP這樣的消息傳遞協(xié)議已經(jīng)證明了這一點(diǎn)。所以,知道你的選擇是什么是好的,每隔一段時(shí)間在你的列表中添加一些新技術(shù)也是健康的。這篇文章是關(guān)于一個(gè)這樣的替代RSocket。

RSocket是一種新的消息傳遞協(xié)議,旨在解決一些常見(jiàn)的微服務(wù)通信難題。使用RSocket,您可以獲得一個(gè)在TCP或WebSockets上工作的靈活協(xié)議。這意味著您可以在不進(jìn)行轉(zhuǎn)換的情況下處理二進(jìn)制消息。您可以使用諸如多路復(fù)用、背壓、恢復(fù)和路由等現(xiàn)代控件,還可以使用多種消息傳遞模式,包括啟動(dòng)和忘記、請(qǐng)求-響應(yīng)和流式傳輸。RSocket也是完全反應(yīng)的,因此它非常適合于高吞吐量的微服務(wù)應(yīng)用程序。早期采用者包括Netflix、Pivotal、阿里巴巴和Facebook,它們都是提供可伸縮互聯(lián)網(wǎng)服務(wù)的專(zhuān)家。

由于請(qǐng)求-響應(yīng)是大多數(shù)web開(kāi)發(fā)人員熟悉的基礎(chǔ),因此我們將以這種模式開(kāi)始我們的RSocket之旅。請(qǐng)求-響應(yīng)的語(yǔ)義相當(dāng)簡(jiǎn)單,您發(fā)送一個(gè)請(qǐng)求,就得到一個(gè)響應(yīng)。HTTP是建立在這個(gè)基本的交互之上的,它非常常見(jiàn)。

在本文中,您將了解如何使用RSocket,使用Spring Boot作為服務(wù)器,使用終端應(yīng)用程序作為客戶機(jī)來(lái)執(zhí)行請(qǐng)求響應(yīng)。

請(qǐng)求-響應(yīng)Request-response只是Spring和RSocket支持的四種交互模型之一。

當(dāng)您按照下面的步驟操作時(shí),您會(huì)注意到使用springboot構(gòu)建RSocket服務(wù)器所需的代碼量非常少。這里已經(jīng)為您提供了代碼,但是您也可以在幾分鐘內(nèi)自己從頭開(kāi)始編寫(xiě)代碼。

步驟1:設(shè)置環(huán)境

首先,檢查是否安裝了以下必備組件:

  • Java8或更高版本的JavaSDK(要檢查,請(qǐng)?jiān)诮K端使用Java-version)
  • 一個(gè)工作的javaide(我正在使用IntelliJ IDEA)
  • 包含克隆或提取的演示代碼示例的文件夾。
  • Linux Bash/ZSH shell(如果您是Windows用戶,請(qǐng)查看下面的注釋?zhuān)?br />

如果您是Windows用戶,請(qǐng)切換到Microsoft針對(duì)Linux的Windows子系統(tǒng)。

現(xiàn)在,將下載的項(xiàng)目文件夾設(shè)置為終端中的當(dāng)前目錄:

cd spring-rsocket-demo

在終端中,下載JAR文件如下:

cd rsocket-server
wget -O rsc.jar https://github.com/making/rsc/releases/download/0.4.2/rsc-0.4.2.jar

稍后您將使用此客戶機(jī)與RSocket服務(wù)器進(jìn)行對(duì)話,但現(xiàn)在,通過(guò)如下方式調(diào)用help命令來(lái)測(cè)試它是否正常工作:

java -jar rsc.jar --help

您應(yīng)該會(huì)看到下面這樣的一些輸出(我已經(jīng)截?cái)嗔耍?,解釋了命令的用法和選項(xiàng)。

usage: rsc Uri [Options]

Non-option arguments:
[String: Uri]

Option                              Description
------                              -----------
--channel                           Shortcut of --im REQUEST_CHANNEL
-d, --data [String]                 Data. Use '-' to read data from

...

把這個(gè)終端窗口開(kāi)著,你以后會(huì)需要的。

步驟2:檢查服務(wù)器代碼

在IDE中打開(kāi)rsocket服務(wù)器項(xiàng)目并檢查代碼。如您所見(jiàn),在springboot中支持RSocket服務(wù)器所需的代碼非常少。以下是一些亮點(diǎn):

項(xiàng)目文件

在項(xiàng)目的pom.xml文件中,您可以看到Spring Boot RSocket服務(wù)器所需的<dependencies>。之所以使用SpringBootVersion2.2.5.RELEASE,是因?yàn)樵谧珜?xiě)本文時(shí),該版本具有最適合生產(chǎn)的RSocket特性。該項(xiàng)目還依賴(lài)于lombok和springbootstartersocket庫(kù)。Lombok為Java數(shù)據(jù)類(lèi)添加了構(gòu)造函數(shù)、getter、setter和equals,還簡(jiǎn)化了對(duì)日志等內(nèi)容的訪問(wèn)。RSocket的springbootstarter將RSocket與springboot集成在一起,并在運(yùn)行時(shí)自動(dòng)為您配置一些RSocket基礎(chǔ)設(shè)施。

應(yīng)用程序?qū)傩?/strong>

在application.properties文件中,RSocket服務(wù)器的TCP端口被設(shè)置為7000,Spring Boot的延遲初始化功能被打開(kāi)。

spring.rsocket.server.port=7000
spring.main.lazy-initialization=true

消息類(lèi)

第一個(gè)更詳細(xì)的類(lèi)叫做Message.java。這個(gè)Lombok@Data類(lèi)用于對(duì)客戶機(jī)和服務(wù)器(或者“requester”和“responder”,如果您愿意的話)之間的請(qǐng)求和響應(yīng)消息進(jìn)行建模。這個(gè)類(lèi)看起來(lái)像這樣…

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Message {
    private String origin;
    private String interaction;
    private long index;
    private long created = Instant.now().getEpochSecond();

    public Message(String origin, String interaction) {
        this.origin = origin;
        this.interaction = interaction;
        this.index = 0;
    }

    public Message(String origin, String interaction, long index) {
        this.origin = origin;
        this.interaction = interaction;
        this.index = index;
    }
}

使用這個(gè)類(lèi),您可以說(shuō)一條消息來(lái)自何處(它的來(lái)源),它打算使用哪種消息傳遞樣式(交互),以及消息序列中的序列號(hào)(它的索引)。Lombok通過(guò)提供構(gòu)造函數(shù)、getter、setter、toString和hashcode實(shí)現(xiàn)來(lái)簡(jiǎn)化代碼。

控制器類(lèi)

RSocket服務(wù)器控制器代碼可以在RSocketController.java文件中找到。這個(gè)類(lèi)被注釋為Spring@Controller,這本質(zhì)上意味著它聲明了服務(wù)端點(diǎn)(在本例中為RSocket endpoints)。

@Controller
public class RSocketController {

    @MessageMapping("request-response")
    Message requestResponse(Message request) {
            log.info("Received request-response request: {}", request);
            // create a single Message and return it
            return new Message(SERVER, RESPONSE);
    }
}

在類(lèi)中,有一個(gè)名為requestResponse()的方法,它接受單個(gè)消息對(duì)象(請(qǐng)求)并返回單個(gè)消息對(duì)象(響應(yīng))。

您會(huì)注意到,這個(gè)requestResponse()方法用@MessageMapping(“request-response”)注釋修飾。此注釋聲明任何包含請(qǐng)求-響應(yīng)的RSocket路由的元數(shù)據(jù)的消息都應(yīng)該由此方法處理。稍后從客戶端發(fā)送請(qǐng)求消息時(shí),您將使用此路由。

你注意到這和Spring的REST控制器有什么不同嗎?對(duì)于REST控制器,URL路徑映射(如/hello)用于將HTTP調(diào)用與其處理程序方法相關(guān)聯(lián)。

這就是代碼。我們?cè)囋嚳础?/p>

步驟3:?jiǎn)?dòng)Spring Boot RSocket服務(wù)器

在第二個(gè)終端窗口中,保持現(xiàn)有終端窗口處于打開(kāi)狀態(tài),將rsocket server文件夾設(shè)置為當(dāng)前目錄。然后使用以下命令構(gòu)建并運(yùn)行RSocket服務(wù)器:

./mvnw clean package spring-boot:run -DskipTests=true

或者,如果愿意的話,可以在javaide中使用“Build”和“Run”命令。

步驟4:使用RSocket CLI向服務(wù)器發(fā)送命令

接下來(lái),您將使用在步驟1中下載并測(cè)試的RSocket client rsc.jar向正在運(yùn)行的服務(wù)器發(fā)送一條消息。返回到原來(lái)的終端窗口,在那里有--help文本并發(fā)出以下命令:

java -jar rsc.jar --debug --request --data "{\"origin\":\"Client\",\"interaction\":\"Request\"}" --route request-response tcp://localhost:7000

您將注意到該命令聲明了一個(gè)RSocket消息路由(這是通過(guò)添加--route選項(xiàng)并指定路由的名稱(chēng)來(lái)實(shí)現(xiàn)的)。在本例中,路由是請(qǐng)求-響應(yīng),它與RSocketController.java中請(qǐng)求-響應(yīng)處理程序方法中聲明的@MessageMapping匹配。

當(dāng)命令運(yùn)行時(shí),您將在終端窗口中看到一些調(diào)試信息,解釋在請(qǐng)求-響應(yīng)交互期間發(fā)生的事情。它看起來(lái)像這樣:

2020-02-27 11:20:21.806 DEBUG --- [actor-tcp-nio-1] i.r.FrameLogger : sending ->
Frame => Stream ID: 1 Type: REQUEST_RESPONSE Flags: 0b100000000 Length: 69
Metadata:
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 10 72 65 71 75 65 73 74 2d 72 65 73 70 6f 6e 73 |.request-respons|
|00000010| 65                                              |e               |
+--------+-------------------------------------------------+----------------+
Data:
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 7b 22 6f 72 69 67 69 6e 22 3a 22 43 6c 69 65 6e |{"origin":"Clien|
|00000010| 74 22 2c 22 69 6e 74 65 72 61 63 74 69 6f 6e 22 |t","interaction"|
|00000020| 3a 22 52 65 71 75 65 73 74 22 7d                |:"Request"}     |
+--------+-------------------------------------------------+----------------+
2020-02-27 11:20:21.927 DEBUG --- [actor-tcp-nio-1] i.r.FrameLogger : receiving ->
Frame => Stream ID: 1 Type: NEXT_COMPLETE Flags: 0b1100000 Length: 81
Data:
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 7b 22 6f 72 69 67 69 6e 22 3a 22 53 65 72 76 65 |{"origin":"Serve|
|00000010| 72 22 2c 22 69 6e 74 65 72 61 63 74 69 6f 6e 22 |r","interaction"|
|00000020| 3a 22 52 65 73 70 6f 6e 73 65 22 2c 22 69 6e 64 |:"Response","ind|
|00000030| 65 78 22 3a 30 2c 22 63 72 65 61 74 65 64 22 3a |ex":0,"created":|
|00000040| 31 35 38 32 38 30 32 34 32 31 7d                |1582802421}     |
+--------+-------------------------------------------------+----------------+
{"origin":"Server","interaction":"Response","index":0,"created":1582802421}

您看到的調(diào)試輸出被分成三個(gè)“消息幀”。第一個(gè)消息幀被標(biāo)記為Metadata。在本例中,它顯示發(fā)送到服務(wù)器的路由元數(shù)據(jù)(請(qǐng)求-響應(yīng))。第二幀顯示客戶機(jī)發(fā)送給服務(wù)器的數(shù)據(jù)消息(一個(gè)JSON字符串)。第三幀顯示服務(wù)器返回給客戶機(jī)的響應(yīng)消息(也是一個(gè)JSON字符串)。

在最后一行,您可以看到來(lái)自服務(wù)器的JSON格式的響應(yīng)被單獨(dú)打印出來(lái),確認(rèn)我們的命令消息已被服務(wù)器成功接收和確認(rèn):

{"origin":"Server","interaction":"Response","index":0,"created":1582802421}

你剛剛使用RSocket發(fā)送了一條請(qǐng)求-響應(yīng)消息?,F(xiàn)在可以通過(guò)在終端窗口中按Ctrl-C或關(guān)閉RSocket服務(wù)器來(lái)停止RSocket服務(wù)器。如果您使用IDE運(yùn)行RSocket服務(wù)器,您可以用通常的方式停止IDE中的進(jìn)程。

工作原理

你下載的RSocket rsc客戶端使用RSocket消息傳遞協(xié)議向RSocketController發(fā)送請(qǐng)求消息。消息通過(guò)TCP發(fā)送到tcp://localhost:7000服務(wù)器正在等待的位置。

在第一消息幀中發(fā)送消息路由指令。此路由指令使用CLI客戶端的--route選項(xiàng)設(shè)置,并設(shè)置為request-response。Spring使用這個(gè)路由信息來(lái)選擇正確的@MessageMapping端點(diǎn)來(lái)調(diào)用requestResponse(Message-request)方法。然后,該方法用自己的消息進(jìn)行響應(yīng)。CLI客戶機(jī)將終端窗口中的整個(gè)交互打印為一系列消息幀。

如果您繼續(xù)下去,您會(huì)發(fā)現(xiàn)使用springboot編寫(xiě)一個(gè)簡(jiǎn)單的RSocket服務(wù)器是多么容易。

原文地址:https://spring.io/blog/2020/03/02/getting-started-with-rsocket-spring-boot-server

總結(jié)

到此這篇關(guān)于SpringBoot創(chuàng)建RSocket服務(wù)器的文章就介紹到這了,更多相關(guān)SpringBoot創(chuàng)建RSocket服務(wù)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • Java迭代器遍歷list的方法及代碼分析

    Java迭代器遍歷list的方法及代碼分析

    在本篇內(nèi)容里系小編給大家分享的是一篇關(guān)于Java迭代器遍歷list的方法總結(jié)內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。
    2022-11-11
  • 詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟

    詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟

    本文就在項(xiàng)目中來(lái)集成 UidGenerator這一工程來(lái)作為項(xiàng)目的全局唯一 ID生成器。接下來(lái)通過(guò)實(shí)例代碼給大家詳解詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟,感興趣的朋友一起看看吧
    2018-10-10
  • 基于JavaMail實(shí)現(xiàn)郵件發(fā)送

    基于JavaMail實(shí)現(xiàn)郵件發(fā)送

    這篇文章主要為大家詳細(xì)介紹了基于JavaMail實(shí)現(xiàn)郵件發(fā)送功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • SpringCloud中的Feign詳解

    SpringCloud中的Feign詳解

    這篇文章主要介紹了SpringCloud中的Feign詳解,Feign是一個(gè)聲明式的Web Service客戶端,以Java接口注解的方式調(diào)用Http請(qǐng)求,同時(shí)Feign整合了Ribbon和Hystrix,實(shí)現(xiàn)負(fù)載均衡與容斷功能,需要的朋友可以參考下
    2023-09-09
  • redis scan命令導(dǎo)致redis連接耗盡,線程上鎖的解決

    redis scan命令導(dǎo)致redis連接耗盡,線程上鎖的解決

    這篇文章主要介紹了redis scan命令導(dǎo)致redis連接耗盡,線程上鎖的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Java中Optional類(lèi)及orElse方法詳解

    Java中Optional類(lèi)及orElse方法詳解

    這篇文章主要為大家介紹了Java中Optional類(lèi)及orElse()方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • spring整合redis消息監(jiān)聽(tīng)通知使用的實(shí)現(xiàn)示例

    spring整合redis消息監(jiān)聽(tīng)通知使用的實(shí)現(xiàn)示例

    在電商系統(tǒng)中,秒殺,搶購(gòu),紅包優(yōu)惠卷等操作,一般都會(huì)設(shè)置時(shí)間限制,本文主要介紹了spring整合redis消息監(jiān)聽(tīng)通知使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-12-12
  • Java字符流和字節(jié)流對(duì)文件操作的區(qū)別

    Java字符流和字節(jié)流對(duì)文件操作的區(qū)別

    本篇文章主要介紹了Java的IO流分為字符流(Reader,Writer)和字節(jié)流(InputStream,OutputStream),字節(jié)流顧名思義字節(jié)流就是將文件的內(nèi)容讀取到字節(jié)數(shù)組,對(duì)初學(xué)者很有用,有需要的朋友可以了解一下。
    2016-10-10
  • Java實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲示例代碼

    Java實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲示例代碼

    這篇文章主要為大家介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的五子棋游戲,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java游戲開(kāi)發(fā)有一定幫助,需要的可以參考一下
    2022-05-05
  • java生成彩色附logo二維碼

    java生成彩色附logo二維碼

    這篇文章主要為大家介紹了java生成帶logo的多彩二維碼,比一般二維碼顏色鮮艷,美觀,如何生成二維碼,下面小編為大家分享實(shí)現(xiàn)代碼,感興趣的小伙伴們可以參考一下
    2016-04-04

最新評(píng)論