单机软件和SaaS的反向对接

看标题可能比较懵逼,这篇文章到底要说什么。那么我介绍一下项目背景。

项目背景

目前在做的产品是一款SaaS产品,年初的时候因为产品方向变化,需要和公司其他产品进行数据对接,需要对接的产品为公司的PC版产品(这里统一简称H)。

按照正常设想的数据对接方式,为了实现数据的对接,作为SaaS模式产品,我们需要提供Open API供H使用,由H产品发起数据相关的请求。但公司战略上不允许H产品进行这方面的改动,并且通过沟通也不允许H产品提供Open API。那么这次数据的对接只能完全由我们项目组自己负责处理。

对接方案

在团队讨论对接方案的时候,讨论出了两种方案:

中间件对接

在PC端安装一个中间件程序,负责向SaaS服务提供数据接口。客户在安装完中间件后,需要将中间件地址(使用内网穿透工具)和SaaS产品的账号绑定,以便我们能找到对应的地址。

在中间件的设计上我们设想了两种,重中间件和轻中间件。重中间件即中间件直接提供业务接口,并需要判断H产品的版本(H产品活跃的版本非常之多,客户没有升级习惯),保证业务接口能被正常调用。轻中间件则提供数据查询接口,业务处理由服务器端进行,中间件相当于远程的SqlHelper,参数传递为了方便简单处理,都统一为字典。

重中间件模式首先Pass掉了,因为采用重中间件模式,后期迭代新功能的时候,中间件也需要升级。H产品的客户升级欲望低,再加上前期产品迭代较快,会导致升级平凡,体验不好。所以我们选择了轻中间件模式。但在第一版研发中,还是发现一些问题,并且不能很好的适配云部署的H产品(即将多个客户使用的H产品部署到一台阿阿里云服务器上),所以我们在后续版本使用了数据库直连方式,并使用至今。

数据库直连

通过将H产品的数据库直接映射到外网,然后在SaaS产品的Web端和账号进行绑定。这样我们就能访问到客户的H产品数据库,并获取数据。

这种方式在研发效率上非常高,并且将业务逻辑放在SaaS服务器,避免了产品升级而导致需要升级中间件等问题。但同时也会面临安全问题,大部分客户的数据库密码为弱密码,甚至为空,所以在映射的时候,通常会修改数据库端口号,并修改数据库密码为强密码。

该方式虽然不用安装中间件,但也需要用花生壳等内网穿透软件将数据库映射到外网。H产品大部分客户使用的数据库为SQL Server 2000精简版,无法通过网络访问。就算是完整版的SQL Server 2000也需要安装SP4补丁才行。整个操作流程还是相当复杂,而且内网穿透软件也是需要付费的,免费版本不稳定。对客户来说使用成本又增加了,那么有没有一种方案能不使用内网穿透软件呢?

基于中间件的免内网穿透模式

这个思路基于轻中间件模式,在此基础上让中间件启动之后即和SaaS服务保持长连接,这样服务器端就可以随时向中间件请求数据,并且不用使用内网穿透工具,极大降低了安装操作难度。本质上是需要实现一个双工的RPC。目前成熟的RPC框架还是挺多的,比如Facebook的Thrift,Google的gRPC,网上也有不少基于它们的双向通信方案值得借鉴。大致思路如下图:
对接免内网穿透模式
同时需要对业务服务和Socket服务进行一个拆分,保证他们职责的清晰。Socket服务和中间价本身应是业务无关的,应该保持SqlHelper的角色。

avatar

Code4Cocoa

A ThoughWorker