方案根本要解决的问题是把数据和页面剥离开来。应对这种需求的技术是现成的,前端采用静态网页相关的技术,HTML + CSS + JavaScript,经过 AJAX 技术调用后端提供的业务接口。先后端协商好接口方式经过 HTTP 提供,统一使用 POST 谓词。接口数据结构使用 XML 实现,前端 jQuery 解析 XML 很方便,后端对 XML 的处理工具就更多了……后来因为后端 JSON库(好比 Newtonsoft JSON.NET、jackson、Gson 等)崛起,前端处理 JSON 也更容易(JSON.parse() 和 JSON.stringify()),就将数据结构换成了 JSON 实现。api
这种架构从本质上来讲就是 SOA(面向服务的架构)。当后端不提供页面,只是纯粹的经过 Web API 来提供数据和业务交互能力以后,Web 前端就成了纯粹的客户端角色,与 WinForm、移动终端应用属于一样的角色,能够把它们合在一块儿,统称为前端。之前的一体化架构须要定制页面来实现 Web 应用,同时又定义一套 WebService/WSDL 来对 WinForm 和移动终端提供服务。转换为新的架构以后,能够统一使用 Web API 形式为全部类型的前端提供服务。至于某些类型的前端对这个 Web API 进行的 RPC 封装,那又是另一回事了。安全
经过这样的架构改造,先后端实际就已经分离开了。抛开其它类型的前端不提,这里只讨论 Web 前端和后端。因为分离,Web 前端在开发的时候压根不须要了解后端是用的什么技术,只须要后端提供了什么样的接口能够用来作什么事情就好,什么 C#/ASP.NET、Java/JEE、数据库……这些技术能够通通不去了解。然后端的 .NET 团队和 Java 团队也脱离了逻辑无关的美学思惟,不须要面对美工精细的界面设计约束,也不须要在思考逻辑实现的同时还要去考虑页面上怎么布局的问题,只须要处理本身擅长的逻辑和数据就好。前端框架
前端倾向于呈现,着重处理用户体验相关的问题;后端则倾处于业务逻辑、数据处理和持久化等。在设计清晰的状况下,后端只须要以数据为中心对业务处理算法负责,并按约定为前端提供 API 接口;而前端使用这些接口对用户体验负责。
2. 先后技术分离
前端能够不用了解后端技术,也不关心后端具体用什么技术来实现,只须要会 HTML/CSS/JavaScript 就能入手;然后端只须要关心后端开发技术,除了省去学习前端技术的麻烦,连 Web 框架的学习研究都只须要关注 Web API 就好,而不用去关注基于页面视图的 MVC 技术(并非说不须要 MVC,Web API 的接口部分的数据结构呈现也是 View),不用考虑特别复杂的数据组织和呈现。
后端只提供 API 服务,不考虑页面呈现的问题。实现 SOA 架构的 API 能够服务于各类前端,而不只仅是 Web 前端,能够作到一套服务,各端使用;同时对于前端来讲,不依赖后端技术的前端部分能够独立部署,也能够应于 Hybrid 架构,嵌入各类“壳”(好比 Electron、Codorva 等),迅速实现多终端。
采用传统的 Cookie/Session 认证方案并不是不可行,只不过有一些限制。若是前端部分和后端部分同源,好比页面发布在 http://domain.name/,而 Web API 发布在 http://domain.name/api/,这种状况下,原来的一体式 Web 方案所采用的 Cookie/Session 方案能够直接迁移过来,毫无压力。可是若是前面发布和 API 发布不一样源,这种方法处理起来就复杂了。
先后分离以后,前端的测试将以用户体验测试和集成测试为主,然后端则主要是进行单元测试和 Web API 接口测试。与一体化的 Web 应用相比,多了一层接口测试,这一层测试能够彻底自动化,一旦完成测试开发,就能在很大程度上控制住业务处理和数据错误。这样一来,集成测试的工做量会相对单一也容易得多。
前端测试的工做相对来讲减轻不了多少,先后分离以后的前端部分承担了原来的集成测试工做。可是在假设 Web API 正确的状况下进行集成测试,工做量是能够减轻很多的,用例能够只关注前端体验性的问题,好比呈现是否正确,跳转是否正确,用户的操做步骤是否符合要求以及提示信息是否准确等等。
对于用户输入有效性验证这部分工做在项目时间紧迫的状况下甚至均可以彻底抛给 Web API 去处理。无论是否先后端分离,Web 开发中都有一个共识:永远不要相信前端!既而后端必须保证数据的安全性和有效性,那么前端省略这一步骤并不会对后端形成什么实质性的威胁,最多只是用户体验差一点。可是,若是先后端都要作数据有效性验证,那必定要严格按照文档来进行,否则很容易出现先后端数据验证不一致的状况(这不是先后分离的问题,一体化架构一样存在这个问题)。
小结
总的来讲,先后分离所带来的好处仍是很明显的。可是具体实施的时候须要一个全新的思考方式,而不是基于原有一体化 Web 开发方式来进行思考。先后分离的开放方式将开发人员从复杂的技术组合中解放出来,你们均可以更专一于本身擅长的领域来进行开发,但同时也对先后端团队的沟通交流提出了更高的要求,先后端团队必需要一同设计出相对稳定的 Web API 接口(这部分工做其实无论是否先后端分离都是少不了的,只是先后分离的架构对此要求更高,更明确地要求接口不仅存在于人的记忆中,更要文档化、持久化)。