标签: rsocket

如何使用 RSocket 创建文件发送客户端/服务器?

我似乎无法在RSocket上找到任何资源/教程,只能在 GitHub 上阅读他们的代码,我不明白。

我的服务器上有一个文件路径: String serverFilePath;

我希望能够从我的客户端下载它(最好使用RSocket 的 Aeron 实现)。有谁知道如何使用 RSocket 做到这一点?

提前致谢。

java file-sharing download aeron rsocket

5
推荐指数
1
解决办法
1559
查看次数

有状态的 Rsocket 应用程序

在我的项目中,我想让多个客户端连接到一个服务。我正在使用 java Rsocket 实现。

服务应该为每个客户端维护一个状态。现在,我可以通过一些标识符来管理客户端。这个选项我已经实现了。但我不想使用字符串手动管理会话。

所以另一个想法是通过 Rsocket 连接来识别客户端。有没有办法使用 Rsocket 通道来识别特定客户端?

想象一个示例服务和几个客户端。每个客户端都有 Rsocket 通道,服务启动并运行。有没有办法使用 Rsocket 通道在服务器端识别这些客户端?如果您能展示此类行为的程序化示例,那就太棒了。谢谢!

编辑(更详细地描述案例)

这是我的例子。

我们目前使用了三个 CORBA 对象,如图所示:

  • LoginObject(通过 NamingService 检索到的引用)。客户端可以调用 login() 方法来获取会话
  • Session 对象有各种方法来查询有关当前服务上下文的详细信息,最重要的是获取 Transaction 对象
  • Transaction 对象可用于通过通用方法执行各种命令,该方法将 commandName 和键值对列表作为参数。在客户端执行 n 个命令后,他可以提交或回滚事务(也可以通过 Transaction 对象上的方法)。

在此处输入图片说明

所以在这里我们使用会话对象在我们的服务上执行事务。

现在我们决定从 CORBA 转移到 Rsocket。因此我们需要 Rsocket 微服务能够存储会话的状态,否则我们无法知道将要提交或回滚什么。这可以通过每个客户端的单独发布者完成吗?

java reactive-programming rsocket

5
推荐指数
1
解决办法
718
查看次数

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 …

java netty spring-boot project-reactor rsocket

5
推荐指数
1
解决办法
2584
查看次数

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

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 应用程序需要什么?

服务器


pom.xml

...

<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)

java spring-mvc websocket spring-boot rsocket

5
推荐指数
1
解决办法
2658
查看次数

带有消息代理的事件驱动微服务(例如 Kafka)与反应式编程(RxJava、Project Reactor)以及改进的协议(RSocket)

我们都同意,通过 HTTP 调用通信微服务的常用请求-响应方式会导致它们之间的耦合。这使我们采用了事件驱动的方法,其中服务发布一些其他服务将对其做出反应的事件。为此,我们可以使用一些中间件,可以是来自 AMQ、RabbitMQ、Kafka 等的任何东西。

然而,反应式编程社区也确实创建了一些优秀的项目,例如 Project Reactor 或 RxJava,它们将 HTTP 通信转换为伪消息驱动的解决方案。再者,随着RSocket等协议的到来,该模型也到达了TCP/IP应用层。

  • RSocket/Reactive 微服务真的可以被认为是事件驱动的解决方案吗?它们不只是提高传统请求-响应系统性能的一种方式吗?

  • 换一种方式说:那些 Rsocket+Reactor 微服务不是仍然像以前基于 HTTP 的微服务一样完全耦合吗?

  • 在哪些场景中更推荐它们中的每一个?

event-driven apache-kafka project-reactor microservices rsocket

5
推荐指数
2
解决办法
2105
查看次数

WebFlux + RSocket + Spring

有人可以告诉我或给出一个使用WebFlux、RScoket 和 Spring(或 SpringBoot)的现成 CRUD 示例吗?

