目标
实现一个WebSocket服务中心,支持水平扩展
技术栈
SpringBoot、Netty、JDK8、MySQL、Redis、RabbitMQ、MyBatis-Plus
环境搭建
主要功能点说明
WebSocket连接需要认证
服务端提供token获取接口,WS连接前先获取token
认证信息由服务端提供
Http接口请求需要认证
这里的接口一般就是推送接口
后续可以把推送记录也做成接口进行查询
支持单笔推送
根据注册信息,查询到用户,进行推送
支持批量推送
根据注册信息,查询到用户,进行推送
支持MQ异步推送
支持定时推送
记录推送日志
记录连接日志
支持集群部署
代码设计
WebSocket连接需要认证
开发一个http接口用于获取认证头,WebSocket在注册上来的时候,只有带有正确的认证头,服务端才允许其注册
-
相关设计
- 一张保存了认证信息的表:reg_user
- 一个获取token的http接口
- 一个判断token是否合法的Service层方法
- reg_user表结构
-
核心逻辑
- 一旦认证请求通过,将token存储到Redis中,并设置Key的过期时间
- 校验的时候,通过查询Redis实现,只要还有这个token作为Key的键值对存在,就说么token合法
-
待完善
- 权限认证不够严谨,仅做到了身份识别,还没有进行精细化的权限控制
- 关于接入方的账号分配,目前需要手工进行
- 认证信息的密码是明文进行的存储
Http接口请求需要认证
- 编写一个过滤器,对于需要认证的接口,获取请求头中的token,进行合法性校验
MQ异步发送
- 作为消费者,消费异步请求
-
作为生产者,将调用结果广播出去
- fanout模式进行广播
- 同时自己也监听此广播,保证至少有一个消费者
使用JMeter进行WebSocket压力测试
核心代码
获取认证token
检查token是否有效
SpringBoot与Netty的整合
推送接口
MQ异步推送
源码
源码
本文由博客一文多发平台 OpenWrite
发布!
原文
https://segmentfault.com/a/1190000021240422