Better

Ethan的博客,欢迎访问交流

谈谈前后端分离

不知是前端技术的发展推动了前后端的分离,还是前后端分离的需求推动了前端技术的发展,但这都不重要,重要的是如今前端越来越工程化,扮演着越来越重要的作用,前后端分离也是大势所趋。

发展

在前后端分离之前,我们采用的是一体化设计,什么是一体化设计呢?什么是前后端分离呢?

一体化设计,个人觉得可以直接理解为服务端渲染,后端选择模版,得到数据后,有后端动态生成HTML,前端只要负责渲染HTML展示即可。

随着前端的发展,越来越多的原本由后台处理的逻辑,转移到了前端,比如模版,动态生成HTML,与后台的交互更多的变成通过接口进行,而且后台只负责提供数据。

为什么

为什么需要前后端分离呢?

首先前端无需关心后端技术选型,采用一体化设计,比如ASP.NET WebPage写的页面,用Java的化,必须用JSP在写一次。

方案根本要解决的问题是把数据和页面剥离开来。应对这种需求的技术是现成的,前端采用静态网页相关的技术,通过 AJAX 技术调用后端提供的业务接口。前后端协商好接口方式通过 HTTP 提供,接口数据结构使用 XML/JSON 实现。

这种架构从本质上来说就是 SOA(面向服务的架构)。当后端不提供页面,只是纯粹的通过 Web API 来提供数据和业务交互能力之后,Web 前端就成了纯粹的客户端角色。以前的一体化架构需要定制页面来实现 Web 应用,同时又定义一套 WebService/WSDL 来对 WinForm 和移动终端提供服务。转换为新的架构之后,可以统一使用 Web API 形式为所有类型的前端提供服务。

由于分离,Web 前端在开发的时候压根不需要了解后端是用的什么技术,只需要后端提供了什么样的接口可以用来做什么事情就好。前后端分离之后,两端的开发人员都轻松不少,由于技术和业务都更专注,开发效率也提高了。分离带来的好处渐渐体现出来

  • 前端实现与后端技术无关性,数据和页面剥离开来
  • 前后职责分离
  • 前后技术分离
  • 前后分离带来了用户用户体验和业务处理解耦
  • 前后分离,可以分别归约两端的设计
    • 实现 SOA 架构的 API 可以服务于各种前端,而不仅仅是 Web 前端,可以做到一套服务,各端使用
    • 对于前端来说,不依赖后端技术的前端部分可以独立部署,也可以应于 Hybrid 架构,嵌入各种“壳”(比如 Electron、Codorva 等),迅速实现多终端。

挑战

任何技术方案都不是银弹,前后分离不仅带来好处,也带来矛盾。

后端思维和前端思维还是有所不同——前端思维倾向于用户体验,而后端思维则更倾向于业务的技术实现。这样前后端的沟通就会有一定的矛盾。

还有就是前后端分离之后,安全性策略不同。在一体化设计中,我们通常采用 Cookie/Session 认证,在SOA架构中,Cookie/Session 的方式虽然可用,但并不是特别合适,相对来说,基于 Token 的认证则更适合一些。采用基于 Token 的认证就意味着后端的认证部分需要重写。

接口设计

接口分后端服务实现和前端调用两个部分,技术都是成熟技术,并不难,接口设计才是难点。前后端高效协作,最重要的还是接口设计的规范性了。

就形式上来说,Web API 可以定义成 REST,也可以是 RPC,只要前后端商议确定下来就行。更重要的是在输入参数和输出结果上,最好一开始就有相对固定的定义。

通常一个完整的响应至少需要包含状态码、消息、数据三个部分的内容,其中

  • 状态码,HTTP 状态码或响应数据中特定的状态属性
  • 消息,通常是放在响应内容中,作为数据的一部分
  • 数据,根据接口协议,可能是各种格式,当前最流行的是 JSON

如果使用 RESTful 风格的接口,部分状态码可以用 HTTP 状态码代替,比如 401 表示需要登录,403 就可以表示没有获得授权,500 表示程序处理过程中发生错误。当然,虽然 HTTP 状态码与 RESTful 风格更配,但是非 RESTful 风格也可以使用 HTTP 状态码来代替 error.code。

用户认证

认证方案很多,比如 Cookie/Session 在某些环境下仍然可行、也可以使用基于 Token 和 OAuth 或者 JWT,甚至是自己实现基于 Token 的认证方式。

  • 基于 Cookie/Session 的认证方案
    • 同源的话,依旧可以使用
  • 基于 OAuth 的认证方案
  • 基于 Token/JWT 的认证方案

前后分离的测试

前后分离之后,前端的测试将以用户体验测试和集成测试为主,而后端则主要是进行单元测试和 Web API 接口测试。与一体化的 Web 应用相比,多了一层接口测试,这一层测试可以完全自动化,一旦完成测试开发,就能在很大程度上控制住业务处理和数据错误。这样一来,集成测试的工作量会相对单一也容易得多。

前端测试的工作相对来说减轻不了多少,前后分离之后的前端部分承担了原来的集成测试工作。但是在假设 Web API 正确的情况下进行集成测试,工作量是可以减轻不少的,用例可以只关注前端体验性的问题,比如呈现是否正确,跳转是否正确,用户的操作步骤是否符合要求以及提示信息是否准确等等。

不管是否前后端分离,Web 开发中都有一个共识:永远不要相信前端!

来源



留言