Spring Boot Netty WebSocketクイックスタート

序文

SpringBootがWeboscketの開発に使用されるときはいつでも、最も簡単に考えることができますspring-boot-starter-websocket(またはspring-websocket)。これにより、注釈、非常に単純なWebsocket開発を使用できるようになり、ビジネスロジックにもっと注意を向けることができます。これは下部でTomcatを使用しており、Tomcat全体をWebSocketサービスに配置するのにそれほど重くはありませんが、大量のデータと高い同時実行性のシナリオでは、そのパフォーマンスはあまり理想的ではありません。

高性能なNIOネットワークプログラミングフレームワークであるNettyは、プッシュ数が急増した場合でも依然として良好に機能しました。(インターネット上でのパフォーマンスとパフォーマンスについては多くの議論がありますが、ここでは説明するのに十分ではありません。)Nettyの高い同時実行性と伝送のおかげで、多くの一般的なオープンソースプロジェクトがDuty、Storm、Spark、Elasticsearch、Apache CassandraなどのNettyを使用しています。高速でパッケージ化されています。

ただし、NettyをSpring Bootプロジェクトに統合してWebSocketを開発するのは快適ではありません。これにより、ビジネスロジック以外のロジックの実装に注意を向けすぎてしまいます。では、Nettyを使用してSpringBootプロジェクトでWebSocketを開発することを簡単かつエレガントにして、spring-boot-starter-websocket開発を使用するプロジェクトからシームレスに移行できるフレームワークはありますか?

netty-websocket-spring-boot-starter

これはオープンソースのフレームワークです。これによりspring-boot-starter-websocket、必要なイベント(OnMessageなど)に注意を払うだけでよいので、アノテーションを使用して開発できます。また、最下層はNettyであり、パラメーターを調整する必要がある場合は、ハンドラーの設定をあまり気にすることなく、構成パラメーターを変更するだけで済みます。

クイックスタート

  • Spring Bootプロジェクト(v2.0.0以降)を作成し、依存関係を追加します。
<dependency>
	<groupId>org.yeauty</groupId>
	<artifactId>netty-websocket-spring-boot-starter</artifactId>
	<version>0.6.3</version>
</dependency>
  • ServerEndpointExporterSpringコンテナに渡された新しいオブジェクトは、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!");
    }
}
  • 高性能WebSocketサーバーが完成したら、実行するだけです。

テスト中

  • サーバーが完成しました。次に、効果を確認するためにサーバーをテストする必要があります
  • まず、新しいhtmlファイルを作成し、ページをプッシュします
<!DOCTYPE html>
<html lang="en">
<body>
<div id="msg"></div>
<input type="text" id="text">
<input type="submit" value="send" οnclick="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>
  • ページが完成したら、上記のhtmlファイルをChromeで直接開いてWebSocketサービスに接続します。

まとめ

このフレームワークはNettyに基づいているため、Nettyの最適化の概念を使用してください。例:オフヒープメモリの0コピー、受信バッファと送信バッファの調整、書き込み水位の高低の調整など。

実稼働環境を完全に調整した後、NettyはTomcatの20倍も効率的になります。(もちろん、これは特定のシナリオです)

フレームワークの詳細なドキュメント:https : //github.com/YeautyYE/netty-websocket-spring-boot-starter

公開された203元の記事 ウォンの賞賛6 ビュー4476

おすすめ

転載: blog.csdn.net/weixin_42073629/article/details/105609293