6k+点赞的springboot+netty分布式即时通讯系统!爱了爱了!(代码片段)

singwhatiwanna singwhatiwanna     2023-03-07     784

关键词:

最近公司开发需要用到 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/


推荐阅读
你亲手写的代码,正在出卖你

深夜,聊聊架构设计

深夜,分享一个Git小技巧

编程·思维·职场
欢迎扫码关注

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.自然销毁  函数调用完成后,浏览器会自动销毁函数... 查看详情