哈喽,大家好,我是开源君,一个资深的互联网玩家,致力于为大家分享各领域优质开源项目。
微信或 QQ 是我们大家很常用的聊天工具,其实还有很多即时通讯的地方,比如某宝的客服啥的。说起这个开源君想起一个故事。朋友小 C 有一次和女朋友吵架,结果女朋友把他微信,QQ 全删了,电话也拉黑了。为了哄女朋友,小 C 于是想起了自己还有女友的某付宝好友,于是就开启了某付宝哄女友模式...
而今天开源君给大家推荐的项目 Open-IM-Server
,它是开源的即时通讯工具,从服务端到客户端 SDK 开源即时通讯(IM)整体解决方案,可以轻松替代第三方 IM 云服务,打造具备聊天、社交功能的 app。开源君体验了一下,做得有模有样,感觉挺不错,自己搭个 QQ 出来,做管理员,再也不怕被拉黑了,哈哈哈。

项目功能
这个项目含有多种功能:
消息类型
消息类型 | 备注 |
---|---|
文本消息 | 消息内容为普通文本 |
图片消息 | 消息内容为图片 URL 地址、尺寸、图片大小等信息,包括原图、大图、缩略图 |
语音消息 | 消息内容为语音文件的 URL 地址、时长、大小、格式等信息; |
视频消息 | 消息内容为视频文件的 URL 地址、时长、大小、格式等信息; |
Tips 消息 | 包括群通知,例如例如有成员进出群组,群的描述信息被修改,群成员的资料发生变化等;也包括好友资料修改通知; |
文件消息 | 消息内容为文件的 URL 地址、大小、格式等信息,格式不限 |
地理位置消息 | 消息内容为地理位置标题、经度、纬度信息 |
自定义消息 | 开发者任何自定义的消息类型 |
多端登录
多端登录类型 |
---|
只允许一端登录,Windows、Web、Android、iOS 彼此互踢 |
桌面 PC 与 Web 端互踢、移动 Android 和 iOS 端互踢、桌面与移动端可同时登录 |
各端均可以同时登录在线 |
好友
功能 | 功能描述 |
---|---|
查找好友 | 可通过用户帐号 ID 查找好友 |
申请添加好友 | 要选择默认是否需要申请理由,目前是默认不需要 |
添加好友 | 发送添加好友请求 |
删除好友 | 成为好友后可以删除好友 |
获取所有好友 | 获取所有好友的详细信息 |
同意/拒绝好友 | 收到请求加好友请求的系统通知后,可以通过或者拒绝,处理后申请人能收到通知 |
添加用户到黑名单 | 把用户拉黑,如果此前是好友关系不解除好友关系,通过字段来标识为黑名单 |
移除黑名单 | 把用户从黑名单中移除 |
除此之外还有群聊,数据统计,用户资料,消息同步和漫游等等。
平台支持
项目提供了 Flutter,uniapp 和安卓原生以及 web 或者小程序的 API。同时也提供了服务端的 API 可以进行账号体系和后台的管理。可以比较轻松的将 SDK 集成到我们的项目中。
架构介绍
客户端
客户端 SDK 负责和 IM 服务端交互,本地数据存储和同步,消息、事件回调。开发者通过集成 SDK,自行开发聊天界面 UI,设置事件监听回调实现数据和 UI 对接。Open-IMSDK 分为三层:网络层、逻辑层、存储层。分层治理,各司其职,实现高效、稳定、统一的客户端架构。
(1)网络层:负责和服务端保持 websocket 连接、断网重连,接收消息推送,以确保在线时消息以及各种事件能实时达到。负责初始登录时、重连时数据补齐,通过对比本地 seq 和服务端最大 seq,同步拉取差值消息或事件,确保客户端和服务端达到最终一致的状态。
(2)逻辑层:针对主动调用接口和事件被动触发,对接网络层和存储层,实现业务细节,根据逻辑完成与 UI 之间的回调。比如发送消息,SDK 为 UI 提供发送消息及回调接口,逻辑层调用存储层存储本地消息,调用网络层发送消息,成功或失败回调 UI,并触发会话改变回调。同样接收消息或事件,网络层把消息或事件传给逻辑层,逻辑层根据消息或事件的类型做相应处理,比如存储本地消息,触发会话改变回调等。
(3)存储层:采用 sqlite 轻量级数据库,完成本地和服务端的数据同步,包括会话、消息、事件、通讯录、群组等,对外提供的数据 get 接口,通过本地数据库获取,实现了无网络情况下能查看消息等本地数据,同时也能有效缓解服务端的压力,达到了数据同步和缓存的双重目的。
服务端

服务端由接入层、逻辑层和存储层组成,好处在于各个层次能够依据业务特点专注于自己的事情,提高系统复用性,降低业务间的耦合。
(1)接入层:消息通过 websocket 协议接入,其他通过 http/https 协议接入,消息是高频及核心功能,通过双协议路由,体现了轻重分离的设计思想。
(2)逻辑层:通过 rpc 实现无状态逻辑服务,易于平行扩展,消息通过 MQ 解耦。
(3)存储层:redis 存储 token 和 seq;mongodb 存储离线消息,并定时删除 14 天(可自行配置)前数据;mysql 存储全量历史消息以及用户相关资料。数据分层存储,充分利用不同存储组件的特性。
(4)Etcd:服务注册和发现、以及分布式配置中心。
更多 Github 项目使用方式与玩法,点击下方卡片,回复 20211103 获取项目地址。
写在最后
欢迎加入开源指南读者交流群,聊天学习摸鱼为主,有一群有趣有料的小伙伴在等你哦!进群方式:开源指南 公众号 回复 666,按提示操作即可进群。

