6k+点赞的SpringBoot+Netty分布式即时通讯系统!爱了爱了!
共 1659字,需浏览 4分钟
·
2020-09-10 18:38
最近公司开发需要用到 IM 系统,自己开发的话需要耗费较多时间和精力。于是我们考虑在开源项目的基础上二次开发,我们对比了较多开源方案之后,选择了 CIM[1] 。
项目简介
CIM(CROSS-IM)项目是面向开发者的 即时通信
系统,项目基于目前比较流行的 SpringBoot 进行构建(项目依赖的Spring Boot 版本为 1.5.x ,可以自行升级到最新稳定版本),基于 Netty 进行网络通信。利用Redis来存放客户端的账户/状态(是否在线)/路由等信息,同时使用Zookeeper来完成服务间的发现。
通过 CIM(CROSS-IM) 你可以设计一款属于自己可水平扩展的 IM
。
项目地址: https://github.com/crossoverJie/cim[2]
功能列表
群聊 私聊 聊天记录查询 AI 自动聊天(价值两亿的智能模式哦) 延时消息 客户端自动重连 服务端自动剔除离线客户端 支持水平扩容/缩容 支持Protocol Buffer协议
项目截图
群聊:
私聊:
项目技术栈
Spring Boot Zookeeper Netty Redis ...
可以看到项目中用到的都是技术都是很常用技术,同时也是我们需要掌握的能力。而且 crossoverJie
大佬的代码写的也相当漂亮,非常值得学习一波。
先来简单看一下系统整体架构!
系统架构
下面我们来一起看下几个关键实现吧。
代码简单分析
群聊
群聊的使用非常简单,只需要在控制台输入消息回车即可。
这时会去调用 route
的群聊接口。
实现的效果就是其中一个客户端发消息,其余所有客户端都能收到!
流程肯定是客户端发送一条消息到服务端,服务端收到后在上文介绍的 SessionSocketHolder
中遍历所有 Channel
(通道)然后下发消息即可。
服务端是单机倒也可以,但现在是集群设计。所以所有的客户端会根据之前的轮询算法分配到不同的 服务端实例中。
接着会挨个调用每个客户端所在的服务端的 HTTP
接口用于推送消息。
私聊
私聊也是同理,但前提是需要触发关键字;使用 userId;;消息内容
这样的格式才会给某个用户发送消息,所以一般都需要先使用 :olu
命令获取所以在线用户才方便使用。
在线用户查看
这是一个辅助接口,可以查询出当前在线用户信息。
实现也很简单,也就是查询之前保存 ”用户登录状态的那个去重 set
“即可。
后记
CIM[3] 的功能包含但不限于此,其他功能就等你自己去体验喽~
体贴的crossoverJie
大佬还为该项目写了很多 相关的文章[4],分享了一些他开发这个项目的设计流程/遇到的问题,包含了很多大佬的思考。小伙伴们可要好好利用起来哦~
以下是文章列表:
按照 crossoverjie
大佬的设想,该项目还有很多 todo list,感兴趣的小伙伴在学习之余也可以贡献自己的一份力量,积极的参与开源哈!
参考资料
CIM: https://github.com/crossoverJie/cim
[2]https://github.com/crossoverJie/cim: https://github.com/crossoverJie/cim
[3]CIM: https://github.com/crossoverJie/cim
[4]相关的文章: https://crossoverjie.top/categories/Netty/
后记
文章有帮助可以点个「在看」或「分享」,都是支持,我都喜欢!
我是Guide哥,Java后端开发,会一点前端知识,喜欢烹饪,自由的少年。一个三观比主角还正的技术人。我们下期再见!