前后端分离框架思想
为什么要写这篇文章?
因为目前国内几乎搜索不到全面讲解如何搭建前后端分离框架的文章,讲前后端分离框架思想的就更少了,而笔者希望在本文中能够全面、详细地阐述我们团队在前后端分离的摸索中所得到的搭建思路、最佳实践以及架构思想;
在进入正题之前我们有必要先了解一下 Web的研发模式演变,关于这个题材,下面这篇博文说得不错,这边就不做搬运工了。
https://github.com/lifesinger/blog/issues/184
整体上概述现在的前端已经不是以前的切图仔了,已经进化成了数据处理员。
后端也只专注于数据的提供。
具体是怎样实现前后端分离?大方向就是以Rset+Json为架构风格
要实现这种分离,我认为有以下四大原则:
前端静态化
前端有且仅有静态内容,再明确些,只有HTML/CSS/JS. 其内容来自于完全静态的资源而不需要任何后台技术进行动态化组装.前端内容的运行环境和引擎完全基于浏览器本身.
后端数据化
后端可以用任何语言,技术和平台实现,但它们必须遵循一个原则:只提供数据,不提供任何和界面表现有关的内容.换言之,他们提供的数据可以用于任何其他客户端(如本地化程序,移动端程序).
平台无关化
前端3大技术本身就是平台无关的,而后台连接部分的本质是实现合适的RESTful接口和交互Json数据,就这2者而言,任何技术和平台都可以实现.
构架分离化
前端架构完全基于HTML/CSS的发展和JS框架的演变,与我们耳熟能详的后台语言(如C#, Java, NodeJs等)完全无关. 由于前台是纯静态内容,大型构架方面可以考虑向CDN方向发展.
后端构架几乎可以基于任何语言和平台的任何解决方案,大型构架方面, RESTful Api可以考虑负载均衡;而数据,业务实现等可以考虑数据库优化和分布式,更加符合无状态、微服务的要求。
总而言之,前后端的分离也实现了前后端构架的分离.
具体思路为:
313471-20180426220437096-2022037496.jpg后端专注于:后端控制层(Restful API) & 服务层 & 数据访问层;
前端专注于:前端控制层(Nodejs) & 视图层
本人认为的前后端分离模式应该是这样,当然这不一定正确:
1、项目设计阶段,前后端架构负责人将项目整体进行分析,讨论并确定API风格、职责分配、开发协助模式,确定人员配备;设计确定后,前后端人员共同制定开发接口。
2、项目开发阶段,前后端分离是各自分工,协同敏捷开发,后端提供Restful API,并给出详细文档说明,前端人员进行页面渲染前台的任务是发送API请(GET,PUT,POST,DELETE等)获取数据(json,xml)后渲染页面。
3、项目测试阶段,API完成之前,前端人员会使用mock server进行模拟测试,后端人员采用junit进行API单元测试,不用互相等待;API完成之后,前后端再对接测试一下就可以了,当然并不是所有的接口都可以提前定义,有一些是在开发过程中进行调整的。
4、项目部署阶段,利用nginx 做反向代理,即Go + nodejs + nginx 方式进行。
什么是 API
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数或者接口,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无须访问源码,或理解内部工作机制的细节。
要实现一个 API 服务器,首先要考虑两个方面:API 风格和媒体类型。Go 语言中常用的 API 风格是 RPC 和 REST,常用的媒体类型是 JSON、XML 和 Protobuf。在 Go API 开发中常用的组合是 gRPC + Protobuf 和 REST + JSON。
REST 简介
REST 代表表现层状态转移(REpresentational State Transfer),由 Roy Fielding 在他的 论文 中提出。REST 是一种软件架构风格,不是技术框架,REST 有一系列规范,满足这些规范的 API 均可称为 RESTful API。REST 规范中有如下几个核心:
REST 中一切实体都被抽象成资源,每个资源有一个唯一的标识 —— URI,所有的行为都应该是在资源上的 CRUD 操作
使用标准的方法来更改资源的状态,常见的操作有:资源的增删改查操作
无状态:这里的无状态是指每个 RESTful API 请求都包含了所有足够完成本次操作的信息,服务器端无须保持 Session
无状态对于服务端的弹性扩容是很重要的。
REST 风格虽然适用于很多传输协议,但在实际开发中,REST 由于天生和 HTTP 协议相辅相成,因此 HTTP 协议已经成了实现 RESTful API 事实上的标准。在 HTTP 协议中通过 POST、DELETE、PUT、GET 方法来对应 REST 资源的增、删、改、查操作,具体的对应关系如下:
HTTP 方法 行为 URI 示例说明
GET 获取资源列表 /users 获取用户列表
GET 获取一个具体的资源 /users/admin 获取 admin 用户的详细信息
POST 创建一个新的资源 /users 创建一个新用户
PUT 以整体的方式更新一个资源 /users/1 更新 id 为 1 的用户
DELETE 删除服务器上的一个资源 /users/1 删除 id 为 1 的用户
前后端分离最困难、最关键的环节——API文档服务器
这也是我们在开发时遇到的最大的问题
1、API文档服务器是什么?
请先看下图。
313471-20180426220437096-2022037496.jpg
正如上图所示,前后端开发人员可以独立开发、独立运行、独立调试,他们之间的接口就是通过API文档服务器定义的。通常,一个页面的加载或者表单的提交,都有数据在客户端和服务器端之间传输,而API文档服务器就是专门用来生成API文档的。有了API文档,前端开发人员就可以基于API文档产生模拟数据(mock),然后使用mock的数据完成页面样式和页面交互;有了API文档,后端开发人员就可以基于API文档完成请求的处理以及返回响应数据。
而API文档服务器(通常为WEB服务器)是一个可以动态生成最新版本API文档的服务器,并支持本地维护+远程访问。
2、为什么API文档服务器是最困难、最关键的环节?
为什么本文会专门写这样一个章节来表述API文档服务器的重要性呢?因为笔者认为,很多团队在前后端分离的探索中举步维艰,可能最重要的原因就是对API文档的搭建方案重视不够(因为现成的方案俯拾皆是,如word文档做API载体)。因此,笔者希望大家看清楚前后端分离过程中最重要的一个环节,不是原型,不是设计,不是开发,也不是测试,而是API文档的编写/维护/发布/阅读。
然后让我们来回想一下软件开发流程中的几个关键环节:
(1)产品经理提需求,画原型;
(2)UI设计师根据原型出设计图;
(3)测试团队根据产品原型编写测试用例,制定测试计划;
(4)架构师根据原型编写API文档;
(5)前后端工程师基于API文档完成业务开发;
(6)测试、改BUG、发布。
在上面这个流程中,API文档环节直接关系到了前端和后端两个开发团队,也是整个软件开发流程中耗时最大的环节。一旦API文档编写不合理,或者维护太麻烦,或者阅读不方便,将极大的影响开发效率,影响团队士气。而其他环节通常不会跨部门耦合,常用解决方案非常成熟,并且所消耗的资源也远不及开发团队,因此,API文档环节就变成了前后端分离团队中最关键的环节。
如果你曾经参与过前后端分离团队的开发工作,那你很可能对上文描述的场景深有体会。
不过现在对于这个问题的解决方案大致是Swagger配合Json Server或者同类产品。
结语
这就是我理解的前后端分离的架构,还有在实践时的难点。