问题标签 [rsocket]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3194 浏览

java - 如何使用 Spring Boot RSocket 服务器支持 WebSocket 传输?

TLDR:配置公开支持 WebSocket 传输的 RSocket 接口的 Spring Boot 应用程序需要什么?


我正在同时学习 RSocket 和 Spring Boot,所以请多多包涵。

在我的努力中,我已经能够构建一个非常简单且人为的 Spring Boot 应用程序实现,该应用程序使用第二个 Spring Boot 应用程序提供/公开的 API,使用 RSocket 作为协议,但是,我只能在以下情况下实现这一点使用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 应用程序需要什么?

服务器


pom.xml

应用程序属性

SpringBootRSocketServerApplication.java

用户RSocket控制器

启动记录

消费者/客户


客户端配置.java

启动记录

0 投票
1 回答
97 浏览

architecture - 服务的操作可恢复性(?)

方式,保证服务的#Cloud-Native可用性。为请求提供#containers服务,可能会死亡和自我修复,但服务端点需要确保请求得到服务。

如果服务基于 TCP 套接字服务自定义协议并且涉及复杂且长时间运行的操作,那么#Resumability服务中是否需要支持操作(从死亡容器离开的位置)?如果,实现这一目标的方法和方法是什么?

0 投票
1 回答
4119 浏览

javascript - 如何用 JavaScript 编写 RSocket 客户端

我尝试用 Java 实现一个 RSocket 服务器,用 JavaScript 实现一个客户端,但是我不能在我的后端调用任何方法。

Java 服务器

JavaScript 客户端

似乎建立了 WebSocket 连接,但没有消息推送到服务器。我怎样才能做到这一点?

我还用 Java 实现了客户端,它工作得很好。我找到的 JavaScript 示例是https://github.com/rsocket/rsocket-js/blob/master/docs/01-client-configuration.md,但我无法让它工作。

0 投票
1 回答
1399 浏览

spring-boot - 如何使用 Spring Security 在 Spring Boot 应用程序中配置 RSocket 安全性

对于微服务到微服务的通信,RSocket 似乎是 HTTP/S 的一个不错的替代方案。幸运的是,Spring Boot 已经有一个平滑的集成,可以简化它的配置。

但是,我在 RSocket 和 Spring (Boot, Security) 文档中都缺少有关 RSocket 安全性的所有信息。

我的问题是:

1)我们如何配置 RSocket 以使用 TLS(在 Spring Boot 应用程序的上下文中)?

2) Spring Security 是否为 RSocket 安全性添加了任何附加功能?我想到的事情,假设我们想将 JWT 令牌从一个应用程序传播到另一个应用程序,它如何通过 RSocket 传递和验证?

0 投票
1 回答
488 浏览

spring - 如何使用 Lease 自定义 ServerRSocketFactory

我使用 Spring 5.2、Spring Boot 2.2.0M6 和 Spring Cloud Hoxton.M2​​ 编写了一个简单的 RSocket 服务器和客户端。

我正在尝试通过根据官方RSocket 示例添加租约处理来自定义 RSocket 服务器的 ServerRSocketFactory 。

我正在使用ServerRSocketFactoryCustomizer添加租赁处理。但是,当我声明定制器 bean 并启动服务器时,我收到来自 Spring-Cloud-Stream FunctionConfiguration(版本 3.0.0.M3)的异常说“在 BeanFactory 中找到了多个函数”。

我正在使用以下代码来声明定制器:

LeaseCustomizer如下所示:

我的bootstrap.yml样子如下:

我的pom.xml样子如下:

如您所见,我将Spring-Cloud-Config(server) 与Spring–Boot-Starter-AMQPand结合使用Spring–Cloud-Stream-Binder-RabbitMQ

我已经调试过,问题出在哪里,在我看来,这要么是 Spring Boot RSocket 支持的问题,要么是Spring-Cloud-Stream.

问题是它ServerRSocketFactoryCustomizer是一个@FunctionalInterface,即行为像一个函数,并被类拾取,org.springframework.cloud.stream.function.FunctionConfiguration该类在内部调用functionCatalog.lookup(functionProperties.getDefinition())试图从注册表中查找一个函数。由于我声明该ServerRSocketFactoryCustomizer注册表包含两个函数,因此引发了异常。

一般来说,我希望我可以声明尽可能多的ServerRSocketFactoryCustomizerbean,并@Order相应地影响 RSocket 服务器的行为方式。今天,这似乎是不可能的,而且基于“带注释的响应者”的 Spring 对 RSocket 的支持几乎隐藏了 RSocket 服务器套接字,这有点可惜。

有什么方法可以自定义 Spring/Spring-Boot 提供的 RSocket 服务器以添加租约等,就像我正在尝试做的那样?

谢谢!

0 投票
1 回答
316 浏览

