歡迎光臨
每天分享高質量文章

三分鐘構建高性能 WebSocket 服務 | 超優雅的 SpringBoot 整合 Netty 方案

點擊上方“芋道原始碼”,選擇“置頂公眾號”

技術文章第一時間送達!

原始碼精品專欄

 

來源:https://dwz.cn/32YAttdi

  • 前言

  • netty-websocket-spring-boot-starter

  • 快速入門

  • 測試

  • 總結


前言

每當使用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.yeautygroupId>


        <artifactId>netty-websocket-spring-boot-starterartifactId>
        <version>0.6.3version>
    dependency>

  • new一個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 essay-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!");
    }
}
  • 一個高性能的WebSocket服務端就完成了,直接run起來就可以了。

測試

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

  • 首先,新建一個html檔案,把頁面擼出來

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 += 
 + evt.data;
    };

    //監聽連接關閉
    websocket.onclose = function (evt{
        alert(“連接關閉”);
    };

    function send({
        var text = document.getElementById(“text”).value
        websocket.send(text);
    }
script>
html>

  • 頁面擼完,直接用Chrome打開上面html檔案即可連上你的WebSocket服務。

總結

這個框架是基於Netty的,所以直接使用Netty優化時的理念即可。如:堆外記憶體的0拷貝、接收及發送緩衝區的調整、高低寫水位的調整等。

生產環境的專案在充分調優後,Netty甚至能比Tomcat高效20倍。(當然,這是特定的場景下)

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




如果你對 Dubbo / Netty 等等原始碼與原理感興趣,歡迎加入我的知識星球一起交流。長按下方二維碼噢


目前在知識星球更新了《Dubbo 原始碼解析》目錄如下:

01. 除錯環境搭建
02. 專案結構一覽
03. 配置 Configuration
04. 核心流程一覽

05. 拓展機制 SPI

06. 執行緒池

07. 服務暴露 Export

08. 服務取用 Refer

09. 註冊中心 Registry

10. 動態編譯 Compile

11. 動態代理 Proxy

12. 服務呼叫 Invoke

13. 呼叫特性 

14. 過濾器 Filter

15. NIO 服務器

16. P2P 服務器

17. HTTP 服務器

18. 序列化 Serialization

19. 集群容錯 Cluster

20. 優雅停機

21. 日誌適配

22. 狀態檢查

23. 監控中心 Monitor

24. 管理中心 Admin

25. 運維命令 QOS

26. 鏈路追蹤 Tracing

… 一共 69+ 篇

目前在知識星球更新了《Netty 原始碼解析》目錄如下:

01. 除錯環境搭建
02. NIO 基礎
03. Netty 簡介
04. 啟動 Bootstrap

05. 事件輪詢 EventLoop

06. 通道管道 ChannelPipeline

07. 通道 Channel

08. 位元組緩衝區 ByteBuf

09. 通道處理器 ChannelHandler

10. 編解碼 Codec

11. 工具類 Util

… 一共 61+ 篇


目前在知識星球更新了《資料庫物體設計》目錄如下:


01. 商品模塊
02. 交易模塊
03. 營銷模塊
04. 公用模塊

… 一共 17+ 篇


目前在知識星球更新了《Spring 原始碼解析》目錄如下:


01. 除錯環境搭建
02. IoC Resource 定位
03. IoC BeanDefinition 載入

04. IoC BeanDefinition 註冊

05. IoC Bean 獲取

06. IoC Bean 生命周期

… 一共 35+ 篇


原始碼不易↓↓↓

點贊支持老艿艿↓↓

赞(0)

分享創造快樂