前端中间件实践和代码部署
2015年12月8日

本文写于 2015 年,讨论的是当时团队用 Tornado + Docker 做中间件与部署的实践;如今 Node.js 异步模型与部署方式已有很大变化。
说到前端中间件,大多数人想到的估计会是 Node.js,但通常一个页面的数据是由多个接口提供,如果使用 Node.js 难免会陷入 callback hell 的局面。而解决 callback hell 的方案无非是 ES6 中的 Promise、Generator 和 ES7 提出的 async 特性,但 Promise、Generator 的解决方案并不太优雅,对于我们这种技术能力有些薄弱的技术团队,在后期的维护和拓展上有一些难度;对于 async,当时也还没有哪一个版本的 Node.js 稳定支持。
Python
最后决定使用 Python 来实现中间件,配合 Tornado 异步 web 框架,在性能上应该不会和 Node 有太大的差别,毕竟 Python 同步的写法更让人理解。Python 3.5.1 加入了 async 语法糖,更好的支持了协程,Tornado 最新版本也马上支持了 async。Tornado 的 Non-blocking HTTP server 和 Asynchronous HTTP client 也有巨大的优势,能爽快的这样写代码了:
class Index(tornado.web.RequestHandler):
async def get(self):
http_client = AsyncHTTPClient()
response = await http_client.fetch('/api/index')
data = json.loads(response.body.decode('utf8'))
self.render('index.html', **data)Docker
公司的测试和生产环境上部署的是 CentOS,通过手动编译 Python 3.5.1 总是会安装上一个缺少类库依赖的版本,在网上找了一圈也没找到可直接安装的编译版本,CentOS 还真是一个稳(luo)定(hou)的发行版本,所以寻思着是否能通过 Docker 运行一个 Debian 的实例来解决。因为之前没有接触到 Docker,一直认为运行 Docker 就是运行一个虚拟主机,然后在虚拟机里面安装这种依赖,然后运行应用程序。
但渐渐发现 Docker 更像是一种服务:在 Docker 中安装好各种依赖和环境,然后把项目文件挂载进 Docker,最后执行应用启动命令,Docker 会一直保持这条命令,直到错误退出,所以这更像是一个服务。同时你能把执行各种应用程序的 Docker 镜像分享出去,当然你也可直接下载社区共享的各种应用程序的 Docker 镜像,挂载自己项目的目录,然后直接运行。
总结
现在的前端开发不再是几年前写写页面、写写脚本这么简单了,有让你眼花缭乱的前端框架供你选择;重要的是要了解各种框架的利弊、适用场景,根据自己的项目类型和团队技术水平,选择最合适的框架,选择项目的构建工具,甚至要了解和搭建项目运行环境,编写测试和发布脚本。