Spring WebSocket 基础实现

背景

业务背景:

对有涉及敏感信息的主播,推送弹窗通知,包含 app 和 主播 端

技术方案:

1)轮询     
2)长轮询   
3)socket

推送技术对比:

对比 SSE WebSocket
通信类型 半双工通信模型 全双工通信模型
浏览器支持 Microsoft IE 和 Edge 不支持 SSE 可用于所有主要浏览器
工作量 小:只需发送一条包含特定标头的 HTTP 消息。 中等:需要建立并维护 TCP 套接字通信。在服务器端还需要一个监听器套接字。
通信 客户端无法向服务端主动发送消息 双端可相互通信

是什么?

基本:

1)基于 TCP 的轻量级网络通信协议
2)WebSocket 都是为了解决HTTP 某方面的缺陷而诞生的。针对的是“请求-应答”通信模式

特点:

Spring WebSocket 基础实现_第1张图片
1)全双工通信协议

80,443

ws://njpush.lizhifm.com  
wss://njpush.lizhifm.com 
wss://njpush.lizhifm.com?token=qwertyuiop

2)帧结构
Spring WebSocket 基础实现_第2张图片

结束标志位 + 操作码 + 帧长度 + 掩码

"FIN"                消息结束标记位
"RSV1、RSV2、RSV3"   保留位,必须是0
"Opcode"             操作码,帧类型(1:纯文本 2:二进制 8:关闭连接 9:ping 10:pong)
"MASK"               掩码标志位
"Payload len"        帧内容长度
"Masking-key"        掩码密钥

3)握手

标准的HTTP GET 请求握手
Connection: Upgrade         表示要求协议“升级”
Upgrade: websocket          表示要“升级”成 WebSocket 协议。
Sec-WebSocket-Key:         一个 Base64 编码的 16 字节随机数,作为简单的认证密钥
Sec-WebSocket-Version:     协议的版本号,当前必须是 13

Sec-WebSocket-Accept:      验证客户端请求报文,同样也是为了防止误连接 【sha1(Sec-WebSocket-Key+uuid)】

握手后通信消息为二进制帧结构 

为什么?

Spring WebSocket 文档
stomp-websocket 文档
SpringBoot 集成WebSocket 同时支持STOMP协议通信

消息流程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WLNxAz4g-1592147343365)(https://docs.spring.io/spring-framework/docs/5.0.0.BUILD-SNAPSHOT/spring-framework-reference/html/images/message-flow-simple-broker.png)]
图中介绍:

  • 生产者型客户端(左上组件): 发送SEND命令到某个目的地址(destination)的客户端。
  • 消费者型客户端(左下组件): 订阅某个目的地址(destination), 并接收此目的地址所推送过来的消息的客户端。
  • request channel: 一组用来接收生产者型客户端所推送过来的消息的线程池。
  • response channel: 一组用来推送消息给消费者型客户端的线程池。
  • broker: 消息队列管理者,也可以成为消息代理。它有自己的地址(例如“/topic”),客户端可以向其发送订阅指令,它会记录哪些订阅了这个目的地址(destination)。
  • 应用目的地址(图中的“/app”): 发送到这类目的地址的消息在到达broker之前,会先路由到到带“@MessageMapping”方法上。相当于对进入broker的消息进行一次拦截,目的是针对消息做一些业务处理。
  • 非应用目的地址(图中的“/topic”,也是消息代理地址): 发送到这类目的地址的消息会直接转到broker。不会被应用拦截。
基本介绍
- Message - 消息包含消息头和数据
- MessageHandler - 交换消息
- MessageChannel - 发送消息
- SubscribableChannel - 继承 MessageChannel,发送消息去MessageHandler注册订阅
- ExecutorSubscribableChannel - 具体实现 SubscribableChannel,支持线程池发送消息
- clientInboundChannel 来自WebSocket 客户端消息
- clientOutboundChannel 用于向WebSocket客户端发送消息
- brokerChannel 用于传输从服务器端应用程序代码向消息代理发送消息

怎么做?

时序图

Spring WebSocket 基础实现_第3张图片

配置WebSocket节点和相关信息

Spring WebSocket 基础实现_第4张图片

会话信息

Spring WebSocket 基础实现_第5张图片

简单的发送消息

Spring WebSocket 基础实现_第6张图片
Spring WebSocket 基础实现_第7张图片

客户端接收到的消息

Spring WebSocket 基础实现_第8张图片

优化方向

1)目前是每台机器消费全量Kafka
需要网关功能,针对不同的用户消息分发到不同的机器上。
2)消息确认机制,有序

分享工具

模拟websocket普通文本
模拟websocket

你可能感兴趣的:(JAVA,Spring)