什么是 RSocket
RSocket 是一種二進(jìn)制協(xié)議,可以使用任何字節(jié)流傳輸方式,比如 TCP,UDP,WebSocket,Aeron。
它的官方網(wǎng)站:
https://rsocket.io/(鏈接可能訪問不暢)。
它通過單一連接傳輸異步消息,支持以下幾種交互模式:
- 請(qǐng)求 / 響應(yīng)( 1 : 1 )
- 請(qǐng)求 / 流 ( 1 : N )
- 發(fā)射了不管 ( 1 : 0 )
- 雙向流( N : N )
它的底層協(xié)議符合 Reactive Streams 語(yǔ)義(鏈接可能訪問不暢)。
從它叫 RSocket 這個(gè)名字,就能看出它的野心勃勃。這讓我想起了當(dāng)年 ZeroMQ 想成為 Linux 基礎(chǔ)網(wǎng)絡(luò)庫(kù)呢。
我的一些理解
既然有了 Dubbo,gRPC,HTTP 2,Thrit,XXX... 為什么還需要 RSocket 呢?
拿我最熟悉的 gRPC 來對(duì)比,gRPC 也支持那四種交互模式,也是二進(jìn)制協(xié)議,支持多語(yǔ)言,為啥 RSocket 更好呢?
我覺得最重要的,是 RSocket 基于 Reactive Streams 語(yǔ)義,并且是一種比較底層的協(xié)議。
Reactive Streams 是比較標(biāo)準(zhǔn)化的東西,JDK 9 直接內(nèi)置了支持。
上面列舉的那些協(xié)議,都自帶自己的傳輸方式,使用的范圍自然比更底層的協(xié)議要窄。
而且,RSocket 得到了多個(gè)大廠的支持:
- RSocket 出自 Netflix
- Facebook 將 Thrit 捐給 Apache 基金會(huì)后,自己又 Fork 了一個(gè)內(nèi)部分支,底層基于 RSocket
- 阿里的 Dubbo 集成了 RSocket
- Pivotal 使勁將 RSocket 集成入 Spring
Broker 模式
Spring Cloud Gateway 支持 RSocket 的 Broker 模式。
簡(jiǎn)單說,這種模式是:
- 一堆 Spring Cloud Gateway 組成集群
- 服務(wù)生產(chǎn)者和消費(fèi)者用 Client 模式接入集群,連接時(shí)提供注冊(cè)信息
- 經(jīng)過上面這么一搞,其實(shí)就不分生產(chǎn)者和消費(fèi)者了,大家可以互相調(diào),通過 Gateway 轉(zhuǎn)發(fā),有點(diǎn)像 SOA 服務(wù)總線了
- 由于都是連到集群,只需暴露集群地址,傳統(tǒng)意義上的服務(wù)端就可以隱藏起來了,安全
- 權(quán)限,日志等等都在 Broker 上做
所有請(qǐng)求都通過轉(zhuǎn)發(fā),具體到一個(gè)調(diào)用,比直接連接要多耗時(shí)間。但是,當(dāng)應(yīng)用規(guī)模大了,復(fù)雜了,多花的時(shí)間就很值得了:
- 不關(guān)心互相調(diào)用的權(quán)限控制(除了處理跟 Gateway 間的權(quán)限)
- 無(wú)需單獨(dú)的服務(wù)發(fā)現(xiàn)服務(wù)
- 沒有斷路器
- 沒有客戶端負(fù)載均衡
- 沒有 Sidecar
- 解決啟動(dòng)順序問題
- 解決服務(wù)熱身的問題
- 代替消息隊(duì)列
很好,你已經(jīng)成功引起了我的注意!雖然有點(diǎn)新瓶裝舊酒的意思,不過還挺期待這種模式趕快成熟呢。
參考資料
- RSocket 基于消息傳遞的反應(yīng)式應(yīng)用層網(wǎng)絡(luò)協(xié)議
- Reactive Architectures with RSocket and Spring Cloud Gateway
- RSocket Messaging with Spring
- RSocket: Solving Real-World Architectural Challenges
本文首發(fā)于微信公眾號(hào):肖念青,轉(zhuǎn)載請(qǐng)保留原始出處信息。
我的個(gè)人網(wǎng)站:https://www.jitao.tech