跳到主要内容

· 阅读需 3 分钟
linux_china

RSocket Broker可能并不孤单啦,伴随着NATS 2.10的发布,NATS Services Framework被更多的人了解, 加上最新的NATS Execution Engine发布,这两者在架构设计上非常相像啦,这里我们就讨论一下。

NATS Services Framework

让我们看一下NATS Services Framework的架构图:

NATS Services Framework

从上图我们可以看出,NATS Server具备了服务的注册发现能力,而起本身还承担着流量转发的功能,这和RSocket Broker的架构完全一致。 但是RSocket在这方面还是更加强大一些,这里我们不一一对比,主要列出一些核心的差异:

  • RSocket是通讯协议,通讯相关的元数据这些都是内置的,而NATS是基于消息的字节流,这些需要你自己定义
  • 背压支持,RSocket支持背压,NATS不支持
  • Broker的元数据能力:NATS的微服务目前主要就是名称、版本和描述,并未提供更多的元数据能力,而RSocket Broker提供了更多的元数据能力,比如:标签、环境、地区、负载均衡策略等

RSocket和NATS Services在其他方面还是非常相似的,尤其是通讯模型:

  • Request-Response: NATS的Request-Reply
  • Fire-and-Forget: NATS的事件Publish
  • Request-Stream: NATS的Publish/Subscribe实现
  • Channel: NATS的Publish/Subscribe可以实现

NATS Execution Engine

NATS Execution Engine是一个基于NATS的Serverless平台,它的架构图如下:

NATS Execution Engine

其主要是针对FaaS和微服务部署场景,这个是RSocket Broker目前并没有的,我个人做过基于Deno的Serverless方案, 如果是部署JS/Wasm,这方面Deno和RSocket对接,完全也是可以的。

总结

NATS Services Framework和NATS Execution Engine都是非常不错的项目,如果你对NATS感兴趣,可以关注一下。 以下是个人的一些建议:

  • Golang技术栈:如果你的技术栈为Golang,NATS也是Golang编写的,而且对接简单,个人是建议可以考虑NATS Services Framework和Nex
  • Java技术栈:考虑RSocket Java SDK的稳定性,同时Spring 对RSocket的支持,个人是建议可以考虑RSocket方案。

如果你想了解更多关于NATS Services Framework和NATS Execution Engine的信息,可以参考:https://linux-china.davao.page/blog/2024-01-26-nats-nex/

· 阅读需 3 分钟
linux_china

不少同学想在自己的项目中使用RSocket,但是考虑到自己的项目还是SpringMVC,没法迁移到WebFlux上,所以一直比较苦恼。 但是伴随着Spring Boot 3.2的发布,这个问题就迎刃而解了。

Reactor 3.6增加对Java 21 Virtual Thread的支持,详细请参考 What new is coming in reactor-core 3.6.0? 也就是借助新的BoundedElasticThreadPerTaskScheduler类,可以使用Virtual Thread来执行任务。

伴随着Spring Boot 3.2的发布,Spring Boot也增加了对Java 21 Virtual Thread的支持,这也意味着我们可以在一个项目中同时支持SpringMVC和WebFlux, 你再也不用担心如何Web项目如何混合些SpringMVC和WebFlux了。

首先我们要在pom.xml中,添加spring-boot-starter-web作为web基础框架,另外添加reactor-core作为对Reactive的支持,如下:


<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
</dependency>

</dependencies>

接下来我们要在application.properties中,添加如下配置启动Virtual Thread的支持:

spring.threads.virtual.enabled=true

最后我们编写一个典型的SpringMVC的Controller,如下:

@RestController
public class PortalController {

@GetMapping("/where-am-i")
public String getThreadName() {
return Thread.currentThread().toString();
}

@GetMapping("/reactive")
public Mono<String> reactive() {
return Mono.just("Hello Reactor!").doOnNext(s -> {
System.out.println("Reactive on " + Thread.currentThread());
});
}
}

