三分钟构建高性能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.3</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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
以太坊开发去中心化投票DApp与智能合约实例
在整个加密货币市场的市值超过7000亿美元之后,加密货币市场在过去几个月太疯狂了,但这只是一个开始。随着区块链系统的不断发展和扩展,进入这一新领域并利用这项技术的一个好方法是使用去中心化应用程序,也称为dApps。 CryptoKitties以其使以太坊区块链拥挤而闻名,是dApp的一个很好的例子,它将可养殖和可收藏的概念与区块链相结合。这个耸人听闻的游戏只是一个创造性的例子,几乎有无限的机会。 虽然看似非常复杂,但已经开发出某些框架和工具来抽象你与区块链和智能合约的交互。在这篇博文中,我将通过一种方式在以太坊上创建一个去中心化的投票应用程序。我将简要介绍以太坊,但你可能应该对它有所了解,以便充分利用本指南。另外,我希望你知道Javascript。 为什么要开发去中心化投票应用? 从本质上讲,利用区块链技术的去中心化应用程序允许你在没有可信赖的第三方的情况下执行与今天相同的操作(如转移资金)。最好的dApp具有特定的真实世界的用例,以便利用区块链的独特特征。 从本质上讲,区块链是一个共享的,可编程的,加密安全的,可信赖的分类账本,没有任何一个用户可以控制,任何人都可以查询。- Klau...
- 下一篇
MicroPython实例之TPYBoard开发板控制OLED显示中文
0x00 前言 之前看到一篇文章是关于TPYBoard v102控制OLED屏显示的,看到之后就想尝试一下使用OLED屏来显示中文。最近利用空余时间搞定了这个实验,特此将实验过程及源码分享出来,方便以后使用。 0x01 实验器材 TPYBoard v102 开发板 1块(某宝上可以买到,价格不贵) 0.96 寸OLED显示屏(ssd1306) 1块 杜邦线 若干 0x02 前期准备 1、首先我们先来看一下,之前参考的OLED显示字符的文章。 http://docs.tpyboard.com/zh/latest/tpyboard/tutorial/v10x/oled/?highlight=oled 文章中的源码文件都已上传到GitHub。地址:https://github.com/TPYBoard/developmentBoard/tree/master/TPYBoard-v10x-master 找到11.学习使用OLED显示屏]里面就是源程序。我就是在font.py和ssd1306.py基础上做的开发。 2、在font.py中增加中文字模。 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Hadoop3单机部署,实现最简伪集群
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器