我似乎无法在RSocket上找到任何资源/教程,只能在 GitHub 上阅读他们的代码,我不明白。
我的服务器上有一个文件路径: String serverFilePath;
我希望能够从我的客户端下载它(最好使用RSocket 的 Aeron 实现)。有谁知道如何使用 RSocket 做到这一点?
提前致谢。
在我的项目中,我想让多个客户端连接到一个服务。我正在使用 java Rsocket 实现。
服务应该为每个客户端维护一个状态。现在,我可以通过一些标识符来管理客户端。这个选项我已经实现了。但我不想使用字符串手动管理会话。
所以另一个想法是通过 Rsocket 连接来识别客户端。有没有办法使用 Rsocket 通道来识别特定客户端?
想象一个示例服务和几个客户端。每个客户端都有 Rsocket 通道,服务启动并运行。有没有办法使用 Rsocket 通道在服务器端识别这些客户端?如果您能展示此类行为的程序化示例,那就太棒了。谢谢!
编辑(更详细地描述案例)
这是我的例子。
我们目前使用了三个 CORBA 对象,如图所示:
所以在这里我们使用会话对象在我们的服务上执行事务。
现在我们决定从 CORBA 转移到 Rsocket。因此我们需要 Rsocket 微服务能够存储会话的状态,否则我们无法知道将要提交或回滚什么。这可以通过每个客户端的单独发布者完成吗?
我为 RSocket 消息写了一个小演示
问题是我无法访问Rsocket端点,我从服务器收到以下异常:
客户端: 配置:
@Bean
RSocket rSocket() {
return RSocketFactory.connect()
.mimeType(MimeTypeUtils.APPLICATION_JSON_VALUE, MimeTypeUtils.APPLICATION_JSON_VALUE)
.frameDecoder(PayloadDecoder.ZERO_COPY)
.transport(TcpClientTransport.create(new InetSocketAddress(7500)))
.start()
.block();
}
@Bean
RSocketRequester requester(RSocketStrategies strategies) {
return RSocketRequester.wrap(rSocket(), MimeTypeUtils.APPLICATION_JSON, MimeTypeUtils.APPLICATION_JSON, strategies);
}
Run Code Online (Sandbox Code Playgroud)
控制器:
private final RSocketRequester requester;
@GetMapping("/greet/{name}")
public Publisher<GreetingsResponse> greet(@PathVariable String name) {
return requester
.route("hello")
.data(new GreetingsRequest(name))
.retrieveMono(GreetingsResponse.class);
}
Run Code Online (Sandbox Code Playgroud)
服务器端(使用spring Rsocket): yml:
spring:
rsocket:
server:
port: 7500
transport: tcp
main:
lazy-initialization: true
Run Code Online (Sandbox Code Playgroud)
配置:
spring:
rsocket:
server:
port: 7500
transport: tcp
main:
lazy-initialization: true
Run Code Online (Sandbox Code Playgroud)
我很确定它与新wrap函数有关,RSocketRequester.wrap …
TLDR:配置暴露支持 WebSocket 传输的 RSocket 接口的 Spring Boot 应用程序需要什么?
我正在同时学习 RSocket 和 Spring Boot,所以请多多包涵。
在我的努力中,我已经能够构建一个非常简单和人为的 Spring Boot 应用程序实现,它使用第二个使用 RSocket 作为协议的 Spring Boot 应用程序提供/公开的 API,但是,我只能在以下情况下实现这一点使用TcpClientTransport.
从我的角度来看,WebsocketTransport它更有可能被使用并且对客户端-> 服务器架构更有用,但是,我还没有找到任何关于如何正确配置使用 WebSocket 作为接受 RSocket 消息的 Spring Boot 应用程序的工作示例或文档运输。
奇怪的是,在我的测试中,我的消费者(客户端)似乎确实建立了到服务器/生产者的 WebSocket 连接,但是,“握手”似乎挂起并且连接从未完全建立。我已经对 JavaScript 库(rsocket-websocket-client、rsocket-rpc-core 等)和 Java 库(io.rsocket.transport.netty.client.WebsocketClientTransport)进行了测试,并且服务器似乎表现出相同行为不管。
重申一下,使用 TCPTransport 我能够连接到服务器并调用请求就好了,但是在使用WebsocketTransport连接时从未建立。
一个旨在通过WebsocketClientTransport过去消费spring-boot-starter-rsocket作为依赖项支持 RSocket 的 Spring Boot 应用程序需要什么?
...
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.M5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
...
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId> …Run Code Online (Sandbox Code Playgroud) 我们都同意,通过 HTTP 调用通信微服务的常用请求-响应方式会导致它们之间的耦合。这使我们采用了事件驱动的方法,其中服务发布一些其他服务将对其做出反应的事件。为此,我们可以使用一些中间件,可以是来自 AMQ、RabbitMQ、Kafka 等的任何东西。
然而,反应式编程社区也确实创建了一些优秀的项目,例如 Project Reactor 或 RxJava,它们将 HTTP 通信转换为伪消息驱动的解决方案。再者,随着RSocket等协议的到来,该模型也到达了TCP/IP应用层。
RSocket/Reactive 微服务真的可以被认为是事件驱动的解决方案吗?它们不只是提高传统请求-响应系统性能的一种方式吗?
换一种方式说:那些 Rsocket+Reactor 微服务不是仍然像以前基于 HTTP 的微服务一样完全耦合吗?
在哪些场景中更推荐它们中的每一个?
event-driven apache-kafka project-reactor microservices rsocket
有人可以告诉我或给出一个使用WebFlux、RScoket 和 Spring(或 SpringBoot)的现成 CRUD 示例吗?
我研究了RSocket文档WebFlux,也写了我的简单示例,但我希望看到使用RSocket 的基本方法的真实CRUD应用程序。
我会很感激的。谢谢。
对于微服务到微服务的通信,RSocket 似乎是 HTTP/S 的一个很好的替代品。幸运的是 Spring Boot 已经有一个平滑的集成,可以简化它的配置。
但是,我在 RSocket 和 Spring(引导、安全)文档中都缺少与 RSocket 安全性相关的所有信息。
我的问题是:
1) 我们如何配置 RSocket 以使用 TLS(在 Spring Boot 应用程序的上下文中)?
2) Spring Security 是否为 RSocket 安全性添加了任何附加功能?我想到的事情,假设我们想要将 JWT 令牌从一个应用程序传播到另一个应用程序,它如何通过 RSocket 传递和验证?
如何设置路由元数据(在服务器使用 Spring Boot Rsocket 时仅使用 RSocket-Java 的有效负载。
Flux<Payload> s = connection.flatMapMany(requester -> requester.requestStream(DefaultPayload.create("Some Message")))
服务器正在使用@MessageMapping("/route")
我试图了解LoadbalanceRSocketClient SpringBoot 应用程序 ( RSocketRequester)上下文中的正确配置和使用模式。
我有两个 RSocket 服务器后端(SpringBoot、RSocket 消息传递)RSocketRequester在客户端上运行和配置,如下所示:
List<LoadbalanceTarget> servers = new ArrayList<>();
for (String url: backendUrls) {
HttpClient httpClient = HttpClient.create()
.baseUrl(url)
.secure(ssl ->
ssl.sslContext(SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE)));
servers.add(LoadbalanceTarget.from(url, WebsocketClientTransport.create(httpClient, url)));
}
// RSocketRequester.Builder is autowired by Spring boot
RSocketRequester requester = builder
.setupRoute("/connect")
.setupData("test")
//.rsocketConnector(connector -> connector.reconnect(Retry.fixedDelay(60, Duration.ofSeconds(1))))
.transports(Flux.just(servers), new RoundRobinLoadbalanceStrategy());
Run Code Online (Sandbox Code Playgroud)
配置完成后,请求者将在计时器循环中重复使用,如下所示:
@Scheduled(fixedDelay = 10000, initialDelay = 1000)
public void timer() {
requester.route("/foo").data(Data).send().block();
}
Run Code Online (Sandbox Code Playgroud)
它工作 - 客户端启动,连接到其中一台服务器并将消息推送到它。如果我终止客户端连接的服务器,客户端会在下一个计时器事件中重新连接到另一台服务器。如果我再次启动第一个服务器并杀死第二个服务器,客户端将不再连接,并且在客户端观察到以下异常:
java.util.concurrent.CancellationException: Pool is exhausted
at io.rsocket.loadbalance.RSocketPool.select(RSocketPool.java:202) ~[rsocket-core-1.1.0.jar:na]
at io.rsocket.loadbalance.LoadbalanceRSocketClient.lambda$fireAndForget$0(LoadbalanceRSocketClient.java:49) …Run Code Online (Sandbox Code Playgroud) 我按照 spring-rsocket-demo 项目来完成我的代码。我在服务器端代码中添加了一些身份验证逻辑,如下所示。您可以看到我在身份验证逻辑“CLIENT.add(requester)”之后抛出了一个异常。我在 spring-rsocket-demo 项目中执行名为“testRequestGetsResponse”的测试方法,发现无法收到异常。如何处理 @ConnectMapping 注释方法中的设置有效负载并在需要时返回 RejectedSetupException。
requester.rsocket()
.onClose()
.doFirst(() -> {
// Add all new clients to a client list
log.info("Client: {} CONNECTED.", client);
//throw Exception during process setup payload
//my authentication code.
try {
// CLIENTS.add(requester);
throw new RuntimeException();
} catch (Exception exception) {
throw exception;
}
})
.doOnError(error -> {
// Warn when channels are closed by clients
log.warn("Channel to client {} CLOSED", client);
})
.doFinally(consumer -> {
// Remove disconnected clients from the client list …Run Code Online (Sandbox Code Playgroud) 我一直在浏览一些 RSocket 演示和示例来了解它们是如何工作的,但其中大多数往往都有过时的代码片段。
例如,我有这个演示,当碰巧被弃用时使用 RSocketFactory。
@Bean
RSocket rSocket () {
return RSocketFactory
.connect()
.dataMimeType(MimeTypeUtils.APPLICATION_JSON_VALUE)
.frameDecoder(PayloadDecoder.ZERO_COPY)
.transport(TcpClientTransport.create(7000))
.start()
.block();
}
Run Code Online (Sandbox Code Playgroud)
我通过搜索更多发现它已被替换,RSocketConnectorConfigurer但我无法找到新用法的示例代码。以前使用过 RSocket 的人是否有机会帮助使用新的配置方法?
谢谢!
我已经研究 rsocket 和响应式编程有一段时间了,经常提到 spring webflux,我想问 rsocket 和 spring webflux 之间有什么区别,或者它们是相同的东西。谢谢
我最近开始了一系列关于使用FHIR资源的服务到服务通信的性能调查,以确定在以下方面花费的处理时间:
在调查过程中遇到了两个我不明白的结果,因此我需要RSocket开发团队的帮助。我将详细说明结果和问题。
为了找出最快的通信方式,我分析了使用两种传输协议的三种传输方式——HTTP 和 RSocket。更准确地说 - 我已经分析和基准测试:
@RestController使用RestTemplateWeb 客户端访问 Spring端点,使用 REST 通信交换字符串(序列化的 FHIR 资源)对前两种通信方法的分析产生了使用 HAPI REST 服务器交换 FHIR 资源与交换(原始)字符串有效载荷之间的巨大差异,包括将这些有效载荷反序列化为 FHIR 资源。更准确地说 - 对于大型 FHIR 资源,HAPI REST 服务器增加的开销大约是(原始)字符串通信和反序列化所带来的开销的 3-4 倍。
关于两个服务之间的 RSocket 通信 - 我尝试使用两种模式来交换 FHIR 资源:
第一种方法(使用原始字符串)产生的负载交换开销几乎与 HTTP(使用 REST)通信所产生的开销相似。更准确地说 - 通信开销比 HTTP 通信高几个百分比 (5-10%)。这让我感到惊讶,因为我认为 RSocket 通信开销将远低于 HTTP …
rsocket ×13
spring-boot ×6
java ×5
rsocket-java ×2
aeron ×1
apache-kafka ×1
download ×1
event-driven ×1
file-sharing ×1
hapi-fhir ×1
hl7-fhir ×1
lombok ×1
netty ×1
reactor ×1
serversocket ×1
spring ×1
spring-mvc ×1
webflux ×1
websocket ×1