# 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

nim

实时消息推送服务

code style

码云地址: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)