6k+点赞的SpringBoot+Netty分布式即时通讯系统!爱了爱了!

2024-01-01 17:32

本文主要是介绍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/


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

深夜,聊聊架构设计

深夜,分享一个Git小技巧

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

这篇关于6k+点赞的SpringBoot+Netty分布式即时通讯系统!爱了爱了!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/560005

相关文章

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.