跨平台基础网络框架Mars初探

王春蕾

前言

对于新派单通知、订单时效变更通知等需要及时反馈给用户的消息,目前点我达骑手的解决方案是定时轮询并通过http请求的方式主动从服务器获取变更,这种方式存在一定的缺陷,如http方式轮询流量消耗较高、消息通知不及时等。随着订单量和活跃用户量的急剧增加,这种轮询方式的弊端也逐渐显现出来,需要一种能够及时发送消息且流量消耗较低、弱网环境表现优异的方案替代现有轮询方案,那就是Socket长连接的方式。

Android客户端实现Socket长连接的框架有大名鼎鼎的Netty和Mina,也有微信团队开源的跨平台基础网络框架Mars,也就是本文要介绍的网络框架。

Mars是什么?

Mars是微信官方推出的C++编写的跨平台、跨业务的终端基础组件,可以直接在Android、iOS、Mac等平台使用。框架包含Common、STN、SDT、XLog等模块,下图为Mars官方提供的架构图:

各模块的主要功能如下:

1.Common:Mars框架最底层部分,为STN、XLOG、SDT模块提供组件支持,主要包括socket、线程、消息队列、协程等基础工具。

2.STN:信令分发网络模块,也是 Mars 最主要的部分,可以认为是Mars框架中的网络框架组件,是跨平台的 socket 层解决方案,主要负责终端与服务器的小数据信令通道。包含了微信终端在移动网络上的大量优化经验与成果,经历了微信海量用户的考验。

3.SDT:网络诊断模块,可以通过ping、dns、tcp等方式检测网络状况,并能够进行流量的统计。

4.XLOG:高性能运行期日志组件,可以通过穿越门获取更多关于Xlog的信息。

框架介绍向来都是高端大气的,在使用过程中是否真的能够做到高可用,高性能,负载均衡?Mars的五年的发展史和微信官方使用意味着这会是不错的移动APP Socket解决方案,在github上开源后已经有近万的star和近两千的fork,微信团队也曾公开表示会持续对Mars维护。

Mars怎么用?

Mars于2016年12月28日被微信团队开源,github地址是https://github.com/Tencent/mars ,所以可以根据需求对源码进行改造来满足项目使用要求。
以github提供的demo为例,简要阐述下环境搭建的步骤。

1.下载源码

从Mars代码仓库中pull出代码后,代码的组织结构是这样的: 其中mars部分为框架的C++源码部分,Mars中的SDT、STN、XLOG等模块的源码都在这里,如有必要,可以对源码进行改造。

samples为在Mac、Android、iOS等平台集成的demo工程,Server为简易搭建的服务器端代码工程,我们将使用Server+android两个工程构建简易的demo环境并进行Socket通讯。

2.Server环境搭建

将目录切换到/mars-master/samples/Server后会有一个start-server.py python脚本,使用python start_server.py执行该脚本并选择对应的编译平台,编译完成后,在mac电脑上出现如下两个弹窗:

至此,Server端的工程已经运行完毕,在Client端只需要将连接的服务器地址配置成自己server的IP即可。

3.Client环境搭建(以Android为例)

android工程的sample代码在/mars-master/samples/android目录下,将该目录的代码导入到AndroidStudio后,全局搜索marsopen.cn字符串替换成步骤2中运行的Server的IP地址后即可运行。以mac操作系统为例,在终端输入ifconfig即可查看到当前电脑的IP地址,截图如下:
运行成功后,Sample的界面是这样子的: 需要注意的是,页面中的STN Discuss、Xlog Discuss、SDT Discuss并非是针对STN、Xlog、SDT这三个模块的功能定制,这些文案都是从server中获取后填充到RecyclerView中去的,只是为了区分会话的唯一性,在同一个服务器IP地址的同一个模块下才能进行IM通讯。

4.简易版IM软件

其实Mars Sample就是一个简单的IM软件,点击页面的STN Discuss、Xlog Discuss、SDT Discuss中的任意一个即可进入聊天页面。聊天页面打开后,首先会弹窗创建一个昵称(不创建也是可以的),点击确定后开始跟在同一个Server的其他用户聊天。

网络框架对比

Mars是一款基于TCP协议的Socket网络框架,Mars与Android/iOS平台中常用的网络框架的对比清下如下:
Mars目前是不支持完整的Http请求方式的,不过微信官方已表示将集成Http请求方式作为Mars后续开源的重要完善部分。因为Mars是微信团队使用的基础网络框架,对于“移动互联网”中网络状态不稳定等特点做了大量的优化工作,并且这些优化经过微信超大用户量的长期验证和使用的。

Mars生态

由于开源时间(2016年底)较晚等原因,Mars生态不够完善,通过搜索引擎搜索到的关于Mars框架的内容也相对较少。但为了表示微信官方对这一跨平台、跨业务的socket解决方案的重视,github仓库中的wiki含有大量微信官方撰写的Blog,不仅包含各平台集成开发文档,还包含一些Mars框架在微信团队在5年的迭代过程中的演进和优化,如Mars智能心跳方案的深入介绍、应对弱网络状况的解决方案、信令传输超时方案优化等。这些Blog对于Mars扫盲和框架集成是没有太大的问题,但独木难成林,未来的Mars生态必然依赖越来越多的框架使用者在使用过程中的经验累计和推广,相信在微信官方的重视和广大使用者的共同努力下,Mars必定会成为跨平台Socket解决方案的不二选择!