每当使用SpringBoot进行Weboscket开发时,最容易想到的就是
spring-boot-starter-websocket
(或spring-websocket
)。它可让咱们使用注解,很简单的进行Websocket开发,让咱们更多的关注业务逻辑。它底层使用的是Tomcat,且不说把整个Tomcat放进一个WebSocket服务中是否会过重,但在大数据量高并发的场景下,它的表现并非很是理想。html
Netty一款高性能的NIO网络编程框架,在推送量激增时,表现依然出色。(关于性能与表现的讨论,网上不少,这里不过多说明。)不少流行开源项目都在使用Netty,如:Dubbo、Storm、Spark、Elasticsearch、Apache Cassandra等,这得益于Netty的并发高、传输快、封装好等特色。java
可是,要在SpringBoot项目中整合Netty来开发WebSocket不是一件舒服的事,这会让你过多的关注非业务逻辑的实现。那么,是否有一款框架,能使得在SpringBoot项目中使用Netty开发WebSocket变得简单,甚至优雅,而且能够从使用
spring-boot-starter-websocket
开发的项目无缝的迁移过来呢?git
这是个开源的框架。经过它,咱们能够像spring-boot-starter-websocket
同样使用注解进行开发,只需关注须要的事件(如OnMessage)。而且底层是使用Netty,当须要调参的时候只须要修改配置参数便可,无需过多的关心handler的设置。github
<dependency> <groupId>org.yeauty</groupId> <artifactId>netty-websocket-spring-boot-starter</artifactId> <version>0.6.3</version> </dependency>
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!"); } }
<!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>
这个框架是基于Netty的,因此直接使用Netty优化时的理念便可。如:堆外内存的0拷贝、接收及发送缓冲区的调整、高低写水位的调整等。web
生产环境的项目在充分调优后,Netty甚至能比Tomcat高效20倍。(固然,这是特定的场景下)spring
框架详细文档:https://github.com/YeautyYE/netty-websocket-spring-boot-starter编程