您的位置 首页 golang

基于 Go 实现的即时通讯(IM)项目,提供多平台SDK

《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个由前微信技术专家打造的基于 Go 实现的即时通讯(IM)项目——OpenIM。

Open-IM是由前微信技术专家打造的开源的即时通讯组件。Open-IM包括IM服务端和客户端SDK,实现了高性能、轻量级、易扩展等重要特性。开发者通过集成Open-IM组件,并私有化部署服务端,可以将即时通讯、实时网络能力快速集成到自身应用中,并确保业务数据的安全性和私密性。

Open-IM的优势

  • 开源永久免费 :代码全部开源,永久免费,包括客户端和服务端,由前微信技术专家打造,并邀请全球技术极客参与建设。
  • 易扩展 :服务端采用golang实现,首创“一切皆消息”的通讯模型,轻松实现自定义消息和扩展功能。
  • 专业技术服务 :每个技术人员都承担技术客服的角色,强化社区,不提工单,及时解答。
  • 高性能 :借鉴并优化通讯架构,抽象在线消息、离线消息、历史消息存储模型,分层治理架构,支持集群部署。
  • 安全 :代码全部开源,服务端私有化部署,数据自我掌控。未来加入全球最安全的signal端到端加密协议。
  • 全平台支持 :支持Andorid、iOS原生开发,支持Flutter、uni-app跨端开发,支持小程序、React等所有主流web前端技术框架, PC支持Electron,Flutter、iOS、uni-app已有成熟demo可以体验。开发者可以使用Open-IM替代市场上各种IM云服务,除了降低成本,还赋予开发者更多的灵活性和自主性。我们通过开源的方式,邀请全球技术极客来参与Open-IM建设,使每位开发者都能免费使用最优秀的IM组件,让每个app都具备即时通讯能力。

Open-IM包括哪些模块

  • 客户端

1. golang实现的跨平台的SDK

2. 在Open-IM-SDK-Core 基础上生成的iOS版本SDK

3. 在Open-IM-SDK-Core 基础上生成的Android版本SDK

4. 在Open-IM-SDK-iOS、Open-IM-SDK-Android生成的Flutter版本SDK

5. 在Open-IM-SDK-iOS、Open-IM-SDK-Android生成的uni-app版本SDK

6. 基于Open-IM-SDK-iOS开发的、供开发者参考的iOS Demo

7. 基于Open-IM-SDK-Android开发的Android Demo

8. 基于Open-IM-SDK-Flutter开发的Flutter Demo

9. 基于Open-IM-SDK-Uniapp开发的uni-app Demo

  • 服务端

1. 纯golang实现的服务端

2. docker镜像:open-im-server

  • 管理后台

包含统计报表、用户管理等运营管理系统:Open-IM-Admin

客户端界面

Open-IM主要功能

  • 多端登录

  • 消息类型

  • 消息功能

  • 用户资料托管

  • 用户关系托管

  • 群组

  • 数据统计

服务端架构

整体架构

服务端由接入层、逻辑层和存储层组成,好处在于各个层次能够依据业务特点专注于自己的事情,提高系统复用性,降低业务间的 耦合

  • 接入层:消息通过 websocket 协议接入,其他通过 http/https 协议接入,消息是高频及核心功能,通过双协议路由,体现了轻重分离的设计思想。
  • 逻辑层:通过 rpc 实现无状态逻辑服务,易于平行扩展,消息通过 MQ 解耦
  • 存储层:redis 存储 token 和 seq; mongodb 存储离线消息,并定时删除 14 天(可自行配置)前数据;mysql 存储全量历史消息以及用户相关资料。数据分层存储,充分利用不同存储组件的特性。
  • Etcd:服务注册和发现、以及分布式配置中心。

消息架构

Open-IM 消息模型采用经典的收件箱模型,并通过全局 seq 做消息对齐,这里带来架构的简化,体现了简单美的架构设计理念。

  • 绿色箭头表示用户 A 给 B 发送消息流程:用户 A 发送消息, msg _gateway 进行消息拆分,并落地 MQ,MQ 根据 userId 写入不同的 partition 后返回给 A 成功,消息发送流程结束。
  • 蓝色箭头表示 A 给 B 发送消息后,服务端给 B 推送消息流程:msg_transfer 通过 MQ 消费者监听消息达到,通过 redis 增加 userId 对应的 seq,并把 seq 和消息关联后写入 mongodb,并异步写入 mysql,前者用于离线消息存储,比如用户不在线或者推送失败时同步消息使用,后者主要做历史消息备份,用于管理后台或其他用途。写入成功后,再调用 pusher 推送,根据 B 所连接的 msg_gateway,进行消息推送(由于网络波动或者 B 不在线等原因,可能会推送失败)。
  • 粉色箭头表示 B 主动同步和服务端差量消息流程:客户端在任何有重连动作(包括重新登录、网络波动等)发生时,首先会获取自身在服务端最大的 seq,和本地 seq 做差值对比,把差值消息通过接口主动拉取到本地,这样完成了本地和服务端消息对齐。

消息发送、消息对齐等与服务器交互的逻辑,通过 Open-IM-SDK 的方式提供给大家使用,简化了开发流程。

客户端架构

客户端架构

客户端 SDK 负责和 IM 服务端交互,本地数据存储和同步,消息、事件回调。开发者通过集成 SDK,自行开发聊天界面 UI,设置事件监听回调实现数据和 UI 对接。

Open-IMSDK 分为三层:网络层、逻辑层、存储层。分层治理,各司其职,实现高效、稳定、统一的客户端架构。

  • 网络层:负责和服务端保持 websocket 连接、断网重连,接收消息推送,以确保在线时消息以及各种事件能实时达到。负责初始登录是、重连时数据补齐,通过对比本地 seq 和服务端最大 seq,同步拉取差值消息或事件,确保客户端和服务端达到最终一致的状态。
  • 逻辑层:针对主动调用接口和事件被动触发,对接网络层和存储层,实现业务细节,根据逻辑完成与 UI 之间的回调。比如发送消息,SDK 为 UI 提供发送消息及回调接口,逻辑层调用存储层存储本地消息,调用网络层发送消息,成功或失败回调 UI,并触发会话改变回调。同样接收消息或事件,网络层把消息或事件传给逻辑层,逻辑层根据消息或事件的类型做相应处理,比如存储本地消息,触发会话改变回调等。
  • 存储层:采用 sqlite 轻量级数据库,完成本地和服务端的数据同步,包括会话、消息、事件、通讯录、群组等,对外提供的数据 get 接口,通过本地数据库获取,实现了无网络情况下能查看消息等本地数据,同时也能有效缓解服务端的压力,达到了数据同步和缓存的双重目的。

SDK 集成流程

Open-IM SDK 集成非常简单,由于开发者私有化部署,代码、配置、数据都在自家服务器上,不用向云平台申请 AppKey 和 Secret,相比第三方 IM 云服务,可见 Open-IM 更安全、可控、自由度更高。

更多内容大家可自行前往阅读。

开源地址:

文章来源:智云一二三科技

文章标题:基于 Go 实现的即时通讯(IM)项目,提供多平台SDK

文章地址:https://www.zhihuclub.com/98619.shtml

关于作者: 智云科技

热门文章

网站地图