rsocket - 服务器未在 RSocket Fire and Forget 情况下接收数据

我有以下 RSocket 服务器

和下面的 RSocket 客户端

如您所见,我正在尝试将“ping”作为有效负载数据从客户端发送到服务器

当我第一次启动服务器并启动客户端时,我看到了> from client: ping

如果我再次重新启动客户端,我在服务器上看不到任何消息。断点甚至没有在服务器上命中

我的理解是 Fire and Forget 只是简单地发送数据 & 不费心等待 & 看看服务器是否成功处理数据,但在我的情况下,服务器本身没有在客户端的后续运行中接收数据(最好新客户)

有什么我想念的吗?

我正在使用&1.0.0-RC5的版本rsocket-corersocket-transport-netty

操作系统:Ubuntu 16.04

0 投票
1 回答
1517 浏览

spring - 使用 Spring Boot 运行 Spring Integration RSocket 示例时出错

我尝试创建一个简单的 Spring Boot 应用程序来测试 Rsocket 的 Spring Integrtaion。

我将测试文件夹中的示例代码复制spring-integrarion-rsocket到我的 Spring Boot 应用程序中。

pom.xml

并且application.properties

主要应用程序类。

和测试代码。

当我运行测试时,它抛出了异常:没有目标'/大写'的处理程序。

源代码托管在我的 Github上。

顺便提一句。我必须将此应用程序作为嵌入式 RSocket Web Flux应用程序运行(或将其作为独立 RSocket 应用程序运行),如果我使用IntegrationConfig中配置的相同端口运行 RSocket 服务器,则启动应用程序时会出现端口绑定错误,看来ServerRSocketConnector会创建自己的RSocket Server。

更新:2020 年 2 月 27 日

我试图删除依赖项中的spring-boot-starter-rsocket并创建一个RestController与网关通信。

pom.xml 的更新依赖。

并清理application.properties中的配置。

样品RestController

当我运行应用程序时,我遇到了这样的异常。

0 投票
1 回答
304 浏览

java - @GetMapping 和 RSocketServer 与 spring-boot-starter-rsocket

正在尝试https://www.baeldung.com/spring-boot-rsocket第 4 节中指定的 RSocket 请求/响应。所以有一个 RSocketServer 自动配置并在端口 7000 侦听。@GetMapping当从浏览器点击相同的方法时,无法连接到注释的方法

当从浏览器请求相同时,期望能够连接到带有注释current()的类,例如:http://localhost:7000/current/APPLE。不知道如何连接到相同的。MarketDataRestController@GetMapping

0 投票
2 回答
2717 浏览

spring-boot - Spring Boot RSocketRequester 处理服务器重启

我有一个关于 Springs RSocketRequester 的问题。我有一个 rsocket 服务器和客户端。客户端连接到此服务器并请求 @MessageMapping 端点。它按预期工作。

但是,如果我重新启动服务器会怎样。如何从客户端自动重新连接到 rsocket 服务器?谢谢

服务器:

客户:

0 投票
2 回答
888 浏览

java - 使用“wrap”函数创建时出现 Spring RSocketRequester 问题

当我RSocketRequester这样创建时它工作正常:

但是当我尝试发送消息时它会抛出一个异常,如果这样:

