Skip to content
/ cim Public
forked from crossoverJie/cim

📲cim(cross IM) 适用于开发者的分布式即时通讯系统

License

Notifications You must be signed in to change notification settings

cmgyqjj/cim

This branch is 16 commits behind crossoverJie/cim:master.

Folders and files

NameName
Last commit message
Last commit date
Sep 22, 2024
Sep 30, 2024
Sep 30, 2024
Sep 19, 2024
Sep 30, 2024
Sep 14, 2024
Sep 22, 2024
Sep 22, 2024
Sep 21, 2024
Aug 27, 2019
May 17, 2024
Sep 12, 2024
Sep 1, 2024
Feb 18, 2019
May 20, 2018
Sep 7, 2024
Sep 19, 2024

Repository files navigation


codecov Build Status

📘介绍 |📽视频演示 | 🏖TODO LIST | 🌈系统架构 |💡流程图|🌁快速启动|👨🏻‍✈️内置命令|🎤通信|❓QA|💌联系作者


V2.0

  • Upgrade to JDK17 & springboot3.0
  • Client SDK
  • Client use picocli instead of springboot.
  • Support integration testing.
  • Integrate OpenTelemetry .
  • Support single node startup(Contains no components).
  • Third-party components support replacement(Redis/Zookeeper, etc.).
  • Support web client(websocket).
  • Support docker container.
  • Support kubernetes operation.
  • Supports binary client(build with golang).

介绍

CIM(CROSS-IM) 一款面向开发者的 IM(即时通讯)系统;同时提供了一些组件帮助开发者构建一款属于自己可水平扩展的 IM

借助 CIM 你可以实现以下需求:

  • IM 即时通讯系统。
  • 适用于 APP 的消息推送中间件。
  • IOT 海量连接场景中的消息透传中间件。

在使用或开发过程中有任何疑问都可联系我

视频演示

点击下方链接可以查看视频版 Demo。

YouTube Bilibili
群聊 私聊 群聊 私聊

TODO LIST

系统架构

  • CIM 中的各个组件均采用 SpringBoot 构建。
  • 采用 Netty 构建底层通信。
  • Redis 存放各个客户端的路由信息、账号信息、在线状态等。
  • Zookeeper 用于 IM-server 服务的注册与发现。

cim-server

IM 服务端;用于接收 client 连接、消息透传、消息推送等功能。

支持集群部署。

cim-forward-route

消息路由服务器;用于处理消息路由、消息转发、用户登录、用户下线以及一些运营工具(获取在线用户数等)。

cim-client

IM 客户端;给用户使用的消息终端,一个命令即可启动并向其他人发起通讯(群聊、私聊)。

流程图

  • 客户端向 route 发起登录。
  • 登录成功从 Zookeeper 中选择可用 IM-server 返回给客户端,并保存登录、路由信息到 Redis
  • 客户端向 IM-server 发起长连接,成功后保持心跳。
  • 客户端下线时通过 route 清除状态信息。

快速启动

首先需要安装 Zookeeper、Redis 并保证网络通畅。

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
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)

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)

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 代理即可。

启动客户端

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/

如上图,启动两个客户端可以互相通信即可。

本地启动客户端

注册账号

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{
  "reqNo": "1234567890",
  "timeStamp": 0,
  "userName": "zhangsan"
}' 'http://路由服务器:8083/registerAccount'

从返回结果中获取 userId

{
    "code":"9000",
    "message":"成功",
    "reqNo":null,
    "dataBody":{
        "userId":1547028929407,
        "userName":"test"
    }
}

启动本地客户端

# 启动本地客户端
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 可以按照前缀的方式搜索用户信息。

该功能主要用于在移动端中的输入框中搜索用户。

群聊/私聊

群聊

群聊只需要在控制台里输入消息回车后即可发送,同时所有在线客户端都可收到消息。

私聊

私聊首先需要知道对方的 userID 才能进行。

输入命令 :olu 可列出所有在线用户。

接着使用 userId;;消息内容 的格式即可发送私聊消息。

同时另一个账号收不到消息。

emoji 表情支持

使用命令 :emoji 1 查询出所有表情列表,使用表情别名即可发送表情。

延时消息

发送 10s 的延时消息:

:delay delayMsg 10

联系作者

202405171520366.png

最近开通了知识星球,感谢大家对 CIM 的支持,为大家提供 100 份 10 元优惠券,也就是 69-10=59 元,具体福利大家可以扫码参考再决定是否加入。

PS: 后续会在星球开始 V2.0 版本的重构,感兴趣的可以加入星球当面催更(当然代码依然会开源)。

index.jpg

About

📲cim(cross IM) 适用于开发者的分布式即时通讯系统

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 99.5%
  • Other 0.5%