我研究了RSocket文档WebFlux,也写了我的简单示例,但我希望看到使用RSocket 的基本方法的真实CRUD应用程序。

我会很感激的。谢谢。

serversocket reactor spring-webflux rsocket rsocket-java

5
推荐指数
1
解决办法
2112
查看次数

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

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

但是,我在 RSocket 和 Spring(引导、安全)文档中都缺少与 RSocket 安全性相关的所有信息。

我的问题是:

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

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

spring-security spring-boot rsocket

3
推荐指数
1
解决办法
1222
查看次数

使用 RSocket-Java for Spring Rsocket Server 的 rsocket 路由元数据

如何设置路由元数据(在服务器使用 Spring Boot Rsocket 时仅使用 RSocket-Java 的有效负载。

Flux<Payload> s = connection.flatMapMany(requester -> requester.requestStream(DefaultPayload.create("Some Message")))

服务器正在使用@MessageMapping("/route")

spring-boot rsocket spring-rsocket

3
推荐指数
1
解决办法
1103
查看次数

正确使用 LoadbalanceRSocketClient 和 Spring 的 RSocketRequester

我试图了解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-messaging rsocket rsocket-java

3
推荐指数
1
解决办法
596
查看次数

spring-rsocket 支持在 @ConnectMapping 注解方法中返回 RejectedSetupException 吗?

我按照 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)

spring-boot rsocket spring-rsocket

3
推荐指数
1
解决办法
479
查看次数

使用RSocketFactory的替换

我一直在浏览一些 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 的人是否有机会帮助使用新的配置方法?

谢谢!

java spring lombok rsocket

2
推荐指数
1
解决办法
1021
查看次数

Spring Webflux 与 Rsocket

我已经研究 rsocket 和响应式编程有一段时间了,经常提到 spring webflux,我想问 rsocket 和 spring webflux 之间有什么区别,或者它们是相同的东西。谢谢

rsocket webflux

2
推荐指数
1
解决办法
1886
查看次数

传输 FHIR 资源的 RSocket 与 HTTP 性能

我最近开始了一系列关于使用FHIR资源的服务到服务通信的性能调查,以确定在以下方面花费的处理时间:

  1. 有效载荷通信/交换
  2. 序列化和反序列化有效负载

在调查过程中遇到了两个我不明白的结果,因此我需要RSocket开发团队的帮助。我将详细说明结果和问题。

为了找出最快的通信方式,我分析了使用两种传输协议的三种传输方式——HTTP 和 RSocket。更准确地说 - 我已经分析和基准测试:

  1. 使用HAPI REST 服务器和 HAPI FHIR 客户端交换 FHIR 资源
  2. 通过@RestController使用RestTemplateWeb 客户端访问 Spring端点,使用 REST 通信交换字符串(序列化的 FHIR 资源)
  3. 使用RSocket消息交换 FHIR 资源

对前两种通信方法的分析产生了使用 HAPI REST 服务器交换 FHIR 资源与交换(原始)字符串有效载荷之间的巨大差异,包括将这些有效载荷反序列化为 FHIR 资源。更准确地说 - 对于大型 FHIR 资源,HAPI REST 服务器增加的开销大约是(原始)字符串通信和反序列化所带来的开销的 3-4 倍。

关于两个服务之间的 RSocket 通信 - 我尝试使用两种模式来交换 FHIR 资源:

  1. 作为原始字符串,从 FHIR 资源序列化
  2. 作为原始 FHIR 资源,让 RSocket 处理序列化和反序列化

第一种方法(使用原始字符串)产生的负载交换开销几乎与 HTTP(使用 REST)通信所产生的开销相似。更准确地说 - 通信开销比 HTTP 通信高几个百分比 (5-10%)。这让我感到惊讶,因为我认为 RSocket 通信开销将低于 HTTP …

hl7-fhir spring-boot spring-messaging hapi-fhir rsocket

-3
推荐指数
1
解决办法
759
查看次数