你会发现不借助spring-boot-starter-webflux你可以在SpringMVC中使用MonoFlux, 这样就可以在一个项目中同时支持SpringMVC和WebFlux了。

性能方面你不用担心,Reactive的调度是通过Virtual Thread来实现的,而不是传统的线程池,所以性能方面的担心是没有必要的。

总结一下:借助Java 21的Virtual Thread,Spring Boot 3.2通过Virtual Thread同时支持SpringMVC和WebFlux,所以我们再也不用担心如何在一个项目中同时支持SpringMVC和WebFlux了。 当然基于Reactive的RSocket也是完全没有问题的。

· 阅读需 2 分钟
linux_china

Alibaba RSocket 1.1.5发布,核心的变化是将RSocket Broker Server,gRPC gateway, HTTP Gateway都升级到Java 17 + Spring Boot 3, 这样就可以使用最新的Java 17进行开发了,同时也可以使用最新的Spring Boot 3进行开发了。 Alibaba RSocket Broker的客户端还是兼容的Java 1.8的,你还是可以使用Java 1.8进行应用开发。

Spring Boot 3.0已经内置支持GraalVM native image,Alibaba RSocket Broker也对其进行了支持, 你可以使用Spring Boot 3.0开发native image应用,样例请参考: https://github.com/alibaba-rsocket-broker/ali-rsocket-graal-boot3-demo

特性调整

  • Java 17 and Spring Boot 3 for RSocket Broker, gRPC gateway, HTTP Gateway

Bug修复

  • RSocket Broker 拒绝 accept 连接时,是否未关闭 requesterSocket #224
  • gRPC gateway的RPC类型判断错误

依赖更新

  • Spring Boot 3 for Broker Service, gRPC gateway, HTTP Gateway
  • Vaadin 24
  • Kotlin 1.8.21 & Kotlin coroutines 1.7.0

· 阅读需 2 分钟
linux_china

rsocket-py是RSocket的Python客户端,目前已经支持了RSocket协议的多数功能, 如TCP, WebSocket, QUIC, HTTP3协议支持,RxPy集成等,详细请参考 https://github.com/rsocket/rsocket-py/#progress 如果你使用Python进行应用开发的话,那么使用rsocket-py完全没有问题。

最新的rsocket-py 0.4.2版本添加了命令行的支持,也就是说你现在可以通过rsocket-py命令就可以进行RSocket服务的测试, 这个和RSocket另外一个命令行工具rsc非常相似,不同的是rsc使用Java + Spring Boot开发, 而rsocket-py命令行工具则是使用Python开发,主要是方便一些Python的开发者。

安装rsocket-py命令行非常简单,只需要执行pip3 install "rsocket[cli]"即可,接下来就是使用rsocket-py命令行。 简单样例如下:

$ rsocket-py --request --route hello --data 'Jackie' ws://localhost:8080/rsocket
$ rsc --request --route hello --data 'Jackie' ws://localhost:8080/rsocket

考虑到rsc开发在先,rsocket-py命令行的参数和rsc命令行的参数基本上是一致的,保证了Java/Python开发者一致的使用体验。

最后关于rsocket-py及其命令介绍,请参考:https://rsocket.io/guides/rsocket-py

· 阅读需 1 分钟
linux_china

最近两篇非常不错的文章,这里贴一下:

Istio, eBPF and RSocket Broker: A deep dive into service mesh

文章连接为: https://medium.com/geekculture/istio-ebpf-and-rsocket-broker-a-deep-dive-into-service-mesh-7ec4871d50bb 个人觉得介绍非常全面,将Istio, eBPF and RSocket Broker都进行了细致的分析,有做Service Mesh这方面工作的同学可以参考一下。 关于Service Mesh和RSocket Broker的整合,可以参考RSocket By Example的Service Mesh介绍: https://rsocketbyexample.info/service-mesh/

Sicecar vs RSocket

Beyond REST - An Overview about Modern API Technologies

是Spring IO 2022大会的一个Topic,演讲视频:https://www.youtube.com/watch?v=6mrLFcZhWjs
对应的PPT连接为 https://speakerdeck.com/larsduelfer/beyond-rest-an-overview-about-modern-api-technologies

