日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

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

發(fā)布時間:2025/3/21 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三分钟构建高性能 WebSocket 服务 | 超优雅的 SpringBoot 整合 Netty 方案 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

每當使用SpringBoot進行Weboscket開發(fā)時,最容易想到的就是spring-boot-starter-websocket(或spring-websocket)。它可以讓我們使用注解,很簡單的進行Websocket開發(fā),讓我們更多的關(guān)注業(yè)務(wù)邏輯。它底層使用的是Tomcat,且不說把整個Tomcat放進一個WebSocket服務(wù)中是否會太重,但在大數(shù)據(jù)量高并發(fā)的場景下,它的表現(xiàn)并不是非常理想。

Netty一款高性能的NIO網(wǎng)絡(luò)編程框架,在推送量激增時,表現(xiàn)依然出色。(關(guān)于性能與表現(xiàn)的討論,網(wǎng)上很多,這里不過多說明。)很多流行開源項目都在使用Netty,如:Dubbo、Storm、Spark、Elasticsearch、Apache Cassandra等,這得益于Netty的并發(fā)高、傳輸快、封裝好等特點。

但是,要在SpringBoot項目中整合Netty來開發(fā)WebSocket不是一件舒服的事,這會讓你過多的關(guān)注非業(yè)務(wù)邏輯的實現(xiàn)。那么,是否有一款框架,能使得在SpringBoot項目中使用Netty開發(fā)WebSocket變得簡單,甚至優(yōu)雅,并且可以從使用spring-boot-starter-websocket開發(fā)的項目無縫的遷移過來呢?

netty-websocket-spring-boot-starter

這是個開源的框架。通過它,我們可以像spring-boot-starter-websocket一樣使用注解進行開發(fā),只需關(guān)注需要的事件(如OnMessage)。并且底層是使用Netty,當需要調(diào)參的時候只需要修改配置參數(shù)即可,無需過多的關(guān)心handler的設(shè)置。

快速入門

  • 創(chuàng)建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注解(不想關(guān)注某個事件可不添加對應的注解):

@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服務(wù)端就完成了,直接run起來就可以了。

測試

  • 服務(wù)端是寫完了,接下來需要測試一下,看看效果

  • 首先,新建一個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);//監(jiān)聽連接打開websocket.onopen?=?function?(evt)?{msg.innerHTML?=?"The?connection?is?open";};//監(jiān)聽服務(wù)器數(shù)據(jù)推送websocket.onmessage?=?function?(evt)?{msg.innerHTML?+=?"<br>"?+?evt.data;};//監(jiān)聽連接關(guān)閉websocket.onclose?=?function?(evt)?{alert("連接關(guān)閉");};function?send()?{var?text?=?document.getElementById("text").valuewebsocket.send(text);} </script> </html>
  • 頁面擼完,直接用Chrome打開上面html文件即可連上你的WebSocket服務(wù)。

總結(jié)

這個框架是基于Netty的,所以直接使用Netty優(yōu)化時的理念即可。如:堆外內(nèi)存的0拷貝、接收及發(fā)送緩沖區(qū)的調(diào)整、高低寫水位的調(diào)整等。

生產(chǎn)環(huán)境的項目在充分調(diào)優(yōu)后,Netty甚至能比Tomcat高效20倍。(當然,這是特定的場景下)

框架詳細文檔:https://github.com/YeautyYE/netty-websocket-spring-boot-starter

總結(jié)

以上是生活随笔為你收集整理的三分钟构建高性能 WebSocket 服务 | 超优雅的 SpringBoot 整合 Netty 方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。