【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

从前后端分离看阿里 Web 应用架构演变

  • 2018-11-29
  • 本文字数:3193 字

    阅读完需:约 10 分钟

从前后端分离看阿里Web应用架构演变

前后端分离为什么出现?本质上是什么?前后端分离运动对 web 应用的架构带来了怎么样的变化?前后端分离怎么分离?为什么是 Node.js?前后端分离的未来怎样?


阿里前端技术专家剪巽 老师在今年 7 月 ArchSummit 大会深圳站上探讨了这个话题。


前后端分离走过了一段历程,最根本的原因是传统的后段服务支撑不了现代化的前端开发。平时工作中用到的工具链、开发框架、规范协议、浏览器等在不断涌现,这些新的技术在给开发环境、开发流程提了更多新需求。Node.js 在这个背景下能够把这些工具串联起来。以前 Java 的同学在开发、调试的时候要泡一杯咖啡,非常耗时。

前后端分离的 3 个阶段

1.模板层的分工


最早的 Java 开发阶段需要一个包含所有内容的 war 包,整个前端的编排,像 HTML 页面、CSS、JS 很多时候包含在 HTML 页面,也会出现脚本复用、样式复用抽离出来。所以前端开发当时是围绕著名的 velocity 模版。这一层最大的问题是,后端的同学看前端资源像看天书,前端同学看后端模版也像是看天书,融合效率非常低。


2.静态资源独立部署



Web 2.0 之后,大量的前端资源需求出现,Web 前端体验最大的改进就是副客户端,客户端资源非常庞大,代码不再是直接发布到线上,而是要编译,做预处理,可能还要做 CDN 的加速。整个应用被分割成两部分,后端服务发布之后,前端服务要独立更新,这样就给应用的更新带来了便利。这里存在一个问题是接口的协调,前端的需求变更,数据的要求也会变化,需要后端去协调资源的编排。另外一个问题是测试,前端持有脚本,样式资源,而模版却在应用层,应用层的开发、发布也是很复杂的。


3.独立应用层



这一层的变化在于,Node.js 可以提供工具能力之外,还具备很强的服务能力,从 mock 数据开始,到前端代码的预编译,资源编排,这些动作都合并到一个应用里面,前端形成 UI 应用层。后端相关的接口回退到 API,或者云端。在这一层,前端具备了更灵活、强大的能力,在数据编排这一层,Node.js 可以做轻量的粘合,服务端的开发也在往微服务方向发展,提升了开发效率。

为什么是 Node.js

在语言特性方面,Node.js 无需切换,整个开发、工具、日常工作中 Node.js 一种语言就可以满足所有需求。此外 Node.js 还有优异的性能,一直在迭代。


其次是在社区生态上,在语言模块包上的贡献数据,NPM 库的数据量很高。Node.js 能从服务端框架去链接服务,整合成前端所需数据资源。


另外在生产周边,Node.js 的语言成熟度很有优势,社区里关于泄漏、性能调优的工具也有很多研究,对前端开发更友好。


产品中的实践:


通常大数据服务里,需要解决计算和存储能力。业务曾有很多的需求,从数据接入,到离线处理,到实时分析,所以它的特点是有很多的依赖,而前端无法做到相应每一个需求,大量需要 mock。


另外就是业务的需求很多,在流程控制、数据转换、数据安全、分析展现等方面需要有大量的组件沉淀。最大的特点是有众多独立的功能模块。


而要想让这些模块和功能实现有什么解法呢?就需要这三个方法:制定框架,微应用分割,运维工程化。


1.定制应用框架就是来解决前端的编译,工程管理,数据 mock 等问题。



面向应用的时候,更多的是在第二层和第三层做定制化封装,把业务插件都封装起来。应用层在运行过程中,前端会托管所有权限相关的事情,包括登录系统,中间件等等。此外还会连接很多服务和驱动,把前端框架集成起来,这是一个完整的开发环境。


2.把各自独立的模块应用切割成微应用,一个微应用解决一个问题,便于分工和隔离处理。