io.rsocket.exceptions.ApplicationErrorException:在 io.rsocket.exceptions.Exceptions.from(Exceptions.java:45) ~[rsocket-core-1.0.0-RC5.jar:na] 处没有目标“处理程序”已抑制:reactor .core.publisher.FluxOnAssembly$OnAssemblyException:在以下站点观察到错误:|_ checkpoint ⇢ 处理程序 com.issoft.rnd.ms2.controller.TestController#test4() [DispatcherHandler] |_ checkpoint ⇢ HTTP GET “/test4” [ExceptionHandlingWebHandler] 堆栈跟踪:在 io.rsocket.exceptions.Exceptions.from(Exceptions.java:45) ~[rsocket-core-1.0.0-RC5.jar:na] 在 io.rsocket.RSocketRequester。 handleFrame(RSocketRequester.java:556) ~[rsocket-core-1.0.0-RC5.jar:na] at io.rsocket.RSocketRequester.handleIncomingFrames(RSocketRequester.java:516) ~[rsocket-core-1.0.0-RC5 。罐:na] 在 reactor.core.publisher.LambdaSubscriber.onNext(LambdaSubscriber.java:160) ~[reactor-core-3.3.0.RELEASE.jar:3.3.0.RELEASE] 在 reactor.core.publisher.MonoFlatMapMany$FlatMapManyInner。 onNext(MonoFlatMapMany.java:242) ~[reactor-core-3.3.0.RELEASE.jar:3.3.0.RELEASE] at reactor.core.publisher.FluxGroupBy$UnicastGroupedFlux.drainRegular(FluxGroupBy.java:554) ~[reactor -core-3.3.0.RELEASE.jar:3.3.0.RELEASE] 在 reactor.core.publisher.FluxGroupBy$UnicastGroupedFlux.drain(FluxGroupBy.java:630) ~[reactor-core-3.3.0.RELEASE.jar: 3.3.0.RELEASE] 在 reactor.core.publisher.FluxGroupBy$UnicastGroupedFlux.subscribe(FluxGroupBy.java:696) ~[reactor-core-3.3.0.RELEASE.jar:3.3.0.RELEASE] 在 reactor.core。 publisher.Flux.subscribe(Flux.java:8134) ~[reactor-core-3.3.0.RELEASE.jar:3.3.0.RELEASE] 在 reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onNext(MonoFlatMapMany.java:188) ~[reactor-core-3.3.0.RELEASE.jar:3.3.0.RELEASE] 在 reactor.core.publisher.Operators$ MonoSubscriber.complete(Operators.java:1592) ~[reactor-core-3.3.0.RELEASE.jar:3.3.0.RELEASE] 在 reactor.core.publisher.MonoProcessor.onNext(MonoProcessor.java:317) ~[reactor -core-3.3.0.RELEASE.jar:3.3.0.RELEASE] 在 io.rsocket.internal.ClientServerInputMultiplexer.lambda$new$1(ClientServerInputMultiplexer.java:116) ~[rsocket-core-1.0.0-RC5.jar :na] 在 reactor.core.publisher.LambdaSubscriber.onNext(LambdaSubscriber.java:160) ~[reactor-core-3.3.0.RELEASE.jar:3.3.0.RELEASE] 在 reactor.core.publisher.FluxGroupBy$GroupByMain .drainLoop(FluxGroupBy.java:380) ~[reactor-core-3.3.0.RELEASE.jar:3.3.0.RELEASE] 在 reactor.core.publisher.FluxGroupBy$GroupByMain.drain(FluxGroupBy.java:316) ~[reactor-core-3.3.0.RELEASE.jar:3.3.0.RELEASE] 在 reactor.core.publisher.FluxGroupBy$ GroupByMain.onNext(FluxGroupBy.java:201) ~[reactor-core-3.3.0.RELEASE.jar:3.3.0.RELEASE] at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:114) ~ [reactor-core-3.3.0.RELEASE.jar:3.3.0.RELEASE] 在 reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:114) ~[reactor-core-3.3.0.RELEASE. jar:3.3.0.RELEASE] 在 reactor.netty.channel.FluxReceive.drainReceiver(FluxReceive.java:213) ~[reactor-netty-0.9.1.RELEASE.jar:0.9.1.RELEASE] 在 reactor.netty。 channel.FluxReceive.onInboundNext(FluxReceive.java:346) ~[reactor-netty-0.9.1.RELEASE.jar:0.9.1.RELEASE] 在 reactor.netty.channel。ChannelOperations.onInboundNext(ChannelOperations.java:348) ~[reactor-netty-0.9.1.RELEASE.jar:0.9.1.RELEASE] 在 reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:93) ~[reactor -netty-0.9.1.RELEASE.jar:0.9.1.RELEASE] 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[netty-transport-4.1.43.Final.jar:4.1. 43.Final] 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final] 在 io.netty.channel.AbstractChannelHandlerContext。 fireChannelRead(AbstractChannelHandlerContext.java:352) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final] at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:326) ~[netty-codec-4.1.43.Final.jar:4.1.43.Final] at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:300) ~[netty-codec-4.1 .43.Final.jar:4.1.43.Final] 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final]在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final] 在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext. java:352) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final] at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1422) ~[netty-transport-4.1 .43.Final.jar:4.1.43。Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead( AbstractChannelHandlerContext.java:360) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final] at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:931) ~[netty-transport-4.1 .43.Final.jar:4.1.43.Final] 在 io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) ~[netty-transport-4.1.43.Final.jar:4.1. 43.Final] 在 io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:700) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final] 在 io.netty.channel。 nio.NioEventLoop。processSelectedKeysOptimized(NioEventLoop.java:635) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final] at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:552) ~[netty -transport-4.1.43.Final.jar:4.1.43.Final] 在 io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:514) ~[netty-transport-4.1.43.Final.jar: 4.1.43.Final] 在 io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1050) ~[netty-common-4.1.43.Final.jar:4.1.43.Final] 在 io.netty .util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.43.Final.jar:4.1.43.Final] at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable .java:30) ~[netty-common-4.1.43.Final.jar:4.1.43.Final] 在 java.base/java.lang.Thread.run(Thread.java:834) ~[na:呐]

发送功能:

服务器:

Spring Boot 版本: 2.2.1.RELEASE

注意: Mime 类型取自第一个工作版本。

功能有什么问题wrap