RSocket入門:Spring Boot伺服器 -Spring.io

banq發表於2020-03-07

微服務的多樣化世界中,HTTP無疑是代理到代理通訊的領導者。它已經成熟,完善,並且無處不在。但是在某些情況下,HTTP請求響應可能很麻煩。如果您需要基於傳統請求響應的通訊模式,例如“一勞永逸”或流式傳輸,該怎麼辦?如果要向任一方向傳送訊息怎麼辦?

RSocket是一種新的訊息傳遞協議,旨在解決一些常見的微服務通訊難題。使用RSocket,您可以獲得在TCP或WebSockets上執行的靈活協議。這意味著您可以執行二進位制訊息而無需轉換。您將獲得諸如多路複用,背壓,恢復和路由之類的現代控制元件,並且您將獲得多種訊息傳遞模式,包括即發即忘,請求響應和流傳輸。RSocket也具有完全反應性,因此非常適合您的高吞吐量微服務應用程式。

這裡下載演示程式碼示例

@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);
    }
}


否注意到這與Spring的REST控制器有什麼不同?在REST控制器中,URL路徑對映(例如)/hello用於將HTTP呼叫與其處理程式方法關聯。這裡使用@MessageMapping("request-response")註解,此註釋宣告此方法應處理任何包含RSocket路由的後設資料訊息。稍後,當您從客戶端傳送請求訊息時,將使用此路由。
在application.properties檔案中,RSocket伺服器的TCP埠設定為7000,並且Spring Boot的惰性初始化功能已開啟。

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


Maven配置檔案加入依賴:

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


測試:
啟動Rsocket伺服器:

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


使用RSocket CLI客戶端向伺服器傳送命令:

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


路由request-response與匹配RSocketController.java中在@MessageMapping宣告的路由。
當命令執行時,您將在終端視窗中看到一些除錯資訊,這些資訊解釋了請求-響應互動期間發生的情況。看起來像這樣:

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}


 

相關文章