# nim
**Repository Path**: Lihangjun/nim
## Basic Information
- **Project Name**: nim
- **Description**: NIM项目是基于netty的实时消息推送系统,支持集群扩展、http消息发送、消息持久化、推送监听、多模式推送以及管理与监控等。
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 9
- **Forks**: 8
- **Created**: 2020-12-23
- **Last Updated**: 2025-01-18
## Categories & Tags
**Categories**: message-server
**Tags**: None
## README
实时消息推送服务
码云地址:https://gitee.com/Lihangjun/nim.git
# 项目介绍
qq:1185192813
邮箱:1185192813@qq.com
NIM项目是基于netty的实时消息推送系统,NIM已完成服务端1.0,其客户端web,Android,ios,flutter的SDK将在不久发布。
目前NIM服务端使用springboot搭建,NIM主要具备如下特点:
+ **集群扩展**:nim支持横向扩展,更具自身需要,可任意增加服务数量
+ **http消息发送**:客户端通过API接口发送消息,方便权限控制且通过发布服务接口与其它系统集成
+ **消息持久化**:使用mongodb进行持久化(也可自己实现持久化),持久化推送消息以及用户组信息
+ **推送监听**:暂支持双通道(redis 订阅/rocketMQ)监听消息,保证消息推送及时性与可达性,使用者也可扩展以及选择监听模式,默认使用redis 订阅消息
+ **多模式推送**:支持广播,组播和单播模式
+ **管理与监控(暂未完成)**:提供对nim连接的监控与管理(包括集群环境),且支持消息管理与拦截发送
---
# 架构设计图
---
# 使用说明
1. 根据自身环境修改配置文件application.yml。例如mongo,redis,rocketMQ的配置
2. netty服务与web服务端口不同,使用者可修改server/xxxxServer.java文件中的port和path来指定连接路径
```text
@ServerEndpoint(port = "8181", path = "/v1/im/broadcast")
```
3. 集群部署可结合nginx代理提供统一连接地址
4. 消息格式说明:
```
UNICAST("单播", 1),
MULTICAST("组播", 2),
BROADCAST("广播", 3);
```
```
TEXT("文本", 1),
IMAGE("图片", 2),
VOICE("声音", 3),
VIDEO("视频", 4);
```
```
AUTH("鉴权", 1),
HANDSHAKE("握手", 2),
HEARTBEAT("心跳", 3),
EXIT("离线", 4),
CLOSE("强制下线", 5),
CHAT("聊天", 6);
```
```
/**
* 消息标识id
*/
private String messageId;
/**
* 消息时间戳
*/
private Long timestamp;
/**
* 来源用户id
*/
private String fromUserId;
/**
* 目标用户id
*/
private String toUserId;
/**
* 用户组id
*/
private String toGroupId;
/**
* 数据类型
*/
private Integer mineType;
/**
* 聊天类型
*/
private Integer chatType;
/**
* 消息类型
*/
private Integer msgType;
/**
* 消息标志
*/
private String flag;
/**
* 消息内容
*/
private String content;
/**
* 携带数据
*/
private Object extras;
```
---
# 使用示例
design/wobsocket.html提供了web连接测试页面,连接成功后根据api接口发送消息。
+ 发送广播消息
```
请求地址:http://127.0.0.1:8080/api/v1/common/send
请求头:Content-Type = application/json
请求方法:POST
请求参数:
{
"content": "hello,有人吗",
"extras": null
}
```
+ 发送组播消息
```
请求地址:http://127.0.0.1:8080/v1/im/send
请求头:Content-Type = application/json
请求方法:POST
注意:fromUserId本应在用户鉴权信息中解析而得,这里为了方便测试,由使用者自己设置,如需要使用者可自己添加接口权限控制
请求参数:
{
"fromUserId": "123456",
"content": "hello,有人吗",
"toGroupId": "11111",
"extras": null
}
```
+ 发送单播消息
```
请求地址:http://127.0.0.1:8080/v1/im/send
请求头:Content-Type = application/json
请求方法:POST
注意:fromUserId本应在用户鉴权信息中解析而得,这里为了方便测试,由使用者自己设置,如需要使用者可自己添加接口权限控制。若消息发送目标有多个特定用户,可以逗号分隔多个用户id传参
请求参数:
{
"fromUserId": "123456",
"content": "hello,有人吗",
"toUserId": "1111,2222,3333",
"extras": null
}
```
+ 获取netty服务连接信息
```
请求地址:http://127.0.0.1:8080/v1/api/count
请求头:Content-Type = application/json
请求方法:GET
响应示例:{"flag":true,"code":2000,"message":"success","data":"广播用户数:0,单播用户数:0,组播用户数:0"}
```
+ 连接netty服务
```
广播连接地址:ws://192.168.1.21:8181/v1/im/broadcast
广播连接示例:ws://192.168.1.21:8181/v1/im/broadcast
组播连接地址:ws://192.168.1.21:8181/v1/im/multicast/{userId}/{groupId}
组播连接示例:ws://192.168.1.21:8181/v1/im/multicast/123456/1111
单播连接地址:ws://192.168.1.21:8181/v1/im/unicast/{userId}
单播连接示例:ws://192.168.1.21:8181/v1/im/unicast/123456
```
# 下一步计划
1. 发布SDK及其文档
2. 提供netty服务监控
3. 提供容器化一键部署脚本
4. 增强可扩展性和灵活性
5. 降低耦合性,提供独立的im中间件以及二次开发接口
6. 提供更加灵活的配置,使用者根据自己选择组装im服务(多种持久化方案,多种监听通道,多种网络通信服务模式等)
# 开源许可协议
[Apache License 2.0](https://gitee.com/Lihangjun/nim/blob/master/LICENSE)