50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

从前后端分离看阿里 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:195986

评论 4 条评论

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

从上海到阿根廷的网络走线方式和耗时

fliter

四步搞定国赛!快速入门大小模型融合的AI产品开发

飞桨PaddlePaddle

百度 产品开发 大模型 飞桨国赛 飞桨星河社区

测试管理|名企测试管理大咖解析沟通管理,多维度经验分享

霍格沃兹测试开发学社

ScaleFlux与UCloud携手,助力高性能文件存储,实现低成本和高性能的完美平衡

ScaleFlux

高性能 数据压缩 企业存储

API安全概览

FunTester

Wireshark的捕获接口设置

小齐写代码

京东零售实践干货|简单一招竟把nginx服务器性能提升50倍

京东零售技术

nginx 后端

深入了解低代码开发:多角度分类

天津汇柏科技有限公司

低代码 低代码开发 低代码开发平台 定制软件开发 软件开发定制

给你一颗“定心丸”——记一次由线上事故引发的Log4j2日志异步打印优化分析

京东科技开发者

面试官:说一下零拷贝技术的实现原理?

王磊

java面试

软件测试|京东科技控股股份有限公司岗位开放~

霍格沃兹测试开发学社

简单一招竟把nginx服务器性能提升50倍

京东科技开发者

Python笔记四之协程

Hunter熊

Python 协程

跨境通讯

cts喜友科技

通信 通讯

【分布式技术专题】「探索高性能远程通信」基于Netty的分布式通信框架实现(附通信协议和代码)(上)

码界西柚

分布式 Netty RPC 网络通讯 2024年第二十五篇文章

名企测试管理大咖解析沟通管理,多维度经验分享

测试人

软件测试

iOS应用崩溃了,如何通过崩溃手机连接电脑查找日志方法

名企测试管理大咖解析沟通管理,多维度经验分享

测吧(北京)科技有限公司

测试

教你一键搭建本地服务器,轻松4人以上联机畅玩幻兽帕鲁

华为云开发者联盟

云计算 服务器 华为云 华为云开发者联盟

测试管理 | 京东科技控股股份有限公司岗位开放~

测吧(北京)科技有限公司

测试

Tonka Finance 测试网活动,开启新铭文时代财富之门

股市老人

产品价值 vs Bug数量

Bruce Talk

敏捷 敏捷开发 Agile Product Owner

极狐GitLab 16.8 如期而至,快来看看有哪些功能更新!

极狐GitLab

如何在JavaScript中实现主题切换

南城FE

CSS JavaScript 前端 主题切换

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