具体做法是微服务拆分,搭建微应用服务,承载大量的小服务,同时也会出现很多域名的问题,很多访问入口。这里做了一些小创新,在入口可以定义端口,sever name,访问 path,当把一个场景分成 10 个应用发布,发布之后再根据不同的路径拼接成一个应用,对体验没有影响。


除了路由自动化规划之后,对应用的发布做到上下平滑,不会影响流量。前端人员自己打包发布就可以了。


3.当这些应用被分割的很细致之后,随之而来的是如何管理这些小应用。



比如有两台机器做互备,把所有小 App 都发布到上面之后,由一个个小颗粒组成一个大应用,看上去很像一个蜂巢,因此命名 honeycomb,这些蜂巢组成一个大蜂窝,完成一个主功能。在应用推进过程中,有些应用压力大,需要把应用集群隔离开,把有不同业务需求场景环境,例如开发环境、预发环境、线上环境隔离开来,不同环境配置的集群资源和机器数量都不一样。随着业务发展,隔离的事情会教给容器去执行。

分层设计解决 Node.js 密集计算问题

社区里有一个讨论,Node.js 是否适合密集计算?密集计算分成两层,绿色部分会接收用户请求,第二层浅蓝色会处理用户请求,写很多的 processor,提供大量的进程去提供密集计算。主要问题在于 CPU 容量是恒定的,当有很多并发请求的时候,如何保证在服务层去很好的分配计算任务。拆成两层之后,保证用户请求不会被 block 掉。如果第一层大量的密集计算,会导致用户的请求或者连接的需求被挡住,接收不到响应,所以要往后堆,做成队列,可扩容的大集群。整个结果在 Java 里就可以理解为 Java 庞大线程的处理过程。



社区里在线程库里还有一些尝试,Napa.js 是微软开源的线程库,前端同构的需求可以探索使用 Napa.js 这个工具。

DataV 场景使用案例

DataV 是一个可视化产品,类似于 PPT,有编辑器,最主要的功能是把各种组件挂到浏览器屏幕上,组件和组件之间形成事件绑定,事件驱动组件去调用数据服务,数据从计算层返回。



它的特点之一是,数据请求量非常多,请求排队之后,要把数据合并起来,在服务器端请求太多数据源会出现慢的情况,导致请求驻留在服务器端,内存的波动会很严重。这里的解决方案是先到先返回。另外一个是在提供组件自定义开发功能的时候会遇到代码转换的需求,我们是在线帮助用户转代码,这里存在很多动态编译的过程,以及数据处理。

Node.js 应用层带来的便捷

Node.js 在这个场景下是有很多优势的,例如在 server 层可以更便捷的去完成这些开发以及支持,Babeljs 可以做代码转换的事情,Bigpipe 可以优化服务端的内存,可以缩减渲染时间,提升体验优化。在前面的数据流里有很多的 filter,给数据链中插入 processor,来定义处理微小的数据。用户在原始的数据到完整的可视化展现不需要再搭建一个产品去支持,只需要搭几个 filter,配几个数据源,拖几个组件就可以完成。Node.js 在这一层提供了很多便捷之处,例如创新实现。


所以,Node.js 在微应用体系里有很多优势,开发、测试、运维可维护性上有独立性。Node.js 给前端带来创新的便利性也体现在另外一点,那就是在云端的一些服务上,前端有能力在 service 集成、改变使用流程做很多事情。

前端接下来的变化

HTTP2/WebSocket 在网络层会在更多的场景里带来不同的体验。


还有前后端同构、WebGL、WebWorker、工具链的继续进化,前端的工具、资源编排、框架等都在快速变化。


而服务端趋势:云化(更细粒度的虚拟化)、服务化(API、可编程)、智能化(数据智能普及)、编排(微服务、微应用运维便捷),也给前端带来更多的机遇。


前端的边界会在这些变化中被拓宽,新一轮的创新会在这其中迸发。

作者简介

目前在阿里云飞天一部从事数据产品的研发工作,关注数据领域(数据连接、分析、可视化等)。过去的几年都在和数据分析类产品打交道,经历了几代数据产品的演变和架构变迁(淘宝数据平台的数据魔方、面向精准营销的全景洞察、面向数据分析的 DataV)。


