Spring 官方 RSocket Broker 0.3.0 發(fā)布: 快速構(gòu)建你的 RSocke架構(gòu)
Spring官方的RSocket Broker其實(shí)開發(fā)已經(jīng)非常久了,我以為會(huì)伴隨著Spring Cloud 2021.0發(fā)布的,但是沒(méi)有發(fā)生。不過(guò)Spring RSocket Broker還是發(fā)布了最新的0.3版本,雖然還是預(yù)覽版,但目前已經(jīng)可用,考慮官方還沒(méi)有提供對(duì)應(yīng)的文檔,大家入門做Demo還有些困難,所以這篇文章就是幫你快速入門Spring RSocket Broker,同時(shí)解析一下RSocket Broker的特性。
一 Spring RSocket Broker架構(gòu)
首先讓我們看一下Spring RSocket Broker的架構(gòu)圖,如下:
RSocket Broker為一個(gè)集群對(duì)外提供服務(wù),其主要服務(wù)就是應(yīng)用注冊(cè)和RSocket請(qǐng)求的轉(zhuǎn)發(fā),集群中的每一個(gè)Broker都維護(hù)著統(tǒng)一的全局路由表。RSocket Broker有兩個(gè)監(jiān)聽端口:8001端口主要負(fù)責(zé)提供對(duì)外RSocket服務(wù),如應(yīng)用到Broker之間的長(zhǎng)連接,然后就是該長(zhǎng)連接之上的RSocket請(qǐng)求的發(fā)送和接收。7001端口主要負(fù)責(zé)集群內(nèi)部Broker節(jié)點(diǎn)之間的通訊,如同步應(yīng)用接入的元數(shù)據(jù)信息,確保全局服務(wù)路由表的統(tǒng)一,還包括Broker之間的請(qǐng)求轉(zhuǎn)發(fā),當(dāng)然Broker之間的通訊協(xié)議還是RSocket。
當(dāng)一個(gè)服務(wù)應(yīng)用和Broker建立連接時(shí),會(huì)將一些基礎(chǔ)信息發(fā)送給Broker,對(duì)應(yīng)的屬性主要包括:路由節(jié)點(diǎn)ID(routeId)、服務(wù)名稱(sevice-name), tags(標(biāo)簽)。
- 路由節(jié)點(diǎn)ID(routeId): 這個(gè)是應(yīng)用到broker創(chuàng)建的長(zhǎng)連接的唯一標(biāo)識(shí),通常是UUID,當(dāng)然也可以用戶自己指定,連接的唯一性會(huì)讓各個(gè)Broker集群的全局路由表處理方便很多。注意routeId是長(zhǎng)連接的標(biāo)識(shí),不是應(yīng)用的標(biāo)識(shí),應(yīng)用的標(biāo)識(shí)是通過(guò)tags進(jìn)行標(biāo)識(shí)的。如果一個(gè)應(yīng)用和broker創(chuàng)建兩條長(zhǎng)連接,那么就有兩個(gè)不同的routeId,當(dāng)然這種情況下每一條連接可以提供不同的服務(wù)名稱。
- 服務(wù)名稱:這個(gè)其實(shí)就是服務(wù)的DNS Name,如果其他應(yīng)用想調(diào)用該應(yīng)用提供的RSocket服務(wù),就需要指定該服務(wù)名稱。雖然Spring RSocket提供了messageMapping,但是mapping的key是應(yīng)用內(nèi)部的,并不能保證全局唯一,只有Service Name + RSocket Mapping Key才能定位指定的服務(wù),這個(gè)和http的原理是一致:Mapping Key類似HTTP Path,而Service Name類似域名。
- 標(biāo)簽:標(biāo)簽是用于標(biāo)識(shí)應(yīng)用提供的RSocket服務(wù),當(dāng)然RSocket Broker規(guī)范也提供了一些缺省的標(biāo)簽,如InstanceName, ClusterName, Region, MajorVersion等。標(biāo)簽不只是服務(wù)的元信息,此外還可以參與到服務(wù)路由上。如可以設(shè)置服務(wù)版本、集群名稱等,之前開發(fā)中老大難的定向路由就可以通過(guò)標(biāo)簽輕松解決,如可以給服務(wù)打上InstanceName=app-leijuan的標(biāo)簽,然后在調(diào)用中設(shè)置InsanceName就可以調(diào)用某位開發(fā)者啟動(dòng)的服務(wù)實(shí)例。大家不用擔(dān)心基于Tag的路由性能問(wèn)題,背后有Roaring BitMap支持,速度非??臁?/li>
應(yīng)用可以向集群中的一個(gè)或者幾個(gè)RSocket Broker節(jié)點(diǎn)注冊(cè),這個(gè)取決于Broker Client的配置,這個(gè)稍后我們還會(huì)講到。
注意: 這里大家不要將ServiceName僅理解為Java的Interface的全稱,如com.example.user.UserService,那么當(dāng)一個(gè)應(yīng)用有多個(gè)這樣的Java服務(wù)時(shí),那么處理起來(lái)就比較麻煩啦。事實(shí)上serviceName主要用在請(qǐng)求路由上,如一個(gè)服務(wù)應(yīng)用同時(shí)包括UerService, UserExtraService多個(gè)服務(wù)接口,你可以將ServiceName設(shè)置為com.example.user方式,當(dāng)然還要保證ServiceName唯一,原先的RSocket routing key調(diào)整為UserService.findUserById這種Interface name + Method name方式,這樣就沒(méi)有問(wèn)題啦。
當(dāng)一個(gè)應(yīng)用注冊(cè)到Broker上后,如果該應(yīng)用想調(diào)用某一RSocket服務(wù),只需要根據(jù)Service Name + Routing key就可以向Broker發(fā)起RSocket調(diào)用請(qǐng)求,然后Broker會(huì)根據(jù)內(nèi)部的全局路由表,找到能夠提供服務(wù)的服務(wù)節(jié)點(diǎn)(RouteId),然后將請(qǐng)求轉(zhuǎn)發(fā)給對(duì)應(yīng)的服務(wù)節(jié)點(diǎn),服務(wù)節(jié)點(diǎn)處理完畢后將response返回給Broker,Broker再將response返回給調(diào)用方。
如果當(dāng)前Broker節(jié)點(diǎn)上并沒(méi)有對(duì)應(yīng)的服務(wù)路由接入,這個(gè)是Broker會(huì)將請(qǐng)求轉(zhuǎn)發(fā)給有服務(wù)節(jié)點(diǎn)的Broker,這個(gè)就是請(qǐng)求轉(zhuǎn)發(fā),然后再將那個(gè)Broker處理的結(jié)果返回給調(diào)用方。有同學(xué)可能會(huì)問(wèn),這里可能存在一個(gè)調(diào)用鏈死循環(huán)的問(wèn)題,如broker1將請(qǐng)求轉(zhuǎn)發(fā)發(fā)給broker3,broker3上的服務(wù)突然下線也不存在,Broker3可能發(fā)回給Broker1,然后broker1再找其他broker發(fā)送?這種情況是不會(huì)發(fā)生的,Broker之間會(huì)同步應(yīng)用上下線信息,所以每一個(gè)Broker都維護(hù)著集群統(tǒng)一的全局路由表,所以broker1給broker2轉(zhuǎn)發(fā)消息,broker2上一定有對(duì)應(yīng)服務(wù)的route連接,即便broker2上突發(fā)狀況,服務(wù)對(duì)應(yīng)的route沒(méi)啦,那么會(huì)再轉(zhuǎn)發(fā)給有服務(wù)的broker,當(dāng)然如果都沒(méi)有找到,這個(gè)時(shí)候請(qǐng)求會(huì)被Broker保留(hold)住,在超時(shí)后會(huì)返回錯(cuò)誤。
二 Spring RSocket Broker項(xiàng)目樣例
接下來(lái)我們就看一個(gè)真實(shí)的開發(fā)樣例,三個(gè)應(yīng)用:一個(gè)Broker Server,一個(gè)服務(wù)提供者,一個(gè)服務(wù)調(diào)用者。Spring RSocket Broker對(duì)應(yīng)的開發(fā)包已經(jīng)提交到Maven倉(cāng)庫(kù),大家可以在文末鏈接查看。
1 RSocket Broker Server
RSocket Broker Server是一個(gè)標(biāo)準(zhǔn)的Spring Boot應(yīng)用,你只需要在Spring Boot應(yīng)用添加以下依賴:
- <dependency>
- <groupId>io.rsocket.broker</groupId>
- <artifactId>rsocket-broker-spring</artifactId>
- <version>0.3.0</version>
- </dependency>
然后在application.yaml文件中添加以下配置:
- io.rsocket.broker:
- uri: tcp://0.0.0.0:8001
- cluster.uri: tcp://0.0.0.0:7001
然后啟動(dòng)Spring Boot應(yīng)用,Broker也就啟動(dòng)啦,并監(jiān)聽7001和8001端口。有同學(xué)可能會(huì)問(wèn),為何不提供一個(gè)獨(dú)立的應(yīng)用來(lái)啟動(dòng)RSocket Broker?這個(gè)可能是Spring Cloud項(xiàng)目的出發(fā)點(diǎn)相關(guān),和Spring Config Server,Registry Server一樣,都是被應(yīng)用嵌入的,主要是方便開發(fā)者定制Broker的功能,如添加Web Console,對(duì)接Ops系統(tǒng)等,靈活性會(huì)就非常高。
2 RSocket Service Provider
接下來(lái)我們?cè)賱?chuàng)建一個(gè)Spring Boot應(yīng)用,對(duì)外提供RSocket服務(wù),首先添加一下以下依賴:spring-boot-starter-rsocket是標(biāo)準(zhǔn)的,方便Spring Boot應(yīng)用集成RSocket,另外就是rsocket-broker-client-spring,這個(gè)是Broker Spring Client,負(fù)責(zé)完成和RSocket Broker的對(duì)接。
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-rsocket</artifactId>
- </dependency>
- <dependency>
- <groupId>io.rsocket.broker</groupId>
- <artifactId>rsocket-broker-client-spring</artifactId>
- <version>0.3.0</version>
- </dependency>
然后在服務(wù)應(yīng)用的application.yaml添加以下Broker Client配置,這里要說(shuō)明service-name,建議采用前面談到的DNS命名方式,這樣可以確保服務(wù)名不會(huì)沖突。接下來(lái)就是brokers的地址列表,如下:
- io.rsocket.broker.client:
- service-name: com.example.PongService
- brokers:
- - tcp://localhost:8001
接下來(lái)我們還需要寫一個(gè)RSocket服務(wù),這個(gè)就是標(biāo)準(zhǔn)的Spring RSocket,代碼如下:
- @Controller
- public class PongController {
- @MessageMapping("pong")
- public Mono<String> pong(String ping) {
- return Mono.just("hello " + ping);
- }
- }
然后我們啟動(dòng)該服務(wù)應(yīng)用,就會(huì)在RSocket Broker的日志輸出中看到該應(yīng)用注冊(cè)到Broker的信息,這樣RSocket服務(wù)就完成了在Broker上的注冊(cè)。
3 RSocket Service Consumer
接下來(lái)我們還要?jiǎng)?chuàng)建一個(gè)應(yīng)用用于調(diào)用RSocket服務(wù),和服務(wù)應(yīng)用一樣,添加相同的依賴,由于該應(yīng)用并不對(duì)外提供RSocket服務(wù),你將service-name調(diào)整為Namespace + 應(yīng)用名稱即可,主要是不要和其他應(yīng)用不要重名即可,如下:
- io.rsocket.broker.client:
- service-name: com.example.apps.${spring.application.name}
- brokers:
- - tcp://localhost:8001
接下來(lái)就是編寫一個(gè)Web Controller訪問(wèn)RSocket服務(wù),只需要注入BrokerRSocketRequester Bean,然后調(diào)用RSocket服務(wù),這個(gè)和Spring RSocket的RSocketRequester使用方法類似,代碼如下:
- @RestController
- public class PortalController {
- @Autowired
- private BrokerRSocketRequester requester;
- @GetMapping("/")
- public Mono<String> index() {
- return requester.route("pong")
- .address("com.example.PongService")
- .data("ping")
- .retrieveMono(String.class);
- }
- }
啟動(dòng)該應(yīng)用后,你就可以使用curl命令進(jìn)行測(cè)試,就可以看到熟悉的`Hello ping`輸出。
你有可能覺得這個(gè)客戶端調(diào)用比較原始, 其實(shí)你只要集成一下spring-retrosocket,然后就是你熟悉的Java接口,樣例如下:
- @RSocketBrokerClient
- interface GreetingClient {
- @MessageMapping("pong")
- @ServiceAddress("com.example.PongService")
- Mono<String> pong(String ping);
- }
三 Spring RSocket Broker的一些思考
1 RSocket Broker特性
Spring RSocket Broker開發(fā)已經(jīng)挺久了,開發(fā)者都是Spring Cloud團(tuán)隊(duì)成員,Oleh在Reactive和RSocket方面非常資深,Spencer也是Spring Cloud的核心架構(gòu)師。Spencer在多個(gè)大會(huì)場(chǎng)合講述RSocket給Spring Cloud帶來(lái)的變化,完全是顛覆性的。從上述的應(yīng)用樣例你也可以看出,不提Reactive全異步的性能,你不再需要服務(wù)注冊(cè),你也不需要本地啟動(dòng)接聽端口,介入Broker轉(zhuǎn)發(fā)后混各種云的服務(wù)都可以通過(guò)Broker進(jìn)行相互調(diào)用。關(guān)于RSocket Broker的優(yōu)點(diǎn),Spring RSocket Broker有對(duì)應(yīng)的說(shuō)明,如下:
Routing and forwarding are used to forward RSocket requests between two RSocket connections via broker. In some cases, point-to-point interactions between a client and server are enough, in an enterprise environment, it is useful to decouple the client and server from each other. Some examples of why decoupling is necessary include blue/green deployments, load balancing, A/B testing, feature toggles, etc. Additionally, providing an intermediary can help with security and scalability. Finally, with the load balancing, routing and QoS, better overall application latency and throughput can be achieved than by direct connections.
2 RSocket Broker中直接通訊的解決方案
有同學(xué)可能會(huì)有疑問(wèn),經(jīng)過(guò)RSocket Broker會(huì)有一定的性能損失,我這個(gè)應(yīng)用QPS非常高,不能有延遲啊。這樣也沒(méi)有關(guān)系,還記得服務(wù)應(yīng)用中添加了 spring-boot-starter-rsocket依賴嗎?我們只需要在application.yaml中添加以下配置項(xiàng)就可以打開RSocket的服務(wù)監(jiān)聽端口,然后再通過(guò)RSocket Broker提供的元信息,然后我們使用RSocketRequester創(chuàng)建到目標(biāo)服務(wù)的連接即可。有一些工作量,但是已經(jīng)非常小,我們只需要使用reactor-pool自動(dòng)管理直接連接的連接池就可以。
- spring.rsocket.server.transport: tcp
- spring.rsocket.server.port: 42252
3 RSocket Broker請(qǐng)求等待
Spring RSocket Broker還有一個(gè)特性就是服務(wù)上線延遲支持。舉一個(gè)例子,假設(shè)App-1和Service-1都在線上運(yùn)行正常,突然Service-1的實(shí)例都下線啦,這個(gè)時(shí)候從app-1發(fā)出去的請(qǐng)求就找不到目標(biāo)節(jié)點(diǎn),這個(gè)時(shí)候該如何處理?
- 拒絕請(qǐng)求,馬上返回失敗:這個(gè)就是我們常說(shuō)的快速失敗的設(shè)計(jì),在企業(yè)架構(gòu)設(shè)計(jì)中使用的比較多。如果是采用同步通訊和Thread Pool模式,你基本上必須使用該設(shè)計(jì),不然較長(zhǎng)時(shí)間的線程堵塞馬上讓你服務(wù)無(wú)法響應(yīng)請(qǐng)求。
- 等待服務(wù)上線:就是Broker先保留(hold)請(qǐng)求,然后等服務(wù)上線后再轉(zhuǎn)發(fā)給上線的服務(wù)。這個(gè)設(shè)計(jì)有時(shí)非常有用,如在FaaS場(chǎng)景,Gateway上已經(jīng)驗(yàn)證該函數(shù)是存在的,目前只是函數(shù)下線,所以觸發(fā)一下函數(shù)上線然后請(qǐng)求等待就可以。此外還有就是網(wǎng)絡(luò)抖動(dòng)的問(wèn)題,會(huì)導(dǎo)致連接被中斷,這個(gè)時(shí)候也可以選擇等待服務(wù)上線。另外還有一個(gè)場(chǎng)景就是服務(wù)發(fā)布,如一個(gè)長(zhǎng)尾服務(wù)只有一個(gè)實(shí)例,只要你能在3-5秒內(nèi)將應(yīng)用重新啟動(dòng)完畢,這個(gè)時(shí)候broke就可以幫你hold住請(qǐng)求,再配合上客戶端的retry,即便只有一個(gè)實(shí)例,也不會(huì)感覺到服務(wù)被中斷。如在K8S中,將應(yīng)用的鏡像設(shè)置為last,然后在設(shè)置為獲取最新,這樣一個(gè)redploy button就可以啦。當(dāng)然這個(gè)請(qǐng)求等待時(shí)間也不是無(wú)限長(zhǎng)的,你可以設(shè)置一個(gè)超時(shí)時(shí)間,然后返回錯(cuò)誤就可以。
回到上述的場(chǎng)景,Broker-1這時(shí)候就會(huì)保留(hold)住請(qǐng)求,當(dāng)service-1上線后,請(qǐng)求會(huì)馬上被轉(zhuǎn)發(fā)到上線的節(jié)點(diǎn)上處理。和同步通訊不一樣,異步的等待對(duì)Reactive系統(tǒng)并無(wú)系統(tǒng)壓力,所以等待服務(wù)上線完全是沒(méi)有問(wèn)題。當(dāng)然至于那種模式,你可以根據(jù)實(shí)際的技術(shù)需要進(jìn)行選擇,RSocket Broker同時(shí)支持這兩個(gè)模式。
4 消息廣播模型
Spring RSocket Broker還支持消息的廣播,也就是將RSocket請(qǐng)求轉(zhuǎn)發(fā)給一批服務(wù)節(jié)點(diǎn)。消息廣播主要包括以下模型:
- fireAndForget模型:如配置推送場(chǎng)景,將配置更新請(qǐng)求發(fā)給service-name對(duì)應(yīng)的服務(wù)列表即可。
- requestResponse模型:將請(qǐng)求發(fā)送給多個(gè)服務(wù),然后將第一個(gè)響應(yīng)的response返回給調(diào)用方,不論是響應(yīng)的結(jié)果是成功還是失敗,這個(gè)和JavaScript的Promise.race()類似。Promise.race()特性,業(yè)務(wù)上場(chǎng)景好像不多,為了方便理解這里添加一個(gè)timeout,將其轉(zhuǎn)換為:"在指定時(shí)間內(nèi)最快地將結(jié)正確的結(jié)果返回"。如在數(shù)據(jù)同步的場(chǎng)景中,數(shù)據(jù)會(huì)同步到多個(gè)備份服務(wù)器上,但是由于種種原因,可能導(dǎo)致備份服務(wù)器上的數(shù)據(jù)同步出現(xiàn)延遲或者丟失,于是我向多個(gè)備份服務(wù)器查詢數(shù)據(jù),并約定如果備份服務(wù)器上沒(méi)有該數(shù)據(jù),則在1秒超時(shí)后返回異常,這樣就可以保證以最快的速度從備份服務(wù)器集群上拿到正確數(shù)據(jù)。當(dāng)然在實(shí)際的架構(gòu)中,我們會(huì)加上一層cache支持,避免同時(shí)向服務(wù)發(fā)起多個(gè)請(qǐng)求,浪費(fèi)的資源也比較多。
- requestStream模型:將請(qǐng)求發(fā)送給多個(gè)服務(wù)方,然后將返回的stream進(jìn)行匯總,然后將合并的消息流返回給調(diào)用方。在監(jiān)控的場(chǎng)景非常有用,你希望各個(gè)服務(wù)或應(yīng)用將5分鐘內(nèi)的日志都匯報(bào)上來(lái),然后進(jìn)行統(tǒng)計(jì),這個(gè)時(shí)候就非常有幫助。
- Channel模型:連續(xù)地向多個(gè)服務(wù)方的channel發(fā)送信息,然后將發(fā)出的信息再進(jìn)行匯總。如你有多個(gè)指定要發(fā)送出去,然后將各個(gè)應(yīng)用上對(duì)指定的響應(yīng)結(jié)果進(jìn)行匯總,就可以采用這個(gè)模型。
從上述的幾個(gè)模型看下來(lái),基本上可以涵蓋眾多的廣播需求。如公司要你做一個(gè)config server進(jìn)行配置推送,借助RSocket Broker是不是分分鐘就能搞定。借助RSocket Broker + Agent完成運(yùn)維操作、日志采集等,是不是也不麻煩啦。在Prometheus的metrics定時(shí)采集場(chǎng)景,只需要發(fā)一個(gè)指令,就可以收集到所有機(jī)器上的metrics,比起向一臺(tái)臺(tái)節(jié)點(diǎn)發(fā)起HTTP請(qǐng)求,這種方式簡(jiǎn)單很多。
5 Gateway和Broker
大多數(shù)的Gateway設(shè)計(jì)都采用主動(dòng)連接的方式,也就是Gateway主動(dòng)去連接上游服務(wù)的Proxy模式,當(dāng)然要連接到上游服務(wù)還需要借助服務(wù)注冊(cè)發(fā)現(xiàn),智能DNS等,其中的原理就不贅述啦。而Broker架構(gòu)則采用被動(dòng)模式,也就是等待服務(wù)連接到Broker上,也就是當(dāng)服務(wù)Ready后,主動(dòng)連接到Broker就可以,然后基于應(yīng)用和Broker之間建立的長(zhǎng)連接,進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)即可。對(duì)比Gateway架構(gòu),Broker模式簡(jiǎn)單很多,內(nèi)部不用管理上游服務(wù)的連接池,不需要服務(wù)注冊(cè)發(fā)現(xiàn),當(dāng)然對(duì)網(wǎng)絡(luò)也沒(méi)有特殊的打通要求,混合云的場(chǎng)景也適用等。
RSocket Broker雖然是基于RSocket協(xié)議的,但是還可以通過(guò)Bridge橋接的方式支持各種協(xié)議,如RSocket HTTP Bridge就可以擴(kuò)展支持HTTP接入。
6 嵌入式的RSocket Broker
回答前面的問(wèn)題,RSocket Broker是被應(yīng)用嵌入的,你需要添加對(duì)應(yīng)的依賴和配置,然后啟動(dòng)對(duì)應(yīng)的應(yīng)用,這個(gè)和Spring Config Server等都是類似的,主要是方便開發(fā)者擴(kuò)展Broker對(duì)應(yīng)的特性,和其他系統(tǒng)進(jìn)行集成。結(jié)合前面介紹的RSocket Broker特性,我們通過(guò)嵌入RSocket Broker,馬上就可以實(shí)現(xiàn)一些典型的業(yè)務(wù)場(chǎng)景:
- Config/Registry Server: 既然應(yīng)用已經(jīng)和Broker建立了長(zhǎng)連接,元信息也都發(fā)送給Broker,所以Registry Server就水到渠成。RSocket Broker支持各種消息廣播模型,所以Config Server基本也就緒啦。單個(gè)應(yīng)用的配置推送,基于獨(dú)立tag推送,基于Service Name整體推送,全部沒(méi)有問(wèn)題。
- Web控制臺(tái):嵌入Broker后,再開發(fā)一個(gè)web控制臺(tái),這個(gè)對(duì)Spring Boot來(lái)說(shuō)非常簡(jiǎn)單。
- Data Gateway:如果你想做一個(gè)Data Gateway對(duì)外提供數(shù)據(jù)訪問(wèn)服務(wù),所有data worker節(jié)點(diǎn)連接到Broker,然后broker對(duì)外提供服務(wù)即可。
- Ops系統(tǒng)整合:這個(gè)使用Spring Boot整合即可,其他諸如對(duì)接入應(yīng)用的健康度檢查等,這個(gè)只要發(fā)一個(gè)消息給應(yīng)用即可。
- 應(yīng)用和Broker的優(yōu)雅上下線:通過(guò)推送brokers的配置信息,應(yīng)用可以連接到新的brokers節(jié)點(diǎn)上,完成brokers集群的上下線。應(yīng)用的上下線,在Broker集群中發(fā)一個(gè)ROUTE_REMOVE的消息即可,然后應(yīng)用在3-5后即可下線。
7 Spring RSocket Broker Client
目前RSocket Broker的Client SDK主要包括Java和Node.js,但是其他語(yǔ)言的Broker Client SDK大家也不用擔(dān)心,Broker Client只是在RSocket SDK的Composite Metadata上添加一個(gè)新的 message/x.rsocket.broker.frame.v0 Metadata規(guī)范,借助于RSocket多語(yǔ)言SDK,主流語(yǔ)言開發(fā)的應(yīng)用都可以快速接入到Broker上。
四 總結(jié)
最后有同學(xué)問(wèn)道RSocket現(xiàn)在成熟了嗎?在Spring生態(tài)中,已經(jīng)非常成熟。RSocket Java SDK由Spring團(tuán)隊(duì)開發(fā),Spring RSocket提供了RSocket和Spring的集成,Spring Boot內(nèi)置rsocket-starter,Spring Cloud Function也添加了RSocket支持,考慮Java開發(fā)人員的習(xí)慣,還提供spring-retrosocket。其他Spring產(chǎn)品基本都支持了Reactive,所以對(duì)接通過(guò)Reactive就可以??梢訰Socket外圍全部就緒啦,大家都在苦等RSocket Broker出現(xiàn),這樣集成和部署就更簡(jiǎn)單了。此外當(dāng)前各種的各種服務(wù),如REST API,GraphQL或者RPC框架,遷移到RSocket麻煩嗎?如果是Spring體現(xiàn)的,就是添加一個(gè)@MessageMapping的事情,然后就可以通過(guò)RSocket訪問(wèn)這些服務(wù) 。Dubbo/HSF的服務(wù),在Interface添加上spring-retrosocket提供的Annotation,然后就可以通過(guò)RSocket協(xié)議訪問(wèn)這些服務(wù)啦。REST API在Controller基礎(chǔ)上添加@MessageMapping就可以。至于GraphQL,不需要任何調(diào)整,添加一個(gè)新的GraphqlController對(duì)接GraphQL底層服務(wù)即可。就目前的Spring RSocket Broker特性來(lái)說(shuō),對(duì)于一個(gè)中型企業(yè),可以說(shuō)不用什么調(diào)整,完全可以勝任,這個(gè)就是Spring Config Server,Spring Registry Server和Spring Cloud Gateway的定位是一樣的。
至于Spring Cloud團(tuán)隊(duì)一直在講述RSocket對(duì)Spring Cloud和開發(fā)體驗(yàn)的影響,相信閱讀了這里,你有了自己的判斷。但是還是那句老話:“世有伯樂(lè),然后有千里馬。千里馬常有,而伯樂(lè)不常有”。
如果大家想了解更多的技術(shù)細(xì)節(jié),我在樣例項(xiàng)目的的READM.md中進(jìn)行了說(shuō)明,有興趣可以訪問(wèn)項(xiàng)目的Git倉(cāng)庫(kù)。項(xiàng)目樣例的git倉(cāng)庫(kù)地址為:https://github.com/linux-china/spring-rsocket-broker-demo 歡迎clone試用。
鏈接:https://repo1.maven.org/maven2/io/rsocket/broker/