问题标签 [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.
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
启动记录
architecture - 服务的操作可恢复性(?)
方式,保证服务的#Cloud-Native
可用性。为请求提供#containers
服务,可能会死亡和自我修复,但服务端点需要确保请求得到服务。
如果服务基于 TCP 套接字服务自定义协议并且涉及复杂且长时间运行的操作,那么#Resumability
服务中是否需要支持操作(从死亡容器离开的位置)?如果是,实现这一目标的方法和方法是什么?
javascript - 如何用 JavaScript 编写 RSocket 客户端
我尝试用 Java 实现一个 RSocket 服务器,用 JavaScript 实现一个客户端,但是我不能在我的后端调用任何方法。
Java 服务器
JavaScript 客户端
似乎建立了 WebSocket 连接,但没有消息推送到服务器。我怎样才能做到这一点?
我还用 Java 实现了客户端,它工作得很好。我找到的 JavaScript 示例是https://github.com/rsocket/rsocket-js/blob/master/docs/01-client-configuration.md,但我无法让它工作。
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 传递和验证?
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-AMQP
and结合使用Spring–Cloud-Stream-Binder-RabbitMQ
。
我已经调试过,问题出在哪里,在我看来,这要么是 Spring Boot RSocket 支持的问题,要么是Spring-Cloud-Stream
.
问题是它ServerRSocketFactoryCustomizer
是一个@FunctionalInterface
,即行为像一个函数,并被类拾取,org.springframework.cloud.stream.function.FunctionConfiguration
该类在内部调用functionCatalog.lookup(functionProperties.getDefinition())
试图从注册表中查找一个函数。由于我声明该ServerRSocketFactoryCustomizer
注册表包含两个函数,因此引发了异常。
一般来说,我希望我可以声明尽可能多的ServerRSocketFactoryCustomizer
bean,并@Order
相应地影响 RSocket 服务器的行为方式。今天,这似乎是不可能的,而且基于“带注释的响应者”的 Spring 对 RSocket 的支持几乎隐藏了 RSocket 服务器套接字,这有点可惜。
有什么方法可以自定义 Spring/Spring-Boot 提供的 RSocket 服务器以添加租约等,就像我正在尝试做的那样?
谢谢!
rsocket - 服务器未在 RSocket Fire and Forget 情况下接收数据
我有以下 RSocket 服务器
和下面的 RSocket 客户端
如您所见,我正在尝试将“ping”作为有效负载数据从客户端发送到服务器
当我第一次启动服务器并启动客户端时,我看到了> from client: ping
如果我再次重新启动客户端,我在服务器上看不到任何消息。断点甚至没有在服务器上命中
我的理解是 Fire and Forget 只是简单地发送数据 & 不费心等待 & 看看服务器是否成功处理数据,但在我的情况下,服务器本身没有在客户端的后续运行中接收数据(最好新客户)
有什么我想念的吗?
我正在使用&1.0.0-RC5
的版本rsocket-core
rsocket-transport-netty
操作系统:Ubuntu 16.04
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
。
当我运行应用程序时,我遇到了这样的异常。
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
spring-boot - Spring Boot RSocketRequester 处理服务器重启
我有一个关于 Springs RSocketRequester 的问题。我有一个 rsocket 服务器和客户端。客户端连接到此服务器并请求 @MessageMapping 端点。它按预期工作。
但是,如果我重新启动服务器会怎样。如何从客户端自动重新连接到 rsocket 服务器?谢谢
服务器:
客户:
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
?