我眼中的前后端分离

本贴最后更新于 2613 天前,其中的信息可能已经天翻地覆

在我映像中,2014 年淘宝系大肆宣传他们的前后端分离架构,AngularJS 那时也发展得如火如荼。基于这一春风,业界也全方位兴起了前后端分离的热潮。但和 微服务 一样,一个名词出来了,各种各样的解读也出来了,似乎也没有人能够很清楚地说明白,前后端分离究竟如何分离。

当时我在 ZTO,大家对这个概念的理解也多种多样。那时我们各种内部系统间通过 API 调用已经是很普遍的事情,甚至已经有了开放平台的雏形,我们内部也在制定各种 API 的内部标准。而各个系统可以通过 调用API、组装数据,渲染视图 成为一套独立的系统供用户使用。那么这算不算前后端分离?当时我负责的官网产品线就很典型:

front-backend-slice-2018316183027

根据当时我们的业务场景,官网是需要有 SEO 的,我们内部有一个约定:内部业务 API 是不做授权鉴权的,需要暴露到外网的 API 才需要做鉴权。在这样的环境下,我们的方案自然就是 Web 服务调用后端 API,将数据在 Server 端处理好,并渲染好页面进行返回。

在这样的模式下,其实是将大量可复用逻辑进行了接口化开发,也可以认为是 SOA 的架构模式,这样的架构模式下门面层负责的就是 API 调用和数据组装,视图渲染。大量的业务逻辑依旧由后端程序员完成。我认为这也算一种前后端分离,至少它将视图渲染模块和数据提供模块进行了解耦。曾经一个单号跟踪查询需要写 200 多行查询语句到程序里还要到处维护的日子我再也不想体会了。

后来一些人认为,前后端分离一定要将前后端的工作分开。前端开发人员直接开发 UI,后端仅仅需要提供 Rest API 就好了。对于这种思想,我认为从分工的角度是非常合理的。毕竟分工细化是工程化的进步。这样的架构如下:

front-backend-slice-2018316221540

这种架构模式 Application Server 以及以上部分由后端程序员负责,前端程序员负责浏览器部分。感谢这些年丰富的前端框架,将页面构造工作量降低了不知多少个数量级,将视图引擎这一重要组件交由前端。后端工程师终于有了机会将视图渲染工作统统甩锅。另一方面,专业的事情交给专业的人来做,前端工程师当然会开发出更适合前端使用的工具,适合前端应用的语言。例如 PUG(jade),less,stylus 这样的语言确确实实让我感受到了 UI 开发的便利。这种开发模式下,最具革命性的地方在于工作完全解耦,不同的工程师可以各司其职。犹记当年我的前端搭档需要到我的 cshtml 文件里修改东西,还要安装一个 Visual Studio ,简直不要太悲伤。在功能开发方面,同样带来了很多便利,一些 UI 状态维护(例如当前所在菜单高亮)这种事情,从前的后端渲染时处理起来也尤为恶心,你需要关注一些和你业务逻辑并不相关的状态,这种悲催的体验随着前端完全掌控视图渲染几乎消亡。

话又说回来,其实这样的开发方式并不能算是多大的创新。在前后端分离轰轰烈烈开展之前,我想很多道友应该也用过例如 Jquery UI,ExtJs,YUI 之类的框架了吧。在很多后台管理型站点中,这样的技术已经非常普遍了。而那个年代,node.js 还没有兴起,各大厂商还在为步子太大扯到蛋的 ES5 争吵不休,bable 还没有影子,前端还没有成一个普遍认同的工种,我们还在为 IE6 而苦恼。在那个条件下,兼容性、性能、流量等等因素制约着前端的领土,一直到了移动互联的时代到来,UI 交互日益复杂,工具链逐渐成熟后,前端的美好时代终于到来。

