写点什么

GitHub 上标星 68k,基于 SpringBoot+Netty 分布式开源的即时通讯系统项目

发布于: 2020 年 09 月 30 日

最近公司开发需要用到 IM 系统,自己开发的话需要耗费较多时间和精力。于是我们考虑在开源项目的基础上二次开发,我们对比了较多开源方案之后,选择了 CIM[1] 。



项目简介



CIM(CROSS-IM)项目是面向开发者的 即时通信 系统,项目基于目前比较流行的 SpringBoot 进行构建(项目依赖的Spring Boot 版本为 1.5.x ,可以自行升级到最新稳定版本),基于 Netty 进行网络通信。利用Redis来存放客户端的账户/状态(是否在线)/路由等信息,同时使用Zookeeper来完成服务间的发现。



通过 CIM(CROSS-IM) 你可以设计一款属于自己可水平扩展的 IM 。



转发+关注,然后添加VX(tkzl6666) 即可获得项目地址的获取方式!



功能列表



  • 群聊

  • 私聊

  • 聊天记录查询

  • AI 自动聊天(价值两亿的智能模式哦)

  • 延时消息

  • 客户端自动重连

  • 服务端自动剔除离线客户端

  • 支持水平扩容/缩容

  • 支持Protocol Buffer协议



项目截图



群聊:







私聊:





项目技术栈



  • Spring Boot

  • Zookeeper

  • Netty

  • Redis

  • ...



可以看到项目中用到的都是技术都是很常用技术,同时也是我们需要掌握的能力。而且crossoverJie 大佬的代码写的也相当漂亮,非常值得学习一波。



先来简单看一下系统整体架构!



系统架构





下面我们来一起看下几个关键实现吧。



代码简单分析



群聊



群聊的使用非常简单,只需要在控制台输入消息回车即可。



这时会去调用 route 的群聊接口。





实现的效果就是其中一个客户端发消息,其余所有客户端都能收到!



流程肯定是客户端发送一条消息到服务端,服务端收到后在上文介绍的 SessionSocketHolder 中遍历所有 Channel(通道)然后下发消息即可。



服务端是单机倒也可以,但现在是集群设计。所以所有的客户端会根据之前的轮询算法分配到不同的 服务端实例中。







接着会挨个调用每个客户端所在的服务端的 HTTP 接口用于推送消息。







私聊



私聊也是同理,但前提是需要触发关键字;使用 userId;;消息内容 这样的格式才会给某个用户发送消息,所以一般都需要先使用 :olu 命令获取所以在线用户才方便使用。





在线用户查看



这是一个辅助接口,可以查询出当前在线用户信息。







实现也很简单,也就是查询之前保存 ”用户登录状态的那个去重 set “即可。



后记



CIM[3] 的功能包含但不限于此,其他功能就等你自己去体验喽~



体贴的crossoverJie 大佬还为该项目写了很多 相关的文章[4],分享了一些他开发这个项目的设计流程/遇到的问题,包含了很多大佬的思考。小伙伴们可要好好利用起来哦~



以下是文章列表:





按照 crossoverjie 大佬的设想,该项目还有很多 todo list,感兴趣的小伙伴在学习之余也可以贡献自己的一份力量,积极的参与开源哈!



用户头像

添加我的微信:tkzl6666 获取文中资料 2020.09.19 加入

添加我的微信:tkzl6666 获取文中资料

评论 (4 条评论)

发布
用户头像
2020 年 10 月 08 日 02:13
回复
用户头像
GitHub 上标星 68k,基于 SpringBoot+Netty 分布式开源的即时通讯系统项目
2020 年 09 月 30 日 15:37
回复
能把6.8K吹成68K,服了你
2020 年 09 月 30 日 22:28
回复
哈哈哈
2020 年 10 月 09 日 11:41
回复
没有更多了
GitHub上标星68k,基于SpringBoot+Netty分布式开源的即时通讯系统项目