将其中的对比截屏一下:

gRPC GraphQL RSocket

gRPC GraphQL RSocket

· 阅读需 1 分钟
linux_china

Spring Boot 2.7.0正式发布了,详细请参考 https://spring.io/blog/2022/05/19/spring-boot-2-7-0-available-now 其中包括了不少新特性,这里列举一下:

@RestController
public class UserController {

@GetMapping("/user")
public User user() {
return new User(1L, "jaciej", "my-secret-password");
}
}

record User(Long id, String username, String password) {}

@JsonMixin(User.class)
class UserMixin {
@JsonIgnore
private String password;
}

  • SSL配置支持PEM格式证书
server.ssl.enabled=true
server.http2.enabled=true
server.ssl.certificate-private-key=classpath:cert/key.pem
server.ssl.certificate=classpath:cert/cert.pem
server.ssl.key-store-password=changeit

SSL的PEM配置同样适用于RSocket TCP Server,对应的配置项如下:

spring.rsocket.server.ssl.certificate-private-key=classpath:cert/key.pem
spring.rsocket.server.ssl.certificate=classpath:cert/cert.pem
  • RSocket handler支持 @Authenticated Principal
@MessageMapping ("test") 
Mono<String> hello (@Authenticated Principal p){
return Mono.just ("Hello, " + p.getName()) ;
}

当然Alibaba RSocket Broker也是支持Spring Boot 2.7.0的,此外也不要忘记Java 17的支持,祝大家开发愉快!

· 阅读需 2 分钟
linux_china

距离1.1.2的发布已经过去有4个月啦,有大量的开发包在此阶段进行了更新,RSocket Java SDK发布了1.1.2版本,另外出于安全的考虑, 也需要对一下依赖进行更新。

依赖更新

特性调整

  • Java 11 for RSocket Broker: Vaadin 23已经不在支持Java 8,所以我们将RSocket Broker升级到Java 11,但是不用担心,alibaba-rsocket-broker对应的开发包基于Java 8的
  • RSocket Broker Server瘦身: 从1.1.2版本的108M降低到1.1.3版本的71M
  • RxJava 3.1.x兼容: RxJava 3.1.1版本 将fusion相关的接口调整到io.reactivex.rxjava3.operators package下,这导致Reactor RxJava 3适配出现了不兼容的问题,alibaba-rsocket-core对rxjava3之前接口进行inline操作,使用RxJava 3的任何版本都不会收到影响

其他

乐趣

在alibaba-rsocket-service-common的1.1.3版本,增加了 @RSocketServiceInterface, 你可以将RSocket Service interface添加上该annotation, 这样在代码中调用RSocket Service interface的函数接口,IntelliJ IDEA就会将其标识为网络调用,这样方便你更好地了解你的代码,效果如下:

RSocket Service Annotator

注意: 你需要安装 Microservices Annotator pluginRSocket plugin

· 阅读需 1 分钟
linux_china

RSocket JetBrains plugin主要是方便开发者在JetBrains IDE中对RSocket服务进行测试,截屏如下:

RSocket JetBrains plugin

目前插件主要支持以下特性:

  • 通讯模型支持持: request/response, fireAndForget, request/Stream, metadataPush
  • 传输层支持: TCP 和 WebSocket
  • Live templates: rpc, fnf, stream, metadata
  • 支持Spring Boot RSocket, Alibaba/Spring RSocket Broker: 支持Alibaba RSocket Broker上注册的服务测试
  • Code completion for RSocket headers
  • Intention action to convert RSocket request to rsc CLI

如果测试Alibaba RSocket Broker上的服务的话,请添加 X-AliBroker: true 请求头即可,如下:

RSOCKET com.alibaba.user.UserService.findById
X-AliBroker: true
Host: 127.0.0.1:9999
Content-Type: application/json

[1]

更多的介绍请访问: https://plugins.jetbrains.com/plugin/18195-rsocket-requests-in-http-client