序文
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>
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!");
}
}
- 高性能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