每當使用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編程