更多内容可关注前端之巅公众号(ID:frontshow)


活动推荐

12 月 7 日北京 ArchSummit 全球架构师峰会上,来自美团、百度、阿里、快手的讲师齐聚一堂,共同分享“打造 Native 体验 Hybrid App 实践”、“定制统一可维护的前端架构”、“10 年双十一前端关键技术”和“同构 Web App 的另一种探索”的分享。


会议开幕倒数第 8 天,购票联系票务灰灰 17326843116


详情请戳:https://bj2018.archsummit.com/schedule?utm_source=WeChatfrontend&utm_medium=suningnode


2018-11-29 14:195484

评论 4 条评论

发布
用户头像
这文章真跳跃~~建议把每一部分的参考文献发出来
2018-12-21 15:19
回复
用户头像
技术发展真快
2018-12-11 09:44
回复
用户头像
副客户端, 是富客户端,字写错了。
2018-11-30 19:06
回复
没有更多了
发现更多内容

如何让全彩LED显示屏更加节能环保

Dylan

LED LED显示屏

小红书自研KV存储架构如何实现万亿量级存储与跨云多活

小红书技术REDtech

存储 分布式KV 跨云多活

OpenFeign

急需上岸的小谢

7月月更

ORACLE进阶(三)数据字典详解

No Silver Bullet

oracle 7月月更 数据字典

Lepton 无损压缩原理及性能分析

vivo互联网技术

对象存储 无损压缩 lepton 图片压缩

第五届 Polkadot Hackathon 创业大赛全程回顾,获胜项目揭秘!

One Block Community

区块链 科技

如何将 DevSecOps 引入企业?

SEAL安全

DevOps DevSecOps DevSecOps和敏捷

Node の MongoDB Driver

空城机

mongodb Node 7月月更

微信小程序触底加载与下拉刷新的实现

猪痞恶霸

小程序 前端 7月月更

非技术部门,如何参与 DevOps?

SoFlu软件机器人

基于昇腾AI丨爱笔智能推出银行网点数字化解决方案,实现从总部到网点的信息数字化全覆盖

科技热闻

Web3基金会「Grant计划」赋能开发者,盘点四大成功项目

One Block Community

区块链+

谈谈对Flink框架中容错机制及状态的一致性的理解

百思不得小赵

flink 容错机制 状态 7月月更

容易混淆的基本概念 成员变量 局部变量 全局变量

NewBoy

前端 移动端 iOS 知识体系 7月月更

CSS动画篇之炫酷时钟之时钟墙

南城FE

CSS 前端 动画 时钟 7月月更

SAP UI5 ObjectPageLayout 控件使用方法分享

Jerry Wang

前端开发 Fiori SAP UI5 ui5 7月月更

RingCentral Android启动优化实践

RingCentral铃盛

android 启动流程

【LeetCode】判断矩阵是否是一个 X 矩阵Java题解

Albert

LeetCode 7月月更

LeetCode-145. 二叉树的后序遍历(java)

bug菌

Leet Code 7月月更

Qt实现json解析

小肉球

7月月更

基于昇腾AI丨高新兴推出城市道路车辆二次识别解决方案,达到业界领先水平

科技热闻

基于STM32+华为云IOT设计的智能防盗单车锁

DS小龙哥

7月月更

蚁群算法(实例帮助理解)

秃头小苏

蚁群算法 7月月更

5G NR系统架构

柒号华仔

5G 网络 7月月更

不要再说微服务可以解决一切问题了!

博文视点Broadview

购买小间距LED显示屏的三个建议

Dylan

LED显示屏

LLVM之父Chris Lattner:为什么我们要重建AI基础设施软件

OneFlow

人工智能 软件系统

Vue.js基础环境的搭建以及简单使用Element-ui

是乃德也是Ned

7月月更

SpringBoot Webflux解析

Ethan

基于昇腾AI丨以萨技术推出视频图像全目标结构化解决方案,达到业界领先水平

科技热闻

基于OpenHarmony的智能金属探测器

OpenHarmony开发者

OpenHarmony

从前后端分离看阿里Web应用架构演变_大前端_剪巽_InfoQ精选文章