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

最近公司开发须要用到 IM 系统,本身开发的话须要耗费较多时间和精力。因而咱们考虑在开源项目的基础上二次开发,咱们对比了较多开源方案以后,选择了 CIM[1] 。算法

项目简介

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

经过 CIM(CROSS-IM) 你能够设计一款属于本身可水平扩展的 IM 。架构

转发+关注,而后添加VX(tkzl6666) 便可得到项目地址的获取方式!学习

功能列表

  • 群聊设计

  • 私聊blog

  • 聊天记录查询接口

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

  • 延时消息开发

  • 客户端自动重连io

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

  • 支持水平扩容/缩容

  • 支持Protocol Buffer协议

项目截图

群聊:

 

 

私聊:

 

项目技术栈

  • Spring Boot

  • Zookeeper

  • Netty

  • Redis

  • ...

能够看到项目中用到的都是技术都是很经常使用技术,同时也是咱们须要掌握的能力。并且crossoverJie 大佬的代码写的也至关漂亮,很是值得学习一波。

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

系统架构

 

下面咱们来一块儿看下几个关键实现吧。

代码简单分析

群聊

群聊的使用很是简单,只须要在控制台输入消息回车便可。

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

 

实现的效果就是其中一个客户端发消息,其他全部客户端都能收到!

流程确定是客户端发送一条消息到服务端,服务端收到后在上文介绍的 SessionSocketHolder 中遍历全部 Channel(通道)而后下发消息便可。

服务端是单机倒也能够,但如今是集群设计。因此全部的客户端会根据以前的轮询算法分配到不一样的 服务端实例中。

 

 

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

 

 

私聊

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

 

在线用户查看

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

 

 

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

后记

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

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

如下是文章列表:

 

按照 crossoverjie 大佬的设想,该项目还有不少 todo list,感兴趣的小伙伴在学习之余也能够贡献本身的一份力量,积极的参与开源哈!