在传统的基于 Servlet 的 Spring 应用程序中使用 Spring RSocket

aha*_*aha 5 java spring spring-security spring-boot spring-rsocket

如果不混合这两种变体,是否可以在“传统”的基于 servlet 的 Spring 应用程序中使用Spring 的 RSocket 集成,而不必牺牲 Spring 根据文档提供的功能?

如果是这样,怎么办?有什么陷阱需要注意吗?

目标是允许现有的基于 Servlet 的 Spring 应用程序通过 RSocket 与各种客户端通信。服务器端既不需要也不需要完全反应式的背压体验。必须启动一个与 servlet 容器一起运行的单独的基于 Netty 的服务器是可以接受

为了解决评论中提出的问题,有一些我特别关心的功能:

  • 声明式事务支持是否适用于通过 RSocket 传入的请求,而无需使用 R2DBC?根据Spring 的反应式事务,命令式事务管理和反应式事务管理存在显着差异。
  • Spring Security“只是”工作吗?或者是否需要特殊配置,例如,用于@PreAuthorize由应用程序的基于 servlet 的部分基于 RSocket 的部分调用的方法?

Fra*_*son -2

是的,可以在传统的基于 Servlet 的 Spring 应用程序中使用 Spring 的 RSocket 集成,而无需牺牲声明性事务支持或 Spring Security 集成。Spring 提供灵活性和模块化,允许您根据您的需求混合不同的技术和功能。您可以与现有的基于 servlet 的 Spring 应用程序一起运行单独的基于 Netty 的 RSocket 服务器。以下是实现这一目标的方法:

创建 RSocket 服务器配置:

首先创建一个 RSocket 服务器配置类。此类将定义您的 RSocket 服务器以及它如何处理传入请求。

@Configuration
public class RSocketServerConfig {

    @Bean
    public RSocketServer rSocketServer() {
        return RSocketServer.create();
    }

    @Bean
    public RSocketMessageHandler messageHandler() {
        RSocketMessageHandler handler = new RSocketMessageHandler();
        handler.setRSocketStrategies(rSocketStrategies());
        return handler;
    }

    @Bean
    public RSocketStrategies rSocketStrategies() {
        return RSocketStrategies.builder().build();
    }
}
Run Code Online (Sandbox Code Playgroud)

定义您的 RSocket 控制器:

创建 RSocket 控制器的方式与创建 Spring MVC 控制器的方式类似。这些控制器将处理传入的 RSocket 请求。例如:

@Controller
public class RSocketController {

    @MessageMapping("your.rsocket.route")
    public Mono<String> handleRSocketRequest(String request) {
        // Handle the request here
        return Mono.just("Response");
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的应用程序中启用 RSocket:

您需要在 Spring 应用程序中启用 RSocket。为此,请将 @EnableRSocket 注释添加到您的配置类之一:

@SpringBootApplication
@EnableRSocket
public class YourServletBasedApplication {

    public static void main(String[] args) {
        SpringApplication.run(YourServletBasedApplication.class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

配置Spring安全:

如果您在应用程序中配置了 Spring Security,请确保您也适当地保护您的 RSocket 端点。您可以使用 Spring Security 的功能来保护您的 RSocket 控制器。

交易管理:

Spring 的事务管理应该在基于 servlet 的 Spring 应用程序中按预期工作。必要时确保您的 RSocket 控制器位于事务边界内,并相应地配置事务管理器。

需要注意的陷阱:

并发:请注意基于 servlet 的 Spring 应用程序的并发模型,并确保 RSocket 交互不会导致争用或并发问题。

资源管理:应谨慎管理基于 servlet 的应用程序和 RSocket 服务器之间的资源(例如,数据库连接、线程池),以避免资源耗尽或争用。

跨源资源共享 (CORS):如果您的 RSocket 客户端是基于 Web 的,您可能需要适当处理 CORS 设置以允许来自不同源的 RSocket 连接。

错误处理:为 RSocket 控制器实现强大的错误处理,以优雅地处理故障。

请记住,当您将 RSocket 集成到基于 servlet 的 Spring 应用程序时,反应性和背压处理的级别取决于您。您可以按原样保留基于 servlet 的代码,并通过 RSocket 提供更传统的请求响应体验(如果符合您的要求)。

  • 顺便说一句,这个答案感觉就像 chatgpt 响应,是吗? (4认同)
  • ChatGPT 答案将不被容忍 (2认同)