Dubbo 3.0 ? No ! RSocket 永远的神

Posted 码一码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dubbo 3.0 ? No ! RSocket 永远的神相关的知识,希望对你有一定的参考价值。

背景

  • 最近国内技术圈最热门的事情莫过于 Apache Dubbo 3.0 发布,作为 Dubbo 3 中最重要的特性是选择 HTTP/2 作为底层通信协议,使用 protobuf 作为序列化协议的组合,这套组合方案也是 gRPC 协议使用的方案。最终还是没有选择 RSocket 协议作为 reactive programming (响应式编程)的补充方案。

    Dubbo 3.0 源码示例
  • RSocket 是一个新的、语言无关的第七层应用网络协议。它是一个双向、多路复用、基于消息、基于反应流背压的二进制协议。和传统网络编程模型 HTTP 的 Request/Response 方式不同。RSocket 除了 Request/Response 方式之外,还支持 Fire And Forget(发送不回)、Stream(单向流)、Channel(双向流)。

  • RSocket 的基础可以参考笔者 《》文章参考学习。

  • 本文着重说明 Spring 官方孵化器新上项目 spring-retrosocket 使用。

Spring 孵化器截图

spring-retrosocket 通过提供注解驱动 RSocket 的客户端,通过注解调用屏蔽 rosocket-java sdk 的复杂性。

创建 RSocket Server

    1. 创建 spring boot 项目,添加相关依赖即可
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-rsocket</artifactId>
</dependency>
    1. 指定 rsocket server 服务端口即可
spring.rsocket.server.port=8848
    1. 定义 RR 请求模型处理信道

使用 @MessageMapping 指定路由路径即可


@Controller
public class GreetingsController {
  @MessageMapping("request-response")
  Mono<String> reqResponse(@Payload String payload) {
   log.info("收到 RR 请求信息: {}", payload);
   return Mono.just("Hello, " + payload);
  }
}

2. 使用 spring-retrosocket 创建客户端

  • 使用 Spring Initializr 并生成一个新项目。
依赖 版本
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 仓库

如果您有一个现有的构建,请确保您拥有spring-milestonesspring-snapshotsSpring 存储库。

<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. 基本用法

  • 开启 RSocket 客户端支持 在您的 Java 代码中,您需要启用 RSocket 客户端支持。使用 @EnableRSocketClient注释。您还需要定义一个 RSocketRequesterbean。
@SpringBootApplication
@EnableRSocketClients
class RSocketClientApplication {
 @Bean
 RSocketRequester requester(RSocketRequester.Builder builder) {
  return builder.connectTcp("localhost"8888).block();
 }
}
  • 然后,定义一个 RSocket 客户端接口(类似于 FeignClient),如下所示:
@RSocketClient
interface GreetingClient {
 @MessageMapping("request-response")
 Mono<GreetingResponse> requestResponse(Mono<String> name);
}
  • 测试代码
@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