(本代码仅供学习,严禁用于非法行为)
JIM(Jerbe's Instant Messaging) 是一个轻量的聊天系统,
- 代码纯golang编写,支持私聊、群聊和世界频道聊天
- 实现了一些常用的功能。包括邀请成为好友、搜索好友、加好友、删好友、创建群、加入群、邀请进群、退出群等常规接口。
- 业务易扩展,代码相对整洁,有做了详细备注
- 日志系统相对完善,详细记录了业务各项字段,日志输出为json格式,方便ELK收集使用。
- 使用交叉编译可以进行跨平台编译及部署
- 使用swag文档规范,使用swag init 即可生成对应API文档,方便前端进行调试
漂亮的前端界面- 使用了神奇的github action,多平台编译,可在release下载对应平台执行文件
语言: golang
依赖服务: redis、mongodb、mysql/mariadb
日志包: github.com/rs/zerolog
sql操作: github.com/jmoiron/sqlx
1)MySQL作为用户信息、好友关系、群组信息的存储数据库;MongoDB用于消息存储数据库。 Redis作为订阅服务、缓存存储服务。
2)用户登录获取token,并使用token进行建立ws链接,由于发送消息需要权限验证及一些策略过滤,需要响应是否发送完成,所以ws链接一般只用于接收服务端消息,发送聊天消息不依赖ws。
3)在多服务实例的情况下,由于用户建立WS链接的服务器是随机的,所以我们在每个服务实例里使用`websocket.manager`包的管理器进行链接统一管理,订阅到的数据最终也有管理器进行分发到不同的用户链接上。
4)因为我们需要管理聊天消息,所以发消息时,消息是先入库,成功后再进行订阅推送。
5)支持获取每个房间的最近X条消息,及历史消息遍历。
测试发送速度,10s执行了5750个并发,每个op耗时2151984纳秒,约等于2.151984毫秒感觉不够快,allocs还挺多的,得继续优化.受限于机器配置,不知道高配置怎么样
> /usr/local/opt/go/libexec/bin/go test -c -o /data/github.com/jerbe/jim/bin/handler_BenchmarkChatSendMessageParallel.test github.com/jerbe/jim/handler #gosetup
> /data/github.com/jerbe/jim/bin/handler_BenchmarkChatSendMessageParallel.test -test.v -test.paniconexit0 -test.bench ^\QBenchmarkChatSendMessageParallel\E$ -test.run ^$ -test.benchmem -test.benchtime=10s
> goos: darwin
> goarch: amd64
> pkg: github.com/jerbe/jim/handler
> cpu: Intel(R) Core(TM) i5-4308U CPU @ 2.80GHz
> BenchmarkChatSendMessageParallel-4 5750 2151984 ns/op 469167 B/op 3090 allocs/op
1. 部署好相关服务:mysql/mariadb、mongodb、redis
2. 配置config文件:config.yml从文件夹 config 里面获取,并修改成对应的服务地址
3. 将sql文件夹里的创表sql语句文件导入到mysql/mariadb中,其中,`all.sql`为所有数据库创建语句,其他的为各个表的单独创建语句
以下是计划中的功能
- Websocket通道
- 跨服务器推送
- 接收聊天消息
- 接收通知消息
- 用户注册
- 验证码验证
- 强密码验证
- 邮箱绑定
- 限定注册时限开关
- 用户登录
- 验证码验证
- 被禁用无法登录
- 被删除无法登录
- 用户登出
- 找回账户
- 账户信息
- 密码修改
- 头型修改
- 昵称修改
- 在线状态修改
- 查找好友
- 按ID查找
- 按昵称查找
- 好友申请
- 申请好友时进行备注
- 成为好友时同时打招呼
- 好友编辑
- 修改备注
- 移除好友
- 移除后删除所有聊天记录
- 拉黑好友
- 拉黑后删除无法再次被加为好友
- 好友列表
- 隐身好友不显示
- 创建群组
- 加入群组
- 群成员管理
- 限制成员人数
- 黑名单群成员禁止再次进群
- 移除群成员
- 移除群成员时同时设置黑名单
- 指定群管理员
- 修改群成员群内昵称
- 群信息修改
- 群主转移
- 群昵称修改
- 群头像修改
- 退出群组
- 解散群组
- 聊天列表
- 置顶聊天
- 聊天房间的最后消息
- 私聊
- 纯文本聊天
- 发送图片
- 发送表情包
- 发送视频
- 发送语音
- 发送位置
- 语音聊天
- 视频聊天
- 私聊消息已读
- 撤回聊天内容
- 被好友拉黑无法对话
- 被好友删除无法对话
- 群聊
- 纯文本聊天
- 发送图片
- 发送表情包
- 发送视频
- 发送语音
- 发送位置
- 语音聊天
- 视频聊天
- 消息已读
- 撤回聊天内容
- 全体禁言
- 某群成员禁言
- 世界频道聊天
- 世界频道开关
- 世界频道禁言