【自研项目之分布式IM】02. 架构篇

205 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情

架构介绍

整个架构的技术选型上都是市面主流的东西,既然作为个人项目,实现上可以选用自己熟悉的,吹起牛来才能一套一套。

1. 技术选型

  • 微服务选用Spring Cloud全家桶
  • 注册中心推荐Nacos,后续可以用它来实现Socket长连接服务和gRpc的服务发现
  • 数据库推荐使用NoSql,MySql关系型数据库也是可以的
  • Socket长连接服务选用Netty,Socket服务尽量与业务解藕,专注于长连接的管理。
  • 微服务和Socket长连接服务通讯使用gRpc。
  • 其他中间件就不说了,大家都懂的

注意:技术选型上要基于自己熟悉掌握来选择

最后将这些组件组合起来得出一个整体的架构图。

架构图.jpg 架构图无需画的太复杂,特别是在面试中经常会先问你:请你画一画架构图。那就需要在有限的时间内尽可能的画出完整的架构图。

2. 组件详解

2.1 Sping Cloud搭建微服务

微服务搭建就不用说了,对这个不熟悉的建议先去学习下,方便后续理解。

2.2 网关

网关使用Spring Cloud Gateway,它的职责:

  1. 服务转发
  2. 权限校验
  3. 限流等等...

注意:在面试对线中,可能会问到网关和Nginx的区别

2.3 业务微服务

实际情况会存在多个服务,这里简化成2个微服务用于学习理解。一个业务逻辑处理服务(logic-service),另一个为推送服务(push-service)。下图为微服务的业务流程:

业务.jpg

2.3.1 logic-service业务服务

作为消息的统一入口,集中处理消息的业务逻辑,并将消息通过MQ转发给推送服务(push-service)。
logic-service的特点:高可用、可横向拓展,面对突增流量可弹性增加服务,并且对其他服务无影响。

2.3.2 push-service推送服务

push-service推送服务顾名思义就是将消息推送到Socket服务,它消费logic-service转发的队列消息,然后经过路由组件发送给目标用户所在的Socket服务。重点关注push-service和Socket服务的通讯方式,这里使用的是gRpc通讯,也可以使用Redis的订阅发布或其他方式。后面章节会详解这部分。

2.4 Socket长连接服务

SpringBoot+Netty组合都很熟悉了,就不介绍了。主要关注几个点

  • 通讯协议,可以是Json、ProtoBuf、也可以自定义协议。
  • 半包处理,可以使用Netty提供的,也可以自己实现。
  • SocketChannel会话管理
  • 消息类型业务实现
  • 多设备管理等等

题外话:也有项目是使用gRpc、RabbitMQ或者其他来实现。

举个栗子

整体架构介绍完毕,下面通过一个简单的例子来说明系统的运作流程。
用户A发送一条消息给用户B的流程

  1. 用户A以Http方式发送消息

Http发送消息.jpg 2. 用户A以TCP/WebSocket方式发送消息

Tcp发送消息.jpg 以上是架构的整体介绍,下一篇将详细介绍微服务部分。文章若有错误或建议,欢迎留言~