6k+点赞的SpringBoot+Netty分布式即时通讯系统!爱了爱了!
最近公司开发需要用到 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,感兴趣的小伙伴在学习之余也可以贡献自己的一份力量,积极的参与开源哈!
参考资料
[1]
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/
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 排障集锦:九九八十一难之第十六难!-------------enoent ENOENT: no such file or directory, open ‘/root/package.json‘
- 大点干!早点散----------深入剖析GFS分布式文件系统
- 大点干!早点散----------ELK企业日志分析系统理论+实战!
- 面试题系列第8篇:谈谈String、StringBuffer、StringBuilder的区别?
- HTTP协议的请求与数据抓包
- Ubuntu 18.04 LTS 通过 Netplan 配置网络教程
- 【kafka源码】kafka内部的一些术语
- TKE使用自建NFS持久化存储
- 网站 SSL 检测 PCI DSS 不合规解决办法
- leetcode链表之分割链表
- 五分钟带你读懂 TCP全连接队列(图文并茂)
- Python基础
- JDK15正式发布,新增功能预览!
- Magicodes.IE 2.3重磅发布——.NET Core开源导入导出库
- 安防视频监控系统视频上云解决方案EasyCVR音频基础知识介绍