# 分布式IM **Repository Path**: bored-and-causing-trouble/distributed-im ## Basic Information - **Project Name**: 分布式IM - **Description**: 学习搞一个分布式IM - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-16 - **Last Updated**: 2025-11-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 一、数据库表设计 ## 1、用户相关表 ```sql -- 用户表 CREATE TABLE `im_user` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID', `username` VARCHAR(64) NOT NULL COMMENT '用户名', `nickname` VARCHAR(64) DEFAULT NULL COMMENT '昵称', `avatar` VARCHAR(255) DEFAULT NULL COMMENT '头像URL', `phone` VARCHAR(20) DEFAULT NULL COMMENT '手机号', `email` VARCHAR(128) DEFAULT NULL COMMENT '邮箱', `password` VARCHAR(128) NOT NULL COMMENT '密码(加密)', `status` TINYINT(4) DEFAULT 1 COMMENT '状态: 0-禁用 1-正常', `last_login_time` DATETIME DEFAULT NULL COMMENT '最后登录时间', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`), KEY `idx_phone` (`phone`), KEY `idx_email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; -- 用户会话表(存储用户登录的token和设备信息) CREATE TABLE `im_user_session` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `user_id` BIGINT(20) NOT NULL COMMENT '用户ID', `device_id` VARCHAR(128) NOT NULL COMMENT '设备ID', `device_type` VARCHAR(32) NOT NULL COMMENT '设备类型: WEB/IOS/ANDROID', `token` VARCHAR(255) NOT NULL COMMENT '登录token', `refresh_token` VARCHAR(255) DEFAULT NULL COMMENT '刷新token', `expire_time` DATETIME NOT NULL COMMENT '过期时间', `ip_address` VARCHAR(64) DEFAULT NULL COMMENT 'IP地址', `status` TINYINT(4) DEFAULT 1 COMMENT '状态: 0-失效 1-有效', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_token` (`token`), KEY `idx_user_id` (`user_id`), KEY `idx_device_id` (`device_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户会话表'; ``` ## 2、好友关系表 ```sql -- 好友关系表 CREATE TABLE `im_friend` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `user_id` BIGINT(20) NOT NULL COMMENT '用户ID', `friend_id` BIGINT(20) NOT NULL COMMENT '好友ID', `remark` VARCHAR(64) DEFAULT NULL COMMENT '备注名', `status` TINYINT(4) DEFAULT 0 COMMENT '状态: 0-待同意 1-已同意 2-已拒绝 3-已删除', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_user_friend` (`user_id`, `friend_id`), KEY `idx_friend_id` (`friend_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='好友关系表'; -- 好友申请记录表 CREATE TABLE `im_friend_apply` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `from_user_id` BIGINT(20) NOT NULL COMMENT '申请人ID', `to_user_id` BIGINT(20) NOT NULL COMMENT '被申请人ID', `apply_msg` VARCHAR(255) DEFAULT NULL COMMENT '申请消息', `status` TINYINT(4) DEFAULT 0 COMMENT '状态: 0-待处理 1-已同意 2-已拒绝', `handle_time` DATETIME DEFAULT NULL COMMENT '处理时间', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_from_user` (`from_user_id`), KEY `idx_to_user` (`to_user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='好友申请记录表'; ``` ## 3、群组相关表 ```sql -- 群组表 CREATE TABLE `im_group` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `group_name` VARCHAR(128) NOT NULL COMMENT '群名称', `avatar` VARCHAR(255) DEFAULT NULL COMMENT '群头像', `description` VARCHAR(500) DEFAULT NULL COMMENT '群描述', `owner_id` BIGINT(20) NOT NULL COMMENT '群主ID', `max_members` INT(11) DEFAULT 500 COMMENT '最大成员数', `status` TINYINT(4) DEFAULT 1 COMMENT '状态: 0-解散 1-正常', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_owner_id` (`owner_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='群组表'; -- 群成员表 CREATE TABLE `im_group_member` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `group_id` BIGINT(20) NOT NULL COMMENT '群ID', `user_id` BIGINT(20) NOT NULL COMMENT '用户ID', `role` TINYINT(4) DEFAULT 0 COMMENT '角色: 0-普通成员 1-管理员 2-群主', `nickname` VARCHAR(64) DEFAULT NULL COMMENT '群内昵称', `join_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '加入时间', `status` TINYINT(4) DEFAULT 1 COMMENT '状态: 0-已退出 1-正常', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_group_user` (`group_id`, `user_id`), KEY `idx_user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='群成员表'; ``` ##  4、消息相关表 ```sql -- 消息表(分表存储,按时间或用户ID分表) CREATE TABLE `im_message` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `msg_id` VARCHAR(64) NOT NULL COMMENT '消息唯一ID', `from_user_id` BIGINT(20) NOT NULL COMMENT '发送者ID', `to_user_id` BIGINT(20) DEFAULT NULL COMMENT '接收者ID(单聊)', `group_id` BIGINT(20) DEFAULT NULL COMMENT '群ID(群聊)', `msg_type` TINYINT(4) NOT NULL COMMENT '消息类型: 1-文本 2-图片 3-语音 4-视频 5-文件 6-位置 7-系统消息', `content` TEXT COMMENT '消息内容', `extra` JSON DEFAULT NULL COMMENT '扩展字段(JSON格式)', `status` TINYINT(4) DEFAULT 0 COMMENT '状态: 0-发送中 1-已送达 2-已读 3-失败', `send_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '发送时间', `read_time` DATETIME DEFAULT NULL COMMENT '已读时间', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_msg_id` (`msg_id`), KEY `idx_from_user` (`from_user_id`), KEY `idx_to_user` (`to_user_id`), KEY `idx_group_id` (`group_id`), KEY `idx_send_time` (`send_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消息表'; -- 消息索引表(用于快速查询会话列表) CREATE TABLE `im_message_index` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `user_id` BIGINT(20) NOT NULL COMMENT '用户ID', `target_id` BIGINT(20) NOT NULL COMMENT '对方ID(用户或群)', `target_type` TINYINT(4) NOT NULL COMMENT '目标类型: 1-用户 2-群', `last_msg_id` VARCHAR(64) DEFAULT NULL COMMENT '最后一条消息ID', `last_msg_content` VARCHAR(500) DEFAULT NULL COMMENT '最后一条消息内容', `last_msg_time` DATETIME DEFAULT NULL COMMENT '最后消息时间', `unread_count` INT(11) DEFAULT 0 COMMENT '未读消息数', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_user_target` (`user_id`, `target_id`, `target_type`), KEY `idx_user_id` (`user_id`), KEY `idx_update_time` (`update_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消息索引表'; -- 消息已读状态表 CREATE TABLE `im_message_read` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `msg_id` VARCHAR(64) NOT NULL COMMENT '消息ID', `user_id` BIGINT(20) NOT NULL COMMENT '用户ID', `read_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_msg_user` (`msg_id`, `user_id`), KEY `idx_user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消息已读状态表'; ``` ## 5、系统配置表 ```sql -- 系统配置表 CREATE TABLE `im_system_config` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `config_key` VARCHAR(128) NOT NULL COMMENT '配置键', `config_value` TEXT COMMENT '配置值', `description` VARCHAR(255) DEFAULT NULL COMMENT '描述', `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_config_key` (`config_key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置表'; ``` # 二、系统架构设计 ┌─────────────────────────────────────────────────────────┐ │ API Gateway (Zuul/Spring Cloud Gateway) │ └─────────────────────────────────────────────────────────┘ │ ┌─────────────────┼─────────────────┐ │ │ │ ┌───────▼──────┐ ┌───────▼──────┐ ┌───────▼──────┐ │ User Service│ │ Message Service│ │ Group Service│ │ │ │ │ │ │ │ - 用户管理 │ │ - 消息存储 │ │ - 群组管理 │ │ - 好友管理 │ │ - 消息推送 │ │ - 群成员管理 │ │ - 认证授权 │ │ - 消息同步 │ │ │ └──────┬───────┘ └──────┬────────┘ └──────┬───────┘ │ │ │ └─────────────────┼─────────────────┘ │ ┌────────────────▼────────────────┐ │ IM Gateway Service │ │ (WebSocket/Netty) │ │ - 长连接管理 │ │ - 消息路由 │ │ - 心跳检测 │ └────────────────┬────────────────┘ │ ┌────────────────▼────────────────┐ │ Redis Cluster │ │ - 在线用户缓存 │ │ - 消息队列 │ │ - 分布式锁 │ └────────────────┬────────────────┘ │ ┌────────────────▼────────────────┐ │ MySQL Cluster │ │ - 主从复制 │ │ - 分库分表 │ └────────────────────────────────┘ # 三、完整模块架构 im-parent (父模块) │ ├── im-shared-kernel (共享内核) │ ├── im-shared-kernel-common (公共内核) │ ├── im-shared-kernel-event (领域事件) │ └── im-shared-kernel-exception (异常定义) │ ├── im-user-context (用户上下文) │ ├── im-user-api (用户接口层) │ ├── im-user-application (用户应用层) │ ├── im-user-domain (用户领域层) │ ├── im-user-infrastructure (用户基础设施层) │ └── im-user-starter (用户启动模块) │ ├── im-message-context (消息上下文) │ ├── im-message-api (消息接口层) │ ├── im-message-application (消息应用层) │ ├── im-message-domain (消息领域层) │ ├── im-message-infrastructure (消息基础设施层) │ └── im-message-starter (消息启动模块) │ ├── im-group-context (群组上下文) │ ├── im-group-api (群组接口层) │ ├── im-group-application (群组应用层) │ ├── im-group-domain (群组领域层) │ ├── im-group-infrastructure (群组基础设施层) │ └── im-group-starter (群组启动模块) │ ├── im-gateway-context (网关上下文) │ ├── im-gateway-api (网关接口层) │ ├── im-gateway-application (网关应用层) │ ├── im-gateway-infrastructure (网关基础设施层) │ └── im-gateway-starter (网关启动模块) │ └── im-infrastructure (基础设施) ├── im-infrastructure-persistence (持久化) ├── im-infrastructure-cache (缓存) ├── im-infrastructure-messaging (消息中间件) ├── im-infrastructure-config (配置中心) └── im-infrastructure-monitor (监控)