三分钟构建高性能WebSocket服务 | 超优雅的Springboot整合Netty方案

简介:

前言

每当使用SpringBoot进行Weboscket开发时,最容易想到的就是spring-boot-starter-websocket(或spring-websocket)。它可以让我们使用注解,很简单的进行Websocket开发,让我们更多的关注业务逻辑。它底层使用的是Tomcat,且不说把整个Tomcat放进一个WebSocket服务中是否会太重,但在大数据量高并发的场景下,它的表现并不是非常理想。

Netty一款高性能的NIO网络编程框架,在推送量激增时,表现依然出色。(关于性能与表现的讨论,网上很多,这里不过多说明。)很多流行开源项目都在使用Netty,如:Dubbo、Storm、Spark、Elasticsearch、Apache Cassandra等,这得益于Netty的并发高、传输快、封装好等特点。

但是,要在SpringBoot项目中整合Netty来开发WebSocket不是一件舒服的事,这会让你过多的关注非业务逻辑的实现。那么,是否有一款框架,能使得在SpringBoot项目中使用Netty开发WebSocket变得简单,甚至优雅,并且可以从使用spring-boot-starter-websocket开发的项目无缝的迁移过来呢?

netty-websocket-spring-boot-starter

这是个开源的框架。通过它,我们可以像spring-boot-starter-websocket一样使用注解进行开发,只需关注需要的事件(如OnMessage)。并且底层是使用Netty,当需要调参的时候只需要修改配置参数即可,无需过多的关心handler的设置。

快速入门

  • 创建SpringBoot项目(v2.0.0以上)并添加依赖:
    <dependency>
    		<groupId>org.yeauty</groupId>
    		<artifactId>netty-websocket-spring-boot-starter</artifactId>
    		<version>0.6.2</version>
    	</dependency>
  • new一个ServerEndpointExporter对象,交给Spring容器,表示要开启WebSocket功能:
    @Configuration
    public class WebSocketConfig {
        @Bean
        public ServerEndpointExporter serverEndpointExporter() {
            return new ServerEndpointExporter();
        }
    }
  • 在端点类上加上@ServerEndpoint、@Component注解,并在相应的方法上加上@OnOpen、@OnClose、@OnError、@OnMessage注解(不想关注某个事件可不添加对应的注解):
    @ServerEndpoint
    @Component
    public class MyWebSocket {
    
        @OnOpen
        public void onOpen(Session session, HttpHeaders headers) throws IOException {
            System.out.println("new connection");
        }
    
        @OnClose
        public void onClose(Session session) throws IOException {
           System.out.println("one connection closed"); 
        }
    
        @OnError
        public void onError(Session session, Throwable throwable) {
            throwable.printStackTrace();
        }
    
        @OnMessage
        public void OnMessage(Session session, String message) {
            System.out.println(message);
            session.sendText("Hello Netty!");
        }
    }
  • 一个高性能的WebSocket服务端就完成了,直接run起来就可以了。

测试

  • 服务端是写完了,接下来需要测试一下,看看效果
  • 首先,新建一个html文件,把页面撸出来
    <!DOCTYPE html>
    <html lang="en">
    <body>
    <div id="msg"></div>
    <input type="text" id="text">
    <input type="submit" value="send" onclick="send()">
    </body>
    <script>
        var msg = document.getElementById("msg");
        var wsServer = 'ws://127.0.0.1:80';
        var websocket = new WebSocket(wsServer);
        //监听连接打开
        websocket.onopen = function (evt) {
            msg.innerHTML = "The connection is open";
        };
    
        //监听服务器数据推送
        websocket.onmessage = function (evt) {
            msg.innerHTML += "<br>" + evt.data;
        };
    
        //监听连接关闭
        websocket.onclose = function (evt) {
            alert("连接关闭");
        };
    
        function send() {
            var text = document.getElementById("text").value
            websocket.send(text);
        }
    </script>
    </html>
  • 页面撸完,直接用Chrome打开上面html文件即可连上你的WebSocket服务。

