Spring Boot 3使用Spring WebFlux + WebSocket(简单实现)

效果

为什么要使用 Spring WebFlux?

一部分答案是需要一个非阻塞的网络堆栈来处理少量线程的并发,并使用更少的硬件资源进行扩展。使用Servlet非阻塞I/O,远离Servlet API 的其余部分,因为他们的通信是同步的(Filter, Servlet) 或阻塞的 (getParameter, getPart)。Spring WebFlux是一个新的通用 API 作为跨任何非阻塞运行时的基础的动机。这很重要,因为服务器(例如 Netty)在异步、非阻塞中得到了很好的实践。

答案的另一部分是函数式编程。就像在 Java 5 中添加注释创造了机会(例如带注释的 REST 控制器或单元测试)一样,在 Java 8 中添加 lambda 表达式为 Java 中的函数式 API 创造了机会。这对于允许响应式组合异步逻辑的非阻塞应用程序和延续式 API(ReactiveXCompletableFuture和ReactiveX)来说是一个福音。在编程模型级别,Java 8 使 Spring WebFlux 能够提供功能性 Web 端点以及带注释的控制器。

为什么使用WebSocket?

WebSockets 可以使网页具有动态性和交互性。然而,在许多情况下,结合使用 AJAX 和 HTTP 流或长轮询可以提供简单有效的解决方案。

例如,新闻、邮件和社交提要需要动态更新,但每隔几分钟更新一次可能完全没问题。另一方面,协作、游戏和金融应用程序需要更加接近实时。

延迟本身并不是决定性因素。如果消息量相对较小(例如,监控网络故障),HTTP 流式传输或轮询可以提供有效的解决方案。低延迟、高频率和高容量的组合是使用 WebSocket 的最佳案例。

还要记住,在 Internet 上,不受您控制的限制性代理可能会阻止 WebSocket 交互,因为它们未配置为传递标头,或者因为 Upgrade它们关闭了看似空闲的长期连接。这意味着在防火墙内将 WebSocket 用于内部应用程序是一个比面向公众的应用程序更直接的决定

使用Spring WebFlux + WebSocket(简单实现)

导入依赖

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webfluxartifactId>
        dependency>

创建WebSocketHandler

要创建 WebSocket 服务器,您可以先创建一个WebSocketHandler. 以下示例显示了如何执行此操作:

public class MyWebSocketHandler implements WebSocketHandler {

    @Override
    public Mono<Void> handle(WebSocketSession session) {
        Flux<WebSocketMessage> output = session.receive()
                .map(value -> session.textMessage("发送成功:" + value.getPayloadAsText()));
        return session.send(output);
    }
}

然后你可以将它映射到一个 URL:

@Configuration
@EnableWebFlux
public class WebConfig {

    @Bean
    public HandlerMapping handlerMapping() {
        Map<String, WebSocketHandler> map = new HashMap<>();
        map.put("/path/{roomId}", new MyWebSocketHandler());
        int order = -1; // before annotated controllers
        return new SimpleUrlHandlerMapping(map, order);
    }

}

你可能感兴趣的:(spring,spring,boot,websocket)