IM 开源系列
IM 即时通讯系统-41-开源 野火IM 专注于即时通讯实时音视频技术,提供优质可控的IM+RTC能力
IM 即时通讯系统-42-基于netty实现的IM服务端,提供客户端jar包,可集成自己的登录系统
IM 即时通讯系统-45-merua0oo0 IM 分布式聊天系统
IM 即时通讯系统-46-OpenIM 提供了专为开发者设计的开源即时通讯解决方案
IM 即时通讯系统-47-beardlessCat IM 使用netty开发分布式Im,提供分布netty集群解决方案
IM 即时通讯系统-48-aurora-imui 是个通用的即时通讯(IM)UI 库,不特定于任何 IM SDK
IM 即时通讯系统-49-云信 IM UIKit 是基于 NIM SDK(网易云信 IM SDK)开发的一款即时通讯 UI 组件库,包括聊天、会话、圈组、搜索、群管理等组件
IM 即时通讯系统-50-📲cim(cross IM) 适用于开发者的分布式即时通讯系统
IM
https://github.com/crossoverJie/cim
CIM

V2.0
x\] 升级至 JDK17 和 Spring Boot 3.0 \[x\] 客户端 SDK \[ \] 客户端使用 picocli 替代 Spring Boot。 \[x\] 支持集成测试。 \[ \] 集成 OpenTelemetry。 \[ \] 支持单节点启动(不含任何组件)。 \[ \] 支持第三方组件替换(如 Redis/Zookeeper 等)。 \[ \] 支持 Web 客户端(WebSocket)。 \[ \] 支持 Docker 容器。 \[ \] 支持 Kubernetes 运行。 \[ \] 支持二进制客户端(使用 Golang 构建)。 ## 介绍 CIM(CROSS-IM) 是一个面向开发者的 IM(即时通讯) 系统,同时也提供了一些组件,帮助开发者构建可扩展的 IM 系统。使用 CIM,您可以实现以下需求: 实现 IM 即时通讯系统。 为 APP 提供消息推送中间件。 为 IOT 大规模连接场景提供消息中间件。 如果在使用或开发过程中有任何问题,您可以联系作者。 ### TODO LIST * [x] [群聊](#群聊) * [x] [私聊](#私聊) * [x] [内置命令](#内置命令) * [x] [聊天记录查询](#聊天记录查询)。 * [x] [一键开启价值 2 亿的 `AI` 模式](#一键开启价值 2 亿的 AI 模式) * [x] 使用 `Google Protocol Buffer` 高效编解码 * [x] 根据实际情况灵活的水平扩容、缩容 * [x] 服务端自动剔除离线客户端 * [x] 客户端自动重连 * [x] [延时消息](#延时消息) * [x] SDK 开发包 * [ ] 分组群聊 * [ ] 离线消息 * [ ] 消息加密 ### 架构 CIM 中的每个组件都是使用 SpringBoot 构建的。 客户端使用 cim-client-sdk 构建。 使用 Netty 构建底层通信。 使用 MetaStore 用于 IM-server 服务的注册与发现。 ### cim-server IM 服务器用于接收客户端连接、消息转发、消息推送等功能,支持集群部署。 ### cim-route 路由服务器,用于处理消息路由、消息转发、用户登录、用户离线以及一些运维工具(如获取在线用户数量等)。 ### cim-client IM 客户端终端,可以通过命令启动并与他人进行通信(群聊、私聊)。 ### 流程图  * 服务器向 MetaStore 注册。 * 路由服务器订阅 MetaStore。 * 客户端登录到路由服务器。 * 路由服务器从 MetaStore 获取服务器信息。 * 客户端与服务器建立连接。 * 客户端 1 向路由服务器发送消息。 * 路由服务器选择服务器并将消息转发到服务器。 * 服务器将消息推送至客户端 2。 ### 快速启动 首先需要安装 `Zookeeper、Redis` 并保证网络通畅。 ```shell docker run --rm --name zookeeper -d -p 2181:2181 zookeeper:3.9.2 docker run --rm --name redis -d -p 6379:6379 redis:7.4.0 ``` ```shell git clone https://github.com/crossoverJie/cim.git cd cim mvn clean package -DskipTests=true cd cim-server && cim-client && cim-forward-route mvn clean package spring-boot:repackage -DskipTests=true ``` #### 部署 IM-server(cim-server) ```shell cp /cim/cim-server/target/cim-server-1.0.0-SNAPSHOT.jar /xx/work/server0/ cd /xx/work/server0/ nohup java -jar /root/work/server0/cim-server-1.0.0-SNAPSHOT.jar --cim.server.port=9000 --app.zk.addr=zk地址 > /root/work/server0/log.file 2>&1 & ``` > cim-server 集群部署同理,只要保证 Zookeeper 地址相同即可。 #### 部署路由服务器(cim-forward-route) ```shell cp /cim/cim-server/cim-forward-route/target/cim-forward-route-1.0.0-SNAPSHOT.jar /xx/work/route0/ cd /xx/work/route0/ nohup java -jar /root/work/route0/cim-forward-route-1.0.0-SNAPSHOT.jar --app.zk.addr=zk地址 --spring.redis.host=redis地址 --spring.redis.port=6379 > /root/work/route/log.file 2>&1 & ``` > cim-forward-route 本身就是无状态,可以部署多台;使用 Nginx 代理即可。 #### 启动客户端 ```shell cp /cim/cim-client/target/cim-client-1.0.0-SNAPSHOT.jar /xx/work/route0/ cd /xx/work/route0/ java -jar cim-client-1.0.0-SNAPSHOT.jar --server.port=8084 --cim.user.id=唯一客户端ID --cim.user.userName=用户名 --cim.route.url=http://路由服务器:8083/ ``` 如上图,启动两个客户端可以互相通信即可。 #### 本地启动客户端 ##### 注册账号 ```shell curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{ "reqNo": "1234567890", "timeStamp": 0, "userName": "zhangsan" }' 'http://路由服务器:8083/registerAccount' ``` 从返回结果中获取 `userId` ```json { "code":"9000", "message":"成功", "reqNo":null, "dataBody":{ "userId":1547028929407, "userName":"test" } } ``` ##### 启动本地客户端 ```shell # 启动本地客户端 cp /cim/cim-client/target/cim-client-1.0.0-SNAPSHOT.jar /xx/work/route0/ cd /xx/work/route0/ java -jar cim-client-1.0.0-SNAPSHOT.jar --server.port=8084 --cim.user.id=上方返回的userId --cim.user.userName=用户名 --cim.route.url=http://路由服务器:8083/ ``` ### 客户端内置命令 | 命令 | 描述 | |----------------------------|---------------------| | `:q!` | 退出客户端 | | `:olu` | 获取所有在线用户信息 | | `:all` | 获取所有命令 | | `:q [option]` | 【:q 关键字】查询聊天记录 | | `:ai` | 开启 AI 模式 | | `:qai` | 关闭 AI 模式 | | `:pu` | 模糊匹配用户 | | `:info` | 获取客户端信息 | | `:emoji [option]` | 查询表情包 \[option:页码\] | | `:delay [msg] [delayTime]` | 发送延时消息 | | `:` | 更多命令正在开发中。。 | #### 聊天记录查询  使用命令 `:q 关键字` 即可查询与个人相关的聊天记录。 > 客户端聊天记录默认存放在 `/opt/logs/cim/`,所以需要这个目录的写入权限。也可在启动命令中加入 `--cim.msg.logger.path = /自定义` 参数自定义目录。 #### AI 模式  使用命令 `:ai` 开启 AI 模式,之后所有的消息都会由 `AI` 响应。 `:qai` 退出 AI 模式。 #### 前缀匹配用户名  使用命令 `:qu prefix` 可以按照前缀的方式搜索用户信息。 > 该功能主要用于在移动端中的输入框中搜索用户。