关键词:
最近公司开发需要用到 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/
推荐阅读
你亲手写的代码,正在出卖你
编程·思维·职场
欢迎扫码关注
dim-基于electron,netty和springboot的分布式im
DIM-基于Electron,Netty和SpringBoot的分布式IM先说下背景,因为作者最近在学Netty,想着把学到的运用一下,所以就有了这个项目项目介绍DIM的D指的是distributed,界面用的是Electron+Vue2搭建(为什么不是Vue3,因... 查看详情
微服务springboot整合redis实现点赞点赞排行榜(代码片段)
文章目录⛅引言一、发布探店笔记二、查看探店笔记三、SpringBoot整合Redis实现点赞功能四、SpringBoot整合Redis实现点赞排行榜⛵小结⛅引言本博文参考黑马程序员B站Redis课程系列在点评项目中,有这样的需求,如何实现笔... 查看详情
邀请在帖子上点赞的人点赞粉丝专页效果测量
】邀请在帖子上点赞的人点赞粉丝专页效果测量【英文标题】:Invitepeoplelikedonposttolikefanpageeffectivenessmeasurement【发布时间】:2017-06-0602:49:23【问题描述】:我要找出我正在管理的Facebook页面的点赞来源。我的页面点赞数远低于100K... 查看详情
点赞设计
需求:对某一个试题或者某一个话题或者某一个新闻点赞,每个人只能点赞一次,第一次点赞的时候增加1再一次点赞的时候就取消点赞设计: 1.用户点赞必须要登陆才可以,这样就可以获取该用户的uid; 2.设计数据表 ... 查看详情
Mongoose 查询最近 24 小时内获得点赞的文档
】Mongoose查询最近24小时内获得点赞的文档【英文标题】:Mongoosequeryfordocumentsthatgotlikesonlast24hours【发布时间】:2020-06-0300:55:08【问题描述】:我有这个文章架构:vararticle=newmongoose.Schema(....likes:[id:ObjectId,by:type:ObjectId,ref:\'User\',crea... 查看详情
第四篇点赞的粒子动画
点赞动画iOS自带了粒子引擎的类CAEmitterLayer,是一个粒子发射器系统,每个粒子都是CAEmitterCell的实例。可以查看它们分别有什么属性。有两个小点,一个是CAEmitterLayer一些属性对CAEmitterCell有成倍作用,如birthRate;另一个是没... 查看详情
新课上线-java分布式中间件大汇聚实战第1季(基于springboot2.0+典型业务场景+点赞系统+面试突击)
概要介绍:本门课程属于“Java分布式中间件大汇聚实战”系列课程,主要介绍了企业级项目中真实的应用场景的实现及主流的Java核心技术栈(Redis、RabbitMQ、SpringAOP、Redisson、ZooKeeper…)的实战等等。除此之外ÿ... 查看详情
列表和点赞的小项目(代码片段)
...模型——填写展示名称文章列表,数据库名article_list点赞右边的内容类型添加表格的字段:文章标题title、作者author、缩略图picurl、内容富文本content、浏览数hits2、创建点赞的模型——填写展示名称点赞用户,数据库... 查看详情
列表和点赞的小项目(代码片段)
文章只要包含以下功能和它们的应用1、CMS内容管理2、云开发模块,有云函数、云数据库的高级查询功能,数据库的增删改查操作3、用户授权登录模块wx.getUserProfile获得用户的昵称和头像4、getCurrentPages小程序页面栈的使... 查看详情
列表和点赞的小项目(代码片段)
文章只要包含以下功能和它们的应用1、CMS内容管理2、云开发模块,有云函数、云数据库的高级查询功能,数据库的增删改查操作3、用户授权登录模块wx.getUserProfile获得用户的昵称和头像4、getCurrentPages小程序页面栈的使... 查看详情
l2-021.点赞狂魔(代码片段)
微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。然而有这么一种人,他们会通过给自己看到的一切内容点赞来狂... 查看详情
--3
...你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单,请你找出那两位要请客的倒霉蛋。输入格式:输入按照点赞的先后顺序给出不知道多少个点赞的人名,每个人名占一行,为不超过10个英文字母的 查看详情
不得不点赞的3款国内reactnative应用
参考技术A原文在实际应用中,纯用ReactNative开发的应用不多见,优秀的就更少了。下面就说3款体验起来很棒的应用吧。目前应用只支持iOS版,体验起来良好,功能上还是很不错,方便前端开发进行调试,比如说自定义UserAgent,... 查看详情
分布式理论,架构设计netty高级应用(代码片段)
...码实现网页版聊天室websocketWebSocket和HTTP的区别代码实现springboot+nettynetty中的粘包和拆包粘包和拆包的解决办法Netty高级应用HTTP服务器开发Netty的HTTP协议栈无论在性能还是可靠性上,都表 查看详情
分布式理论,架构设计netty高级应用(代码片段)
...码实现网页版聊天室websocketWebSocket和HTTP的区别代码实现springboot+nettynetty中的粘包和拆包粘包和拆包的解决办法Netty高级应用HTTP服务器开发Netty的HTTP协议栈无论在性能还是可靠性上,都表 查看详情
l1-034点赞(代码片段)
微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特... 查看详情
servlet——http介绍(帅气漂亮的都会点赞的哦!!!)(代码片段)
文章目录前言一、HTTP协议简绍二、HTTP工作原理三、HTTP请求消息结构四、HTTP协议常见状态五、使用程序获取网页内容显示(代码演示)小结前言本文主要简绍的内容是:1、什么是http协议2、http的工作原理3、http请求... 查看详情
闭包的讲解及点赞的案例
1.闭包:函数在调用的时候会形成一个私有的作用域,对内部的变量起到保护的作用,这就是闭包 2.变量的销毁: 1.人为销毁 vara=12; a=null; 2.自然销毁 函数调用完成后,浏览器会自动销毁函数... 查看详情