前后端分离实践

在2016年10月21日的 T-Friday 技术小聚 做了关于前后端分离的演讲。T-Friday 是 T社 组织的一系列互联网技术、产品、设计为主题的小型线下交流活动。以下为演讲的 keynote。

背景

传统网站的架构是后端负责页面的渲染,一般需要后端工程师写好接口和模板,前端工程师写页面样式,最后后端工程师再填充页面数据。

那么问题就来了,在开发的过程中前端工程师和后端工程师需要非常多的沟通,两个组之间无法同时独立的工作。另外,因为页面需要后端和前端一起参开发,变得难以维护。

实践

一种解决方案是做单页应用(SPA),把页面的渲染、路由完全交给前端来处理,后端只提供初始的页面骨架和数据。这样后端可以专注于业务逻辑,前端对页面有完全的掌控。

但是问题又来了,SPA 的话需要前端处理很多业务层的数据,增大了复杂度。另外一个大问题是 SEO,因为 SPA 的页面完全由前端 JavaScript 渲染,无法有效地被搜索引擎抓取。

那么有没有更好的架构呢?我们先来看一下2009年出现的一门新技术:Nodejs。它利用了谷歌的 V8 JavaScript 引擎,使得在服务器端运行 JavaScript 成为可能。

随着 Nodejs 的发展和用户终端的丰富和升级,前端圈在最近几年兴起了一场工程化的运动。很多优秀的框架、解决方案被创造出来,极大地提高了 JavaScript 作为一门编程语言的能力。比如模块化、自动化构建、组件化等,都有了不错的工具支撑。

回到前后端分离,由于前端工程化的发展,一个全新的架构被搭建出来:一些机智的前端工程师发现,使用 Nodejs 搭建一个中间层,负责和后端的数据交流以及前端的页面渲染,可以有效实现前后端的解耦。前端可以专注于页面的实现、交互和性能,而后端可以专注于业务逻辑的计算,只需提供对应的 API。另外,由于 Nodejs 中间层是跑在服务器上进行页面渲染,SEO 的问题也得到解决。

长远来看,基于 Nodejs 中间层的架构将是下图的形态:后端是一个个独立的、只提供接口的微服务(可以由不同语言编写),前端是包括了 Web、iOS、Android 的”大前端“。可以看出,Nodejs 中间层和 Web 前端页面整体可以类比一个传统的客户端 APP。

那么问题又来了,前后端分离是否是一个过度开发的产物呢?我们觉得不是,因为前后端分离之后可以极大的提高开发效率,前后端团队在确定了 API 之后可以同步独立开发。前端不用再配后端的环境,后端也不用再配前端的环境。另外,因为中间层的引入增加的网络延迟也可以通过中间层的架构来解决。举个例子,以前可能一个页面逻辑需要多个请求 Ajax,而现在可以由中间层统一请求后端,最后聚合成一个接口提供给前端页面。

小结

当然,没有一种技术架构是万金油,抛开场景空谈技术实现都是空洞的。比如对于3~5人的小型创业团队,可能全员一起做全栈开发可以帮助项目快速的迭代和验证模式(这也是T社最初的开发方式)。而随着团队的扩张,必要的责任拆分就会越来越重要。

最后和大家分享一下我很喜欢的康威定律。

注:keynote中图片部分来源于网络