'JiChat' 的IM系统:不仅支持多客户端登录,还实现了历史消息同步、消息顺序一致性和零消息丢失的特性,同时支持端到端加密会话保护用户隐私。为确保系统的可扩展性,整个架构按照百万级用户流量的标准进行设计,并支持无缝的横向扩展。
系统采用了分布式架构,基于 Spring Cloud 实现微服务化,服务注册和发现方面使用 Nacos,消息中间件选择 RabbitMQ,持久性数据存储采用 MySQL 数据库,缓存层使用 Redis。在数据访问层面,使用 MyBatis-Plus 简化数据库操作。服务之间通过 OpenFeign 实现远程调用,以提高服务之间的通信效率。为了满足即时通讯需求,引入了 Netty 框架,以实现高性能、实时的消息传递。
- 用户A向聊天服务器1发送聊天消息。
- 聊天服务器1从ID生成器获取消息ID。
- 聊天服务器1将消息发送到消息同步队列。
- 消息存储在键值存储中。
- a.如果用户 B 在线,则消息将转发到用户 B 所在的聊天服务器 2连接的。
- b. 如果用户 B 离线,则从推送通知 (PN) 服务器发送推送通知。
- 聊天服务器2将消息转发给用户B。有一个持久的TCP用户 B 和聊天服务器 2 之间的连接。
消息大略流程: 客户端A→服务端a→服务端b→客户端B
请执行doc目录中的docker-compose.yml文件,以安装RabbitMQ、Nacos、MySQL、Redis等组件。如果Nacos安装失败,请确保在MySQL中初始化Nacos所需的nacos-db.sql文件数据。
进行JiChat数据库的初始化,执行jichat_user.sql脚本。然后,修改user-service-app和chat-service-app服务的配置文件,确保连接到正确的RabbitMQ、Nacos、MySQL和Redis地址以及账号信息。最后,启动user-service-app和chat-service-app服务。
调用user-service-app的注册账号接口后,修改chat-client的application-dev.yaml文件中的用户信息和连接地址,即可启动客户端。为了方便实现通信,建议在dev和test配置文件中使用不同端口和用户id
chat-server swagger: http://localhost:18080/chat-api/doc.html#/home
user-server swagger: http://localhost:18081/user-api/doc.html#/home
chat-client swagger: http://localhost:9192/doc.html#/home
JiChat 博客地址 https://blog.csdn.net/weixin_42887222/article/details/135910752