消息通知

竟然还有让没有后台的网站正常运行的要求

背景

前几天被派去处响应客户提出的需求。

客户需求

之前公司给客户开发部署了一套Web应用,是Vue+Node.js的架构。

现在客户要求把这个Web应用放到一台笔记本里,要求web应用的网页要能正常显示。

小编快速思考了一下,在笔记本上搭建好Vue和Node.js的环境,将前端、后端源代码copy到笔记本上跑起来,把数据库一迁移不就完事了嘛,小意思。

然而还是太年轻,把问题想得太理想。

沟通后才发现这个系统的后台开发数据库是分布式数据库,由几十台服务器组成,这...这还怎么玩啊!

首先,要把这个分布式数据库塞到笔记本里显然不现实,同时了解到Web应用中的一些统计功能需要进行全表查询计算,即使我能把数据库塞进笔记本,几个TB的数据库表我也塞不进去啊!其次客户不允许把全量数据库数据导出到笔记本,简直要哭了!

解决方案

这种情况,看来数据库是不用想了,小编赶紧思考别的解决方案,要不然Leader所谓的小问题都解决不了,岂不是太(fan)给(wan)公(bu)司(bao)丢脸了。小编想起Leader意味深长的笑,心里早已MMP了。

既然数据库不能迁移到笔记本,那前端所需要的数据该怎么获取呢?

我们先来回顾web的整个交互流程。下图是目前客户整个web应用示意图:

简单来说,一个动态网页的获取分以下几步:

拉取静态页面

当用户在浏览器输入URL回车后,通过Http的Get请求向Http服务器请求拉取静态html页面以及相关的CSS、JS等资源文件

浏览器解析阶段

浏览器解析html页面,并执行相应的JS代码,JS代码中会包含相应的异步数据请求。

异步数据请求

浏览器通过异步数据请求向Node服务器请求数据

后端服务器响应

Node服务器根据的请求,执行相应功能的代码,例如,如果是拉取商品列表的数据请求,Node服务器会向数据库查询商品列表信息,将组织好的数据包装成Json等格式作为请求的响应返回给浏览器

异步刷新页面

浏览器端JS代码通过异步请求拿到异步请求返回的数据,继续执行相关的数据组织处理的JS代码,最终将数据异步更新到网页上。

网站后台程序开发

结束

至此,一个简单的浏览器请求背后的流程到此结束,用户通过输入URL看到了想要看到的网页的内容。

经过对背后流程的梳理,小编已经明确问题出在数据库上,并且既然数据库不能访问,相应的,后端Node服务器的存在也没有什么意义了。

事实上,对于前后台分离的架构,若要保证网页的正常访问,只要能保证前端向后台发起的数据请求,能够返回一致的数据即可。

意思是,只要能够保证前端请求,有正常的响应(数据)即可,不管是Node服务器对请求进行响应,还是谁提供的响应。

把后端想象成一个服务提供者,只要能提供服务,任何的解决方案都是可行的。

于是小编脑中浮现了一个方案:

将现有系统中每个后台请求的返回的结果数据都先保存成本地文件,同时重新开发后台服务响应接口,对于指定的请求返回之前相同接口请求保存的本地文件数据,整个架构变成下图的样子:

这样既达到了能够返回实际的数据,同时前端也没有任何感知和影响。

实际上这样还是不能完全解决问题。例如,如果有一下需要修改、写入数据库的操作,这种方式就没有效了。

毕竟我们只是伪装能一个能够正常响应查询的假后端,并没有实际的数据库。

不过好在客户说只要满足首页和几个查询按钮的正常展示即可。

接下来的主要工作就是梳理现有接口,把实际数据请求接口返回的数据都保存下来,并且记录它们之间的对应关系。然后就是重新开发后端服务,将前端过来的请求,返回之前保存的对应的文件中的数据即可。

举个例子,之前某个前端请求对应的后端处理代码可能是这样的:

string get_goods_list(request)

{

  //获取request中请求参数

  ...

  //查询数据库

  ...

  //组织数据格式并返回

  return json_respone;

}

而重新开发的后端处理代码就变成这样了:

string get_goods_list(request)

{

  //读取保存到本地的数据请求返回的数据

  ...

  //直接将数据返回给前端

  return json_respone;

}

特别的简单粗暴,但是确实有效,当然事情也不可能如此顺利,由于这个系统当时的研发人员已经离职,小编只能靠留存的简单项目部署说明,外加一点点摸索,在解决无数次error后,客户终于在一台笔记本上看到了预期的页面效果。

直到临走时小编也没想明白,既然只是要求几个按钮的功能能正常展示页面,为何不截个图或者录个视频放到笔记本里?不过小编还是忍住了没问,因为问了又能如何?

后记

这次事件小编明白了两个道理:一是客户的需求真的可以天马行空,二是解决问题的能力是建立在对原理和现状有清晰的基础上的,只有掌握技术背后的原理,才能在应用技术时游刃有余,有能力应对各种需求解决各种问题,当然这也是一名程序员应该具备的素质。

看来指望客户不提“无理”需求是不可能了,能够做到就是提高自身能力水平