总结

这个框架是基于Netty的,所以直接使用Netty优化时的理念即可。如:堆外内存的0拷贝、接收及发送缓冲区的调整、高低写水位的调整等。

生产环境的项目在充分调优后,Netty甚至能比Tomcat高效20倍。(当然,这是特定的场景下)

框架详细文档:https://github.com/YeautyYE/netty-websocket-spring-boot-starter

本文来自云栖社区合作伙伴“开源中国”

本文作者:王练

原文链接


相关文章
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
4075 1
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
923 1
|
网络协议 Java
在SpringBoot项目中使用Netty实现远程调用
本文介绍了使用Netty解决网络连接性能问题的方法,重点讲解了Netty的NIO特性及其在SpringBoot中的应用。Netty作为高效的NIO框架,支持非阻塞IO,能通过单线程管理多个客户端连接,简化TCP/UDP套接字服务器开发。文章详细展示了Netty在SpringBoot中实现远程调用的过程,包括服务端与客户端代码实现、依赖配置及测试验证。通过示例代码,如`NettyServer`、`NettyClientUtil`等,清晰说明了Netty的工作原理和实际应用,解决了半包等问题,并提供了完整的测试结果。
1177 3
|
前端开发 网络协议 应用服务中间件
Netty基础—7.Netty实现消息推送服务
本文详细介绍了如何使用Netty实现HTTP服务器、WebSocket以及基于WebSocket的消息推送系统。首先,通过解析HTTP请求和响应消息,展示了Netty在性能和可靠性上的优势,并提供了具体代码示例。接着,分析了HTTP协议的弊端及Ajax短轮询的不足,引出WebSocket全双工通信的优势,包括连接建立、数据处理逻辑与ping-pong探测等。最后,构建了一个完整的消息推送系统,涵盖PushServer、运营客户端与浏览器客户端的交互过程,实现了全连接推送和实时消息传递。
|
Java 开发者 索引
Netty基础—6.Netty实现RPC服务
本文详细介绍了RPC(远程过程调用)的相关概念及其实现细节,涵盖动态代理、Netty客户端和服务端处理、编码解码器以及超时功能的实现。
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
610 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
Netty 与硬件设备交互,下行命令时(服务对设备),如何等待设备响应,再进行业务操作解决方案
Netty 与硬件设备交互,下行命令时(服务对设备),如何等待设备响应,再进行业务操作解决方案
568 1
|
缓存 监控 Java
造轮子能力大提升:基于SpringBoot打造高性能缓存组件
在快节奏的软件开发领域,"不重复造轮子" 常常被视为提高效率的金科玉律。然而,在某些特定场景下,定制化的高性能缓存组件却是提升系统性能、优化用户体验的关键。今天,我们将深入探讨如何利用SpringBoot框架,从零开始打造一款符合项目需求的高性能缓存组件,分享我在这一过程中的技术心得与学习体会。
368 6
|
监控 Java API
Spring Boot中的异步革命:构建高性能的现代Web应用
【8月更文挑战第29天】Spring Boot 是一个简化 Spring 应用开发与部署的框架。异步任务处理通过后台线程执行耗时操作,提升用户体验和系统并发能力。要在 Spring Boot 中启用异步任务,需在配置类上添加 `@EnableAsync` 注解,并定义一个自定义的 `ThreadPoolTaskExecutor` 或使用默认线程池。通过 `@Async` 注解的方法将在异步线程中执行。异步任务适用于发送电子邮件、数据处理、外部 API 调用和定时任务等场景。最佳实践中应注意正确配置线程池、处理返回值和异常、以及监控任务状态,确保系统的稳定性和健壮性。
394 0
|
前端开发 Go 开发者
用 Go + WebSocket 快速实现一个 chat 服务
用 Go + WebSocket 快速实现一个 chat 服务