Dubbo 3.0 ? No ! RSocket 永遠(yuǎn)的神
背景
最近國(guó)內(nèi)技術(shù)圈最熱門的事情莫過(guò)于 Apache Dubbo 3.0 發(fā)布,作為 Dubbo 3 中最重要的特性是選擇 HTTP/2 作為底層通信協(xié)議,使用 protobuf 作為序列化協(xié)議的組合,這套組合方案也是 gRPC 協(xié)議使用的方案。最終還是沒(méi)有選擇 RSocket 協(xié)議作為 reactive programming (響應(yīng)式編程)的補(bǔ)充方案。
Dubbo 3.0 源碼示例
- RSocket 是一個(gè)新的、語(yǔ)言無(wú)關(guān)的第七層應(yīng)用網(wǎng)絡(luò)協(xié)議。它是一個(gè)雙向、多路復(fù)用、基于消息、基于反應(yīng)流背壓的二進(jìn)制協(xié)議。和傳統(tǒng)網(wǎng)絡(luò)編程模型 HTTP 的 Request/Response 方式不同。RSocket 除了 Request/Response 方式之外,還支持 Fire And Forget(發(fā)送不回)、Stream(單向流)、Channel(雙向流)。
- RSocket 的基礎(chǔ)可以參考筆者 《RSocket | 替代 REST 的不二選擇》文章參考學(xué)習(xí)。
- 本文著重說(shuō)明 Spring 官方孵化器新上項(xiàng)目 spring-retrosocket 使用。
Spring 孵化器截圖
spring-retrosocket 通過(guò)提供注解驅(qū)動(dòng) RSocket 的客戶端,通過(guò)注解調(diào)用屏蔽 rosocket-java sdk 的復(fù)雜性。
1. 創(chuàng)建 RSocket Server
創(chuàng)建 spring boot 項(xiàng)目,添加相關(guān)依賴即可
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-rsocket</artifactId>
- </dependency>
指定 rsocket server 服務(wù)端口即可
- spring.rsocket.server.port=8848
定義 RR 請(qǐng)求模型處理信道
使用 @MessageMapping 指定路由路徑即可
- @Controller
- public class GreetingsController {
- @MessageMapping("request-response")
- Mono<String> reqResponse(@Payload String payload) {
- log.info("收到 RR 請(qǐng)求信息: {}", payload);
- return Mono.just("Hello, " + payload);
- }
- }
2. 使用 spring-retrosocket 創(chuàng)建客戶端
- 使用 Spring Initializr 并生成一個(gè)新項(xiàng)目。
依賴 | 版本 |
---|---|
spring-retrosocke | 0.0.1-SNAPSHOT |
Spring Boot | 2.5.2 |
- <dependency>
- <groupId>org.springframework.retrosocket</groupId>
- <artifactId>spring-retrosocket</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </dependency>
- 添加 spring maven 倉(cāng)庫(kù)
如果您有一個(gè)現(xiàn)有的構(gòu)建,請(qǐng)確保您擁有spring-milestones或spring-snapshotsSpring 存儲(chǔ)庫(kù)。
- <repositories>
- <repository>
- <id>spring-milestones</id>
- <name>Spring Milestones</name>
- <url>https://repo.spring.io/milestone</url>
- </repository>
- <repository>
- <id>spring-snapshots</id>
- <name>Spring Snapshots</name>
- <url>https://repo.spring.io/snapshot</url>
- <snapshots>
- <enabled>true</enabled>
- </snapshots>
- </repository>
- </repositories>
3. 基本用法
- 開(kāi)啟 RSocket 客戶端支持 在您的 Java 代碼中,您需要啟用 RSocket 客戶端支持。使用@EnableRSocketClient注釋。您還需要定義一個(gè)RSocketRequesterbean。
- @SpringBootApplication
- @EnableRSocketClients
- class RSocketClientApplication {
- @Bean
- RSocketRequester requester(RSocketRequester.Builder builder) {
- return builder.connectTcp("localhost", 8888).block();
- }
- }
- 然后,定義一個(gè) RSocket 客戶端接口(類似于 FeignClient),如下所示:
- @RSocketClient
- interface GreetingClient {
- @MessageMapping("request-response")
- Mono<GreetingResponse> requestResponse(Mono<String> name);
- }
- 測(cè)試代碼
- @SpringBootTest
- class DemoApplicationTests {
- @Autowired
- private GreetingClient greetingClient;
- @Test
- void testGreetingClient() {
- Mono<String> stringMono = greetingClient.requestResponse(Mono.just("lengleng"));
- System.out.println(stringMono.block());
- }
- }
spring-retrosocket github源碼:https://github.com/spring-projects-experimental/spring-retrosocket