# ronan-im **Repository Path**: chenzhenguo/ronan-im ## Basic Information - **Project Name**: ronan-im - **Description**: 消息推送 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2021-06-30 - **Last Updated**: 2021-06-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 高并发消息推送服务架构设计 ## 前言 1. `ronan-im`是什么? `ronan-im`是一个基于`netty`开发的**消息推送的服务**。 2. 为什么要开发`ronan-im`? 学习。 ## 项目介绍 `ronan-im`基于**SpringCloud微服务架构**的项目,底层通信采用了**netty**,通信协议是**TCP**,数据包序列化用的是**protobuf**。 ## 组织结构 ```xml ronan-im ├─ .gitignore ├─ pom.xml // 父级pom文件 ├─ ronan-eureka-server // eureka 服务注册中心 │ ├─ pom.xml │ └─ src │ └─ main │ ├─ java │ │ └─ com │ │ └─ ronan │ │ └─ eureka │ │ └─ EurekaServerApplication.java │ └─ resources │ └─ application.properties ├─ ronan-im-common // 公共包 │ ├─ pom.xml │ └─ src │ └─ main │ └─ java │ └─ com │ └─ ronan │ └─ common │ ├─ codec // 编解码包 │ │ ├─ RIMFrameDecoder.java │ │ ├─ RIMProtocolDecoder.java │ │ └─ RIMProtocolEncoder.java │ ├─ constant // 常量包 │ │ ├─ Constants.java │ │ ├─ MsgManager.java │ │ └─ OpeManager.java │ ├─ exception // 全局异常 │ │ └─ GlobalHandlerExceptionResolver.java │ ├─ pojo // 对象 │ │ ├─ ExistAccountReq.java │ │ ├─ RIMUserInfo.java │ │ ├─ SendMsgReq.java │ │ └─ SendMsgVo.java │ ├─ proto // protobuf数据序列化 │ │ ├─ Heart.java │ │ ├─ HeartOrBuilder.java │ │ ├─ Login.java │ │ ├─ LoginOrBuilder.java │ │ ├─ Message.java │ │ ├─ MessageOrBuilder.java │ │ └─ RIM.java │ ├─ protocol // 项目自定义协议 │ │ ├─ IRIMHeader.java │ │ ├─ IRIMProtocol.java │ │ ├─ RIMHeader.java │ │ └─ RIMProtocol.java │ ├─ response // Restful风格全局统一Response │ │ ├─ Result.java │ │ └─ ResultCode.java │ └─ utils // 工具类 │ ├─ RIMCommandManager.java │ └─ SessionManager.java ├─ ronan-im-server // im-server 长连接服务 │ ├─ pom.xml │ └─ src │ └─ main │ ├─ java │ │ └─ com │ │ └─ ronan │ │ └─ imserver │ │ ├─ ImServerApplication.java │ │ ├─ config │ │ │ └─ RedisConfig.java │ │ ├─ controller // 开放的api接口 │ │ │ └─ RIMController.java │ │ ├─ handler │ │ │ ├─ RIMBizHandler.java │ │ │ └─ RIMHandlerInitializer.java │ │ ├─ processor │ │ │ ├─ HeartProcessor.java │ │ │ ├─ LoginProcessor.java │ │ │ ├─ RIMProcessor.java │ │ │ └─ RIMProcessorManager.java │ │ ├─ server │ │ │ └─ RIMServer.java │ │ ├─ service │ │ │ ├─ RIMService.java │ │ │ ├─ RedisService.java │ │ │ ├─ RpcWebService.java │ │ │ └─ impl │ │ │ ├─ RIMServiceImpl.java │ │ │ ├─ RedisServiceImpl.java │ │ │ └─ RpcWebServiceImpl.java │ │ └─ utils │ │ └─ SpringBeanFactory.java │ ├─ proto │ │ └─ RIM.proto │ └─ resources │ └─ application.properties ├─ ronan-im-web // im-web web服务,主要负责im用户的注册、登录、下线、数据持久化、历史消息查询...同时也开放了api,可作为第三方服务 │ ├─ pom.xml │ └─ src │ └─ main │ ├─ java │ │ └─ com │ │ └─ ronan │ │ └─ imweb │ │ ├─ ImWebApplication.java │ │ ├─ config │ │ │ └─ RedisConfig.java │ │ ├─ controller │ │ │ ├─ AccountController.java │ │ │ └─ MessageController.java │ │ ├─ dao │ │ │ ├─ AccountDao.java │ │ │ └─ MyBatisBaseDao.java │ │ ├─ model │ │ │ └─ Account.java │ │ ├─ req │ │ │ ├─ LoginReq.java │ │ │ └─ RegisterReq.java │ │ ├─ service │ │ │ ├─ AccountService.java │ │ │ ├─ IMServerRpcService.java │ │ │ ├─ MessageService.java │ │ │ ├─ RedisService.java │ │ │ ├─ UserInfoCacheService.java │ │ │ ├─ fallback │ │ │ │ └─ IMServerRpcServiceFallBackImpl.java │ │ │ └─ impl │ │ │ ├─ AccountServiceImpl.java │ │ │ ├─ MessageServiceImpl.java │ │ │ ├─ RedisServiceImpl.java │ │ │ └─ UserInfoCacheServiceImpl.java │ │ └─ vo │ │ ├─ LoginVo.java │ │ └─ RegisterVo.java │ └─ resources │ ├─ application.properties │ └─ mapper │ └─ AccountDao.xml └─ ronan-im.iml ``` ## 技术选型 | 技术 | 名称 | 描述 | | ----------- | ----------- | ------------------------------------------------------------ | | SpringCloud | SpringCloud | 微服务分布式框架 | | SpringBoot | SpringBoot | Spring的具体应用 | | Netty | Netty | 提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序 | | Redis | Redis | 非关系型数据库,保存用户登录状态 | | Mongodb | Mongodb | 非关系型数据库,主要是用来保存消息数据 | | Mysql | Mysql | 关系型数据库,用来保存业务数据 | | Kafka | Kafka | *Kafka*是一种高吞吐量的分布式发布订阅消息系统,用来消息持久化处进行解耦 | | Eureka | Eureka | 服务注册中心 | | Hystrix | Hystrix | 服务熔断 | | Feign | Feign | 服务间声明式调用| | Protobuf | Protobuf | 数据序列化 | | Maven | Maven | 项目构建管理 | ## 架构设计 ![ronan-im架构设计](http://assets.processon.com/chart_image/604080ca6376893122da3168.png) ![服务建立流程](http://assets.processon.com/chart_image/605025447d9c087fe257264a.png) 思路: 1. 客户端先注册到当前系统(im-web),返回accid,name,token等待数据。 2. 用户注册成功后进行登录,保存登录信息,下发可用的im-server服务器(使用轮询算法)。 3. 用户拿到im-server进行长连接登录,保存登录状态。 4. 长连接建立,游戏数据的上行和下行。 5. 同时,在im-web服务开放了消息推送接口,解决项目中所遇到的消息推送场景。 **登录注册流程** ![image-20210304150235376](https://i.loli.net/2021/03/04/HRA4M2jv7ExsiyQ.png) **消息推送实现** ![image-20210304150143999](https://i.loli.net/2021/03/05/3RJxYLDk786jVFv.png) ## 模块介绍 - **ronan-im** > 父级模块 - **ronan-im-common** > 公共模块 - **ronan-im-web** > 开放接口服务模块 - **ronan-im-server** > 长连接服务模块 ## 功能实现 - [x] 注册 - [x] 登录 - [x] 心跳 - [x] 消息推送 - [x] 单聊 - [x] 群聊(给服务器其他在线的用户发送消息) - [ ] 消息持久化 - [ ] 历史消息查询 - [ ] 登入事件抄送 - [ ] 登出事件抄送 - [ ] ...