当前位置: 首页 > news >正文

Netty Websocket SpringBoot Starter

netty websocket starter

Quick Start

Demo 项目

添加依赖

<!--添加源-->
<repository><id>github</id><url>https://maven.pkg.github.com</url><snapshots><enabled>true</enabled></snapshots>
</repository>

<dependency><groupId>com.github.kuangcp</groupId><artifactId>netty-ws-spring-boot-starter</artifactId><version>1.0.5-RELEASE</version>
</dependency>

基础配置

netty-ws:port: 5455max-content-length: 4096max-frame-size: 65536reader-idle-sec: 60reader-idle-threshold: 2connect-auth: true

自定义连接处理类


@Component
@ChannelHandler.Sharable
public class DemoHandler extends AbstractBizHandler {public DemoHandler(CacheDao cacheDao, UserDao userDao, WsServerConfig config) {super(cacheDao, userDao, config);this.schedulerPollQueueMsg(Executors.newScheduledThreadPool(1));}@Overridepublic void connectSuccess(Long userId) {log.info("connected {}", userId);}@Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {String id = WsSocketUtil.id(ctx);Long userId = channelUserMap.get(id);log.info("disconnect {}", userId);super.channelInactive(ctx);}@Overrideprotected void handSharkHttpRequest(ChannelHandlerContext ctx, FullHttpRequest request) {super.handSharkHttpRequest(ctx, request);}
}

实现存储扩展 com.github.kuangcp.websocket.store.CacheDao
实现认证扩展 com.github.kuangcp.websocket.store.UserDao

  • 然后启动项目, 验证websocket通信。 可使用 Js 测试客户端 测试
    • 连接地址 ws://127.0.0.1:5455/ws?uid={uid}&token={token}
    • 注意认证的实现方式为HTTP握手时,将Token作为url参数或者作为Header,参数名都是token

设计思路

Netty作为通信基础,每个用户连接时通过前置的Nginx等SLB层负载均衡到WS集群。

  1. 用户和主机ip关系绑定到Redis map结构中
  2. 每个主机ip绑定一个Redis的list队列,存放了其他节点写入的消息数据,解决应用层向用户推送消息时,用户连接随机分散的问题。

注意:Redis可替换成任意中心存储, 已由 CacheDao 抽象,应用层自己实现。

http://www.lryc.cn/news/399321.html

相关文章:

  • 数据结构(4.2)——朴素模式匹配算法
  • git切换远程仓库地址
  • 同步与异步:.NET 中的 Task.WaitAll 和 Task.WhenAll
  • 在Linux系统实现瑞芯微RK3588部署rknntoolkit2进行模型转换
  • 【人工智能】Transformers之Pipeline(概述):30w+大模型极简应用
  • Jenkins中Node节点与构建任务
  • Leetcode3200. 三角形的最大高度
  • docker运行nginx挂载前端html页面步骤
  • kafka部署以及常用命令详细总结
  • 代码随想录算法训练营第29天|LeetCode 134. 加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列
  • 代理模式(大话设计模式)C/C++版本
  • 本人学习保存-macOS打开Navicat提示「“Navicat Premium”已损坏,无法打开。 你应该将它移到废纸篓。」的解决方法
  • 《Cross-Image Pixel Contrasting for Semantic Segmentation》论文解读
  • 技术周总结 2024.07.08~07.14(算法,Python,Java,Scala,PHP)
  • UnityECS学习中问题及总结entityQuery.ToComponentDataArray和entityQuery.ToEntityArray区别
  • [python]基于yolov10+gradio目标检测演示系统设计
  • 浏览器开发者视角及CSS表达式选择元素
  • GuLi商城-商品服务-API-品牌管理-统一异常处理
  • VUE+Spring Flux实现SSE长连接
  • C#实现Winform程序右下角弹窗消息提示
  • Java三剑客:封装、继承、多态的魔法世界
  • 0145__Linux的capability
  • # Redis 入门到精通(一)数据类型(4)
  • 西邮计科嵌入式复习
  • Java如何使用 HttpClientUtils 发起 HTTP 请求
  • 无人机的工作原理
  • 敏捷开发笔记(第10章节)--Liskov原则(LSP)
  • 基于SSM的校园一卡通管理系统的设计与实现
  • 新版Android Studio中设置gradle的JDK版本
  • 打造你的智能家居指挥中心:基于STM32的多协议(zigbee、http)网关(附代码示例)