在某个风和日丽的早上,老大找到了正在写脚本的小伟。
老大:小伟,我们云主机服务要上线了,你写一个网页管理系统给我,下个月上线哈。
小伟:...好的!
拿到了需求后,只会写python的小伟找到了一个合用的web框架tornado,大笔一挥画下了架构图。

用nginx做反向代理处理请求,tornado处理数据生成页面,这样只要在tornado里写好数据处理和模板就行了,只要会学点html就可以了,妙啊。小伟这么想着,开始了紧赶慢赶的开发。一周后就提交了测试Demo。
老大:为什么每提交一个申请就要刷新一下页面,用户体验也忒差了吧。
老大:页面能不能做好看一点啊?
老大:用户怎么能直接操作sql,太不安全了。
小伟:我这就去改!
小伟先问了下自己写web的同学,知道了有ajax这样的使用js去请求&刷新页面的操作。于是花了一天看了看jquery使用指南,将tornado的响应分为了页面和接口。再找到网上最多人用的bootstrap主题,引入后让页面好看了许多。然后又学习了《如何防sql注入》,花了两天手写了一份orm。一番操作之后,小伟心满意足地画下了架构图v2.0:

一个月后,云服务项目准时上线,好评一片。

老大:上次系统做得不错,那边又提过来管理后台的需求,大概有七八个模块,你跟小红分工一下,尽快上线哈。
小伟:...好的!
小伟想,这个框架我比较熟,让小红去写上手比较快的模板,我来做数据处理,应该能够加快工期吧。于是小伟将需求划分为模板和数据处理,开始开发。然而事情并不能像想象一样一帆风顺。
三天后......
小红:小伟,开发环境弄好了没?
小伟:没呢,我还在搭,过几天哈
五天后......
小伟:数据调对了,但前端样式好像不太对啊
小红:噢我的代码还没提交,稍等
七天后......
小红:小伟,这个数据是不是返回错了
小伟:没有啊,在我这里是对的啊,你过来我这里调试吧
十天后......
小伟:小红,这里需求有点变更,我返回的数据会从数组变成不定维数组哦
小红:......
十五天后......终于出了测试Demo
老大:这个页面有问题。
小伟:看看是不是前端的参数传错了。
小红:肯定是接口写错了。
老大:......
在延迟了三次工期,经历了无数次的争吵之后,集成各种基础功能的管理后台总算上线了。

过了一年,小伟已经将这一套开发模式烂熟于心了。又是一个风和日丽的早上,老大又找到了小伟。
老大:小伟啊,管理后台已经堆了100个bug了,你什么时候处理一下?
小伟:好,我找个时间跟小红一起看看,就是时间太久了不知道环境能不能跑起来。
老大:麻烦的话就算了,那边说这个系统已经不满足业务了,想要做一个新的后台管理系统。
小伟:那有什么要求呢?
老大:首先是加载速度快一点,现在后台响应速度太慢,多几个人一起访问就会瘫痪;其次是页面做的好看一点,要对外的;还有工期抓紧点,这次把小王,小李,小红都派给你。
小伟:......好的。
读完需求的小伟发现这次的模块复杂度比上次高了不止一个层级,一想到之后四个人为了页面和接口吵得不可开交的场面,痛定思痛,决心要抛弃之前的模式,重新寻找解决方案。于是找到了最近流行的概念 前后端分离 。前端只负责浏览器端,后端只负责服务器端,页面在浏览器中渲染。
通读了google前三页的前后端分离相关资料之后,小伟觉得这种前后端解耦就是解决web开发的银弹,既能将前后端完全分离,又能提升性能,还可以降低之后维护的成本,只需要将之前的框架做一些小小的调整。满心欢喜的小伟画下了架构图v3.0:

用户请求到nginx,经由不同路由转发,数据请求则转发到tornado处理,html、css、js等静态文件在dist目录存放。在前端工程化的熏陶下,小伟看了下三大框架angular/react/vue,又研究了webpack/gulp/fis,探究了javascript的超集TypeScript,对比了N个前端最佳实践,最终选定了dva作为前端的脚手架。(注:dva是一个开源的脚手架,整合了redux、react-router、redux-saga等工具,在重前端的复杂项目中可以很好地管理数据流)
小红:那前端是不是还要等后端接口才能开发呀?
小伟:不需要,可以用mockjs,直接模拟后端返回的数据
小李:后端需要做什么呢?
小伟:只要开发数据处理接口就可以啦
由于分工明确,两个月后,新管理系统已经完成了前后端联调测试,成功上线。

拓展阅读
老大:很多网站都支持移动端了,什么时候我们也支持一下?
小伟:可以啊,我们只需要适配一份前端就行,后端接口可以复用。
老大:现在浏览器渲染有点慢,而且也不支持SEO怎么办?
小伟:我最近看了个用node server作为中间层的做法,将前端部署在nodejs里,可以在服务器端渲染,支持SEO,也可以在前端处理更为复杂的逻辑。
老大:那页面加载还有没有优化的空间?
小伟:除了代码层的优化,我们还有上CDN,做负载均衡等等各种手段......
小伟附上架构图v4.0:

后记
本文并不是一篇技术类的文章,只是从我们团队技术演变以及业务变更的角度,做了一些记录。 前后端分离的确能够解决很多开发中的痛点,比如职责不清,前端无法处理复杂逻辑,业务组件无法复用,但是也不能够盲目推崇前后端分离的做法。毕竟技术没有最好的,只有最合适的。
近期文章
END
全中国只有不到1% 的人关注了运维军团
你是个有眼光的人!
(由于交流群人数已超100人,需要进群的小伙伴可以添加运维小编的微信:)

如果你喜欢我们的文章,请转发到朋友圈










