从0到1快速了解netty长连接网关协议

IM(即时通讯系统)作为一项基本能力,在各个公司的产品中都处于一个举足轻重的地位。作为IM能力的最重要提供方,长连接网关的设计至关重要。本文以比心聊天室解决方案开源项目SONA为例,解析netty长连接网关在协议层的设计,帮助读者快速了解长连接协议。本文最后附上开源项目地址。


一、长连接网关是什么?

sona-gateway 是比心自研的长连接网关,基于 Netty 开发,同时支持 TCP 和 Websocket,承载了比心几乎所有的业务,提供超高的性能,易扩展,普通的4核8G机器,就能稳定支撑几十万连接。

如果不需要整套 SONA 服务,也可以简单修改其中的房间相关业务代码后,单独剥离出来作为网关使用,即使从来没用过 Netty,对Netty一点都不了解,也能非常方便的扩展自己的业务。使用者不用关心如何实现一个私有协议的细节,直接使用我们内置的通信协议。可以非常简单的启动客户端与服务端,同时注册自定义的请求处理器,即可完成双端通信。同时,像连接管理、心跳等基础功能特性都默认可以使用。

网关中最核心的基础通信、消息协议、请求处理器等设计都是通用的:

1. 基础通信功能

  • 基于 Netty 高效的网络 IO 与线程模型运用
  • 连接管理 
  • 基础通信模型
  • 超时控制
  • 心跳与空闲事件处理

2. 协议框架

  • 命令与命令处理器
  • 编解码处理器
  • 心跳触发器

3. 私有协议定制实现

  • 二进制通信协议的设计
  • 灵活的消息压缩、合并控制
  • 请求处理超时FailFast机制
  • 用户请求处理器
  • 双工通信

二、通信协议

消息传输采用定制的二进制协议,基于 request-response 模式设计

1、协议介绍

从0到1快速了解netty长连接网关协议_第1张图片

key 字节数 说明
req/res 1 1表示request , 0表示response
twoWay 1 是否需要回复response ,1 需要, 0 不需要
heartbeat 1 是否心跳 ,1是 , 0 不是
version 1 版本号
id varint 请求或响应的id(从1开始递增,单连接不重复),如果是request请求并且twoWay是false ,设置 0
cmd 1 command 命令,每个command都有对应的请求处理器
length varint 所有 header + body 的大小
headerSize 1 header 的个数
headerType 1 header 的类型
headerLength varint header data 的大小
headerData headerLength header 的数据内容
body length - 所有header的大小 消息体

 如果是心跳,只有 req/res,twoWay,heartbeat,version,id

采用 Request-Response 模型,主动发起请求的为 request,request 有2中模式:

  • 一种是 oneway,request发出去之后,不关心结果,不做超时控制,不需要对端返回 response
  • 一种是 twoway,request发出去之后,需要在指定的超时时间内,等到对端返回response。如果超时时间内没有得到结果,那么会抛出超时异常

客户端和服务端都可以主动发起 request 

为了防止业务处理耗时过久,每个request都会设置超时检测,超时之后会立即 failfast,返回超时失败

2、Header 扩展

目前开源版本提供了 3种 header,可以自由扩展

headerType description
1 开启body压缩 (body 超过 2048 字节进行压缩, Deflater 算法)
2 房间header ,每个房间相关的command请求都会带上
3 开启批量合并,body中包含多条消息,需要额外解析

可以自行扩展 Header ,在 cn.bixin.sona.gateway.common.HeaderEnum 中添加自定义的Header,并在相应的业务逻辑中使用即可

3、CMD 扩展

cmd description
-1 服务端告知客户端断开连接
1 客户端连接登录认证
2 客户端主动上报消息
10 加入房间
11 离开房间
12 发送房间消息
13 发送房间指令
14 发送群组消息

可以自行扩展 CMD ,在 cn.bixin.sona.gateway.common.CommandEnum 中添加自定义的 command,并新增对应的请求处理器

  1. 在 /META-INF/mercury/cn.bixin.sona.gateway.handler.Handler 文件中添加cmd 和处理器 的映射, key是 cmd (多个可用逗号隔开),value是 处理器的bean name
  2. 新增自定义请求处理器,只需 extends AbstractHandler,并实现相应的业务逻辑处理即可

  默认提供的3个Handler 处理器

1=loginAuth
2=clientPush
10,11,12=chatRoom


总结

本文仅仅简单介绍了SONA中的长连接网关,在后续的系列文章中会对网关中的技术细节进行详细的介绍。

目前sona已经在比心的github仓库上开源,仓库地址:

https://github.com/BixinTech/sona

欢迎你访问我们的项目,有任何想交流的想法可以留言联系我们。

你可能感兴趣的:(SONA聊天室,后端,java,websocket,实时音视频,tcp)