- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- SpringBoot創(chuàng )建RSocket服務(wù)器的全過(guò)程記錄
在微服務(wù)的多樣化世界中,HTTP是代理到代理通信中無(wú)可爭議的領(lǐng)導者。它成熟,無(wú)處不在。但在某些情況下,HTTP請求-響應可能很麻煩。如果您需要傳統請求-響應之外的通信模式,如fire-and-forget或streaming,該怎么辦?如果你想向任何一個(gè)方向發(fā)送信息呢?
有了HTTP,有很多方法可以實(shí)現這一點(diǎn),但這不是構建協(xié)議的目的。許多解決方案都帶有額外的權衡或缺點(diǎn)。另外,這里沒(méi)有規則手冊說(shuō)“你應該一直使用HTTP”,像AMQP這樣的消息傳遞協(xié)議已經(jīng)證明了這一點(diǎn)。所以,知道你的選擇是什么是好的,每隔一段時(shí)間在你的列表中添加一些新技術(shù)也是健康的。這篇文章是關(guān)于一個(gè)這樣的替代RSocket。
RSocket是一種新的消息傳遞協(xié)議,旨在解決一些常見(jiàn)的微服務(wù)通信難題。使用RSocket,您可以獲得一個(gè)在TCP或WebSockets上工作的靈活協(xié)議。這意味著(zhù)您可以在不進(jìn)行轉換的情況下處理二進(jìn)制消息。您可以使用諸如多路復用、背壓、恢復和路由等現代控件,還可以使用多種消息傳遞模式,包括啟動(dòng)和忘記、請求-響應和流式傳輸。RSocket也是完全反應的,因此它非常適合于高吞吐量的微服務(wù)應用程序。早期采用者包括Netflix、Pivotal、阿里巴巴和Facebook,它們都是提供可伸縮互聯(lián)網(wǎng)服務(wù)的專(zhuān)家。
由于請求-響應是大多數web開(kāi)發(fā)人員熟悉的基礎,因此我們將以這種模式開(kāi)始我們的RSocket之旅。請求-響應的語(yǔ)義相當簡(jiǎn)單,您發(fā)送一個(gè)請求,就得到一個(gè)響應。HTTP是建立在這個(gè)基本的交互之上的,它非常常見(jiàn)。
在本文中,您將了解如何使用RSocket,使用Spring Boot作為服務(wù)器,使用終端應用程序作為客戶(hù)機來(lái)執行請求響應。
請求-響應Request-response只是Spring和RSocket支持的四種交互模型之一。
當您按照下面的步驟操作時(shí),您會(huì )注意到使用springboot構建RSocket服務(wù)器所需的代碼量非常少。這里已經(jīng)為您提供了代碼,但是您也可以在幾分鐘內自己從頭開(kāi)始編寫(xiě)代碼。
首先,檢查是否安裝了以下必備組件:
如果您是Windows用戶(hù),請切換到Microsoft針對Linux的Windows子系統。
現在,將下載的項目文件夾設置為終端中的當前目錄:
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
稍后您將使用此客戶(hù)機與RSocket服務(wù)器進(jìn)行對話(huà),但現在,通過(guò)如下方式調用help命令來(lái)測試它是否正常工作:
java -jar rsc.jar --help
您應該會(huì )看到下面這樣的一些輸出(我已經(jī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)著(zhù),你以后會(huì )需要的。
在IDE中打開(kāi)rsocket服務(wù)器項目并檢查代碼。如您所見(jiàn),在springboot中支持RSocket服務(wù)器所需的代碼非常少。以下是一些亮點(diǎn):
項目文件
在項目的pom.xml文件中,您可以看到Spring Boot RSocket服務(wù)器所需的<dependencies>。之所以使用SpringBootVersion2.2.5.RELEASE,是因為在撰寫(xiě)本文時(shí),該版本具有最適合生產(chǎn)的RSocket特性。該項目還依賴(lài)于lombok和springbootstartersocket庫。Lombok為Java數據類(lèi)添加了構造函數、getter、setter和equals,還簡(jiǎn)化了對日志等內容的訪(fǎng)問(wèn)。RSocket的springbootstarter將RSocket與springboot集成在一起,并在運行時(shí)自動(dòng)為您配置一些RSocket基礎設施。
應用程序屬性
在application.properties文件中,RSocket服務(wù)器的TCP端口被設置為7000,Spring Boot的延遲初始化功能被打開(kāi)。
spring.rsocket.server.port=7000 spring.main.lazy-initialization=true
消息類(lèi)
第一個(gè)更詳細的類(lèi)叫做Message.java。這個(gè)Lombok@Data類(lèi)用于對客戶(hù)機和服務(wù)器(或者“requester”和“responder”,如果您愿意的話(huà))之間的請求和響應消息進(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)源),它打算使用哪種消息傳遞樣式(交互),以及消息序列中的序列號(它的索引)。Lombok通過(guò)提供構造函數、getter、setter、toString和hashcode實(shí)現來(lái)簡(jiǎn)化代碼。
控制器類(lèi)
RSocket服務(wù)器控制器代碼可以在RSocketController.java文件中找到。這個(gè)類(lèi)被注釋為Spring@Controller,這本質(zhì)上意味著(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è)消息對象(請求)并返回單個(gè)消息對象(響應)。
您會(huì )注意到,這個(gè)requestResponse()方法用@MessageMapping(“request-response”)注釋修飾。此注釋聲明任何包含請求-響應的RSocket路由的元數據的消息都應該由此方法處理。稍后從客戶(hù)端發(fā)送請求消息時(shí),您將使用此路由。
你注意到這和Spring的REST控制器有什么不同嗎?對于REST控制器,URL路徑映射(如/hello)用于將HTTP調用與其處理程序方法相關(guān)聯(lián)。
這就是代碼。我們試試看。
在第二個(gè)終端窗口中,保持現有終端窗口處于打開(kāi)狀態(tài),將rsocket server文件夾設置為當前目錄。然后使用以下命令構建并運行RSocket服務(wù)器:
./mvnw clean package spring-boot:run -DskipTests=true
或者,如果愿意的話(huà),可以在javaide中使用“Build”和“Run”命令。
接下來(lái),您將使用在步驟1中下載并測試的RSocket client rsc.jar向正在運行的服務(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選項并指定路由的名稱(chēng)來(lái)實(shí)現的)。在本例中,路由是請求-響應,它與RSocketController.java中請求-響應處理程序方法中聲明的@MessageMapping匹配。
當命令運行時(shí),您將在終端窗口中看到一些調試信息,解釋在請求-響應交互期間發(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}
您看到的調試輸出被分成三個(gè)“消息幀”。第一個(gè)消息幀被標記為Metadata。在本例中,它顯示發(fā)送到服務(wù)器的路由元數據(請求-響應)。第二幀顯示客戶(hù)機發(fā)送給服務(wù)器的數據消息(一個(gè)JSON字符串)。第三幀顯示服務(wù)器返回給客戶(hù)機的響應消息(也是一個(gè)JSON字符串)。
在最后一行,您可以看到來(lái)自服務(wù)器的JSON格式的響應被單獨打印出來(lái),確認我們的命令消息已被服務(wù)器成功接收和確認:
{"origin":"Server","interaction":"Response","index":0,"created":1582802421}
你剛剛使用RSocket發(fā)送了一條請求-響應消息?,F在可以通過(guò)在終端窗口中按Ctrl-C或關(guān)閉RSocket服務(wù)器來(lái)停止RSocket服務(wù)器。如果您使用IDE運行RSocket服務(wù)器,您可以用通常的方式停止IDE中的進(jìn)程。
你下載的RSocket rsc客戶(hù)端使用RSocket消息傳遞協(xié)議向RSocketController發(fā)送請求消息。消息通過(guò)TCP發(fā)送到tcp://localhost:7000服務(wù)器正在等待的位置。
在第一消息幀中發(fā)送消息路由指令。此路由指令使用CLI客戶(hù)端的--route選項設置,并設置為request-response。Spring使用這個(gè)路由信息來(lái)選擇正確的@MessageMapping端點(diǎn)來(lái)調用requestResponse(Message-request)方法。然后,該方法用自己的消息進(jìn)行響應。CLI客戶(hù)機將終端窗口中的整個(gè)交互打印為一系列消息幀。
如果您繼續下去,您會(huì )發(fā)現使用springboot編寫(xiě)一個(gè)簡(jiǎn)單的RSocket服務(wù)器是多么容易。
原文地址:https://spring.io/blog/2020/03/02/getting-started-with-rsocket-spring-boot-server
到此這篇關(guān)于SpringBoot創(chuàng )建RSocket服務(wù)器的文章就介紹到這了,更多相關(guān)SpringBoot創(chuàng )建RSocket服務(wù)器內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站