这种开发模式也不是没有问题,首先,这种协作方式预设了一个前提:前后端开发人员是分离的。这是理想很丰满现实很骨感的典型事例啊!目前能配备一个项目至少一个专职前端的公司估计少得可怜吧,全栈工程师的概念对于一个花钱养人的 BOSS 来说应该具有无比的诱惑吧。而前后端分离也同样早就了前后端工具链的分离。原本一个 IDE,一个端口就能完成的工作现在变成了两个 IDE,两个端口;还引入了跨域问题。你说有 IDE 插件可以启动 WebPackDevServer 可以解决跨域问题。但过去根本没有这些问题的呀!

另一方面,前后端分离后部署问题也让我哭笑不得。一些人认为:应该使用 Nginx 跑代理来将前后端代理到一个域下来处理跨域问题。我个人是不太喜欢这种方案的,明明分离的优势就在于解耦,之前跨过了千辛万苦都解耦了,最后一公里又要耦合在一起?还引入了 Nginx 黑魔法在中间? 另一些人认为:可以将后台部署为 CORS 接口;这群人往往更激进,都用 CORS 了,还要中间那个 Application Server 作甚?直接捞数据 API 不就好了嘛?你看 PGSQL 都直接提供 Rest 功能了诶。但是这样的架构会不会新增运维负担?上线时还要关注请求发起方的域名,会不会引起一些额外的攻击?如果调用了不同的 API 授权鉴权怎么做?

同时,这样的前后端分离也带来了一些广泛而难以解决问题:首页面白屏时间长的问题怎么办?最要命的还在于 SEO 这一死穴让纯粹的前后端分离变得困难重重。

随着 Node.js 的发展,前端工程师也一定不会满足于浏览器这一亩三分地,在一些规模较大的组织内,一定会存在海量可复用的业务逻辑 API。那既然前后端协作还有那么多麻烦,而且搜索引擎那么排斥 ajax ,我们不如干脆把后端也做了吧。随着各大框架推出了自己的 SSR 方案,前端工程师们吹响了进军后端的号角。现在的架构变成了这样:

front-backend-slice-201831623121

历史总是螺旋上升的,是不是似乎又看到了最初的架构,现在渲染工作由服务器和浏览器共同承担,当遇到了搜索引擎爬虫和浏览器初次访问时,服务器承担了渲染工作,其他时候由浏览器承担渲染工作。

目前,前后端分离的开发模式已经深入人心,但是它也依旧存在着这样那样的问题,需要开发人员权衡取舍的问题还很多。但我们可以看到,整个社区是活跃的。前后端都在互相争夺着地盘。例如微服务体系下网关的功能也越来越强大,通过简单的配置就可以实现协议转换,数据编排等功能。道友们还是得根据自身实际情况选择技术,仔细思考原理切勿跟风盲从偏听偏信,更勿裹足不前。毕竟 前端代代框架出,各领风骚几个月 前方的沙滩和后方的后浪课都在迫不及待等着你。这是我对前后端分离的一些思考和吐槽,如果能给您带来一些想法,荣幸之至。

我的微信公众号,欢迎关注
我的微信公众号

  • 后端
    44 引用 • 126 回帖 • 1 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    143 引用 • 442 回帖 • 1 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    246 引用 • 1338 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • OpenCV
    15 引用 • 36 回帖 • 7 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 9 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    557 引用 • 675 回帖 • 1 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 3 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    495 引用 • 931 回帖
  • 叶归
    8 引用 • 36 回帖 • 17 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    174 引用 • 538 回帖
  • Access
    1 引用 • 3 回帖 • 2 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 758 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 504 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 400 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 688 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    24 引用 • 241 回帖
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    133 引用 • 1124 回帖 • 107 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 10 关注
  • AWS
    11 引用 • 28 回帖 • 7 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    168 引用 • 597 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    345 引用 • 747 回帖
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 336 关注
  • sts
    2 引用 • 2 回帖 • 230 关注
  • Follow
    4 引用 • 12 回帖 • 12 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 613 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 34 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 544 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 29 关注