三分钟构建高性能 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 {@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 方案相关推荐
- 构建高性能微服务架构 【摘自刘超】
随着移动互联网时代的兴起,提供高性能.高可用性.高扩展性的服务已经不仅仅是大公司的专利,而逐渐成为所有互联网+公司的标配需求.本文介绍网易如何利用多年的互联网架构经验和网易蜂巢的平台,帮助客户进行架构 ...
- 构建高性能微服务架构(网易)
随着移动互联网时代的兴起,提供高性能.高可用性.高扩展性的服务已经不仅仅是大公司的专利,而逐渐成为所有互联网+公司的标配需求.本文介绍网易如何利用多年的互联网架构经验和网易蜂巢的平台,帮助客户进行架构 ...
- 在Java中构建响应式微服务系统——第三章 构建响应式微服务
第三章 构建响应式微服务 在本章中,我们将使用Vert.x构建我们的第一个微服务.由于大多数微服务系统使用HTTP进行交互,因此我们将以HTTP微服务作为开始.但是由于系统包含多个相互通讯的微服务,因 ...
- 关于SpringBoot整合Netty客户端和服务端实现JT808协议
关于SpringBoot整合Netty客户端和服务端实现JT808协议 最近做了一个使用netty实现交通部JT808协议的项目,对比了mina和netty两种框架的使用,先整理一下netty的实现过 ...
- 剑指核心-TaoCloud全闪SDS助力构建高性能云服务
FASS&裸金属云 相对于虚拟化模式,裸金属服务器为用户提供物理服务器的租赁服务,延续了物理机无损性能这一得天独厚的优势,能够同时满足核心应用场景对高性能及稳定性的严格要求.使用裸金属服务器客 ...
- 三分钟学会.NET微服务之Polly
熔断降级是一个非常重要的概念,我们先说一下什么是熔断降级,咱们都知道服务发现,一个有问题的服务器没来得急注销过一会就崩溃掉了,那么我们的请求就有可能访问一个已经崩溃的服务器,那么就会请求失败,因为已经 ...
- 三分钟构建自动化运维平台-nightingale(夜莺)
最终搭建完成成品监控效果如图所示 夜莺是一套分布式高可用的运维监控系统,最大的特点是混合云支持,既可以支持传统物理机虚拟机的场景,也可以支持K8S容器的场景.同时,夜莺也不只是监控,还有一部分CMDB ...
- seata xid是什么_微服务分布式事务解决方案-springboot整合分布式seata1.3.0
概述 Seat是蚂蚁金服和阿里巴巴联合推出的一个开源的分布式事务框架,在阿里云商用的叫做GTS. 项目地址:https://github.com/longxiaonan/springcloud-dem ...
- 高性能RabbitMQ消息队列介绍 及 SpringBoot整合
一.高性能RabbitMQ RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消 ...
最新文章
- 面试四连问:API 接口如何设计?安全如何保证?防重如何实现?签名如何实现?...
- R语言常用线性模型特征筛选(feature selection)技术实战:基于前列腺特异性抗原(PSA)数据
- ExtJS4.2学习(14)基于表格的扩展插件(2)
- 欧加自贸协定“难产” 物联网安全受关注
- 《MacTalk•人生元编程》导读
- python UDP-数据报协议
- 程序员不满薪资拒绝offer,HR怒称:估计你一辈子就是个程序员了!
- linux 添加samba账户
- 如何实现文件的双向自动同步备份?
- python 多行注释 unicode error 问题
- Mysql索引失效的几种情况总结
- qt 二维数组初始化_C++数组初始化方法
- 微信提现显示服务器异常,微信零钱提现为什么显示提示交易异常 解决办法是什么...
- todd的hadoop world的ppt笔记
- C#生成不重复随机数(随机宝箱)
- C# 发送邮件内容嵌入图片
- 虚拟化技术 — GuestOS Agent
- 拥塞窗口cwnd的理解
- ROM制作工具如何开通超级会员?超级会员体系有什么样的功能?
- 经典按键算法使用心得