1. NettyWebSocketDeviceChannelCacheManager中的缓存管理器解析
- 核心功能:
- 管理 WebSocket 连接的状态缓存
- 通过 ConcurrentMap(线程安全的并发Map)保存连接通道与账号的映射关系
- 持续维护在线连接的状态,实现快速访问和身份绑定
- 主要数据结构:
ConcurrentHashMap<String, ChannelHandlerContext> CHANNELID_CHANNEL_MAP
记录所有在线的 WebSocket 连接通道(Channel)- 账号与通道的映射关系分别保存在专门的结构(如
nettyChannelWsDeviceGroup
、nettyChannelWsWatchmanGroup
) watchmanDeviceMap
管理值班账号绑定的设备列表
- 重要特点:
- 类是 Spring 的 单例 Bean,保证整个应用运行期间该缓存管理器只有一个实例
ConcurrentMap
作为成员变量被反复使用,支持多线程安全访问- 多线程读写
ConcurrentMap
性能优越,不会出现卡死或全局锁
- 应用场景:
- 绑定用户信息到通道上,方便后续消息处理快速鉴权和识别
- 维护用户在线状态,实现消息广播和连接管理
- 保障连接状态跨业务逻辑共享且不丢失
2. Spring 单例 Bean 的缓存管理器特性
- Spring 默认 Bean 是单例,整个容器只有一个实例,成员变量生命周期与容器一致
- 通过单例保证缓存数据能跨线程、跨请求共享,避免重复创建导致的缓存丢失
- 如果不是单例,缓存管理器中保存的 Map 会分散,导致状态错乱、连接映射失败
- 总结:单例 Bean 是实现全局状态共享和管理缓存的关键保障
3. CHANNELID_CHANNEL_MAP 是实时连接的映射
- 用途:记录当前所有在线的 Netty WebSocket 连接(Channel)
- 行为:
- 连接建立时加入 Map
- 连接断开时移除 Map
- 区别于业务映射:
- 业务映射(如账号 ⇌ Channel)是用户与连接的绑定
- CHANNELID_CHANNEL_MAP 是连接本身的实时管理
4. WebSocket、MQTT、HTTP、TCP/UDP 协议实现者解析
协议 | 所属层级 | 实现者 | 说明 |
---|---|---|---|
TCP/UDP | 传输层 | 操作系统内核(协议栈) | 程序员通过 Socket 等接口使用,协议由系统实现 |
HTTP | 应用层 | 框架或库(Netty、Tomcat等) | 框架解析HTTP报文,实现协议逻辑 |
WebSocket | 应用层 | 框架(Netty、Spring等) | 基于 HTTP 协议升级建立持久连接,实现自定义消息传递 |
MQTT | 应用层 | 专门的客户端库或服务器(EMQX、MQTTX等) | 发布订阅协议,解析 MQTT 报文,实现消息通信 |
- MQTTX 类似 Postman,是基于 MQTT 协议的调试客户端,实现了协议解析和消息交互功能。
5. Netty 的发明与设计理念
- 发明者:Trustin Lee(2004年起开发)
- 目标:打造高性能、异步事件驱动的网络通信框架,简化网络编程复杂度
- 核心设计:
- Channel:抽象的网络连接
- Pipeline:责任链模式的事件处理链
- Handler:链上的处理器,负责处理各种网络事件和数据
- 灵活协议支持:
- 提供 ByteBuf 等基础设施,支持自定义编码器和解码器
- 内置 HTTP、WebSocket 支持,也能自定义实现各种协议
- 事件驱动模型:
- 事件由 Netty 触发,传递给 Pipeline 中的 Handler
- 用户自定义 Handler 完成业务逻辑,保证解耦和扩展性
- 高性能保障:
- 基于 Java NIO,非阻塞异步 I/O
- 支持零拷贝和内存复用
6. Netty 的优势总结
特点 | 说明 |
---|---|
异步事件驱动 | 事件驱动模型,效率高,避免阻塞 |
责任链设计 | Pipeline + Handler,实现灵活的业务组合 |
多协议支持 | 支持 HTTP、WebSocket、MQTT 等多协议 |
自定义扩展性强 | 可以轻松添加自定义协议的编解码和处理逻辑 |
高性能 | 通过底层NIO和优化策略保障高吞吐低延迟 |