# 《分布式IM系统》即时通讯后端服务-第01节:即时通讯后端服务通用代码设计与实现

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)
课程视频:https://t.zsxq.com/15XHfbP8C (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本节难度:★★☆☆☆
  • 本节重点:对即时通讯后端服务通用代码进行设计和实现,重点掌握即时通讯后端服务通用代码的设计思想和落地实现方案,并能够将其灵活应用到自身实际项目中。
  • 课程视频:https://t.zsxq.com/15XHfbP8C (opens new window)

大家好,我是冰河~~

在设计和实现一套分布式系统的过程中,大到整套系统的架构设计,小到某个模块的设计,细化到代码层面,都会 有一些通用的实现方案。针对分布式IM即时通讯系统来说,也不例外,我们在设计和实现即时通讯后端服务的过程中,同样会有一些通用的设计和实现方案。

# 一、前言

对于分布式IM即时通讯系统的即时通讯后端服务来说,我们主要使用Netty来实现即时消息的收发功能,并且我们会默认同时支持TCP和WebSocket两种长连接方式。那在代码设计层面,我们如何兼顾代码的性能、扩展性和优雅性呢?

# 二、本节诉求

对分布式IM即时通讯系统的即时通讯后端服务的通用代码进行设计和实现,兼顾代码的性能、扩展性和优雅性,后期能够根据现有的代码随时进行扩展,重点理解通用代码的设计思想和落地方案,能够结合自身实际项目思考,并能够灵活应用到自身实际项目中。

# 三、代码设计

如何让即时通讯后端服务同时支持TCP和WebSocket两种长连接方式,并且兼顾到良好的性能、扩展性和优雅性呢?相信学过《Seckill分布式秒杀系统》 (opens new window)《分布式IM即时通讯系统》 (opens new window)的小伙伴,能够第一时间想到一个最基本的原则:面向接口编程,而非面向具体实现类编程,具体业务依赖接口,并不关心接口的具体实现类,接口可以具有多个实现类,各个实现类之间可以通过简单的配置实现灵活切换。

在即时通讯后端服务中,我们主要使用Netty进行消息的收发,了解过Netty的小伙伴,或者学习过《RPC手撸专栏》 (opens new window)的小伙伴,应该都比较清楚,基于Netty开发应用程序时,会有通用的代码设计模板。那我们如何将这些通用的代码设计落地到即时通讯后端服务,并且要同时支持TCP和WebSocket两种长连接方式呢?

这里,我们先来看一张图,如图1-1所示。


可以看到,对于即时通讯后端服务来说,最终依赖的还是服务的接口,并非具体的实现类。一个服务接口可提供多个实现类,具体根据配置项决定启用哪个实现类,也可以同时支持多个实现类。

在具体代码设计上,对于服务接口来说,我们可以提供一个启动服务的方法和一个停止服务的方法,并且可以提供一个服务是否准备就绪的方法,基于TCP的实现类和基于WebSocket的实现类都会实现这个服务接口,如图1-2所示。

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章、小册、视频与完整代码