前言

每当使用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 {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}
  • 在端点类上加上@ServerEndpoint@Component注解,并在相应的方法上加上@OnOpen@OnClose@OnError@OnMessage注解(不想关注某个事件可不添加对应的注解):

@ServerEndpoint
@Component
public class MyWebSocket {@OnOpenpublic void onOpen(Session session, HttpHeaders headers) throws IOException {System.out.println("new connection");}@OnClosepublic void onClose(Session session) throws IOException {System.out.println("one connection closed");}@OnErrorpublic void onError(Session session, Throwable throwable) {throwable.printStackTrace();}@OnMessagepublic 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").valuewebsocket.send(text);}
</script>
</html>
  • 页面撸完,直接用Chrome打开上面html文件即可连上你的WebSocket服务。

总结

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

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

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

三分钟构建高性能 WebSocket 服务 | 超优雅的 SpringBoot 整合 Netty 方案相关推荐

  1. 构建高性能微服务架构 【摘自刘超】

    随着移动互联网时代的兴起,提供高性能.高可用性.高扩展性的服务已经不仅仅是大公司的专利,而逐渐成为所有互联网+公司的标配需求.本文介绍网易如何利用多年的互联网架构经验和网易蜂巢的平台,帮助客户进行架构 ...

  2. 构建高性能微服务架构(网易)

    随着移动互联网时代的兴起,提供高性能.高可用性.高扩展性的服务已经不仅仅是大公司的专利,而逐渐成为所有互联网+公司的标配需求.本文介绍网易如何利用多年的互联网架构经验和网易蜂巢的平台,帮助客户进行架构 ...

  3. 在Java中构建响应式微服务系统——第三章 构建响应式微服务

    第三章 构建响应式微服务 在本章中,我们将使用Vert.x构建我们的第一个微服务.由于大多数微服务系统使用HTTP进行交互,因此我们将以HTTP微服务作为开始.但是由于系统包含多个相互通讯的微服务,因 ...

  4. 关于SpringBoot整合Netty客户端和服务端实现JT808协议

    关于SpringBoot整合Netty客户端和服务端实现JT808协议 最近做了一个使用netty实现交通部JT808协议的项目,对比了mina和netty两种框架的使用,先整理一下netty的实现过 ...

  5. 剑指核心-TaoCloud全闪SDS助力构建高性能云服务

    FASS&裸金属云 相对于虚拟化模式,裸金属服务器为用户提供物理服务器的租赁服务,延续了物理机无损性能这一得天独厚的优势,能够同时满足核心应用场景对高性能及稳定性的严格要求.使用裸金属服务器客 ...

  6. 三分钟学会.NET微服务之Polly

    熔断降级是一个非常重要的概念,我们先说一下什么是熔断降级,咱们都知道服务发现,一个有问题的服务器没来得急注销过一会就崩溃掉了,那么我们的请求就有可能访问一个已经崩溃的服务器,那么就会请求失败,因为已经 ...

  7. 三分钟构建自动化运维平台-nightingale(夜莺)

    最终搭建完成成品监控效果如图所示 夜莺是一套分布式高可用的运维监控系统,最大的特点是混合云支持,既可以支持传统物理机虚拟机的场景,也可以支持K8S容器的场景.同时,夜莺也不只是监控,还有一部分CMDB ...

  8. seata xid是什么_微服务分布式事务解决方案-springboot整合分布式seata1.3.0

    概述 Seat是蚂蚁金服和阿里巴巴联合推出的一个开源的分布式事务框架,在阿里云商用的叫做GTS. 项目地址:https://github.com/longxiaonan/springcloud-dem ...

  9. 高性能RabbitMQ消息队列介绍 及 SpringBoot整合

    一.高性能RabbitMQ RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消 ...

最新文章

  1. 面试四连问:API 接口如何设计?安全如何保证?防重如何实现?签名如何实现?...
  2. R语言常用线性模型特征筛选(feature selection)技术实战:基于前列腺特异性抗原(PSA)数据
  3. ExtJS4.2学习(14)基于表格的扩展插件(2)
  4. 欧加自贸协定“难产” 物联网安全受关注
  5. 《MacTalk•人生元编程》导读
  6. python UDP-数据报协议
  7. 程序员不满薪资拒绝offer,HR怒称:估计你一辈子就是个程序员了!
  8. linux 添加samba账户
  9. 如何实现文件的双向自动同步备份?
  10. python 多行注释 unicode error 问题
  11. Mysql索引失效的几种情况总结
  12. qt 二维数组初始化_C++数组初始化方法
  13. 微信提现显示服务器异常,微信零钱提现为什么显示提示交易异常 解决办法是什么...
  14. todd的hadoop world的ppt笔记
  15. C#生成不重复随机数(随机宝箱)
  16. C# 发送邮件内容嵌入图片
  17. 虚拟化技术 — GuestOS Agent
  18. 拥塞窗口cwnd的理解
  19. ROM制作工具如何开通超级会员?超级会员体系有什么样的功能?
  20. 经典按键算法使用心得

热门文章

  1. XAMPP配置httpd-vhosts.conf后无法启动
  2. 支付宝支付后回调通知中responseTxt=true isSign=False可能的问题
  3. 用C语言做的 一个整人的小程序
  4. EXCEL基本操作(一~二)
  5. PHP导出pdf文件_dompdf
  6. Love = Accounting
  7. 操作系统的初始化流程简图
  8. win10 安装 Pytorch
  9. OpenCV图像处理——深度学习样本制造
  10. 私家车合乘系统 matlab,私家车贴上邻里合乘标志 武汉探路拼车合法化