背景
方案要点
页面首屏有效绘制(FMP)时间变短:从webview发出页面url请求,到用户看到首屏有效内容的时间真实变短。
应用稳定性高,运维成本低:保证由Node应用提供前端页面,尽可能跟已经非常成熟的「CDN缓存前端静态资源 + Java服务提供首屏数据」有相近的稳定性。并且Node服务一旦出现不可用的情况,页面能够自动降级到稳定的CSR(当下H5页面都在用的客户端渲染)模式,而不需要工程师手动执行降级。
低研发成本:采用SSR以后,前端工程师仍然只需要关心业务功能的实现,而无需为满足稳定性要求增加额外开发成本。
技术架构

SSR链路
基于serverless的node应用
为了实现SSR功能我们需要在Node层实现两个服务:
数据聚合。一个前端页面首屏需要的数据,可能来自于多个服务端(Java)的接口。我们在Node层实现一个Service,该Service调用首屏依赖的所有服务端接口,将其汇聚为一个接口,输出全部首屏数据。这种由Node层实现数据胶水的设计,同时可以降低前端与服务端开发协作的成本。前端只需要得到服务端原子功能级别的数据,便可以根据UI的需要按照自己方便的方式定义最终输出的数据结构。
直出HTML页面(HTTP服务)。当用户访问某个URL时,Node应用获取页面构建产物,同时调用上条提到的首屏数据接口,将返回的数据用于生成页面的DOM树。
SSR应用网关
原因是每一个对用户开放的HTTP服务,都必须接入集团的「统一接入」机制。统一接入承载了转发、负载均衡、安全认证等多种必不可少的功能。接入的整个流程,包括应用架构的评审、域名的配置、其他安全机制的确认等等需要1~2个工作日。而由于我们不断会有新的业务、新的项目,为每一个新应用都走一遍统一接入是要消耗大量人力成本且没有必要的。因而我们在所有Node应用之上,架设网关应用,利用Nginx根据访问path的不同,将用户的请求分发到不同的应用上。网关本身作为CDN回源的源站。
CDN边缘节点
除了资源加速之外,阿里云的CDN节点还提供了基于Serverless的边缘计算能力,简单来说,就是除了缓存静态文件,CDN还可以作为JavaScript脚本的运行环境。这让Node服务的稳定性还没有达到业务的要求时,前端工程师可以通过在CDN节点上部署JavaScript代码,让CDN节点完成一定的功能。CDN边缘程序、边缘缓存和源站的链路如下图。

自此,我们就解释了开始时3个问题的前2个:怎么保障Node应用稳定性,以及怎么进行页面降级。
CSR链路
静态资源文件需要构建并推送到air。
需要有在Web端可以被调用的Ajax接口(在阿里一般被称为mtop接口)。

实现SSR链路和CSR链路之后,我们已经满足了3个关键要素中的前2个:
FMP时间缩短:
SSR链路中,用户访问到首屏有效内容的时间为:

应用之间的研发、发布及运行的隔离,使得每个研发同学不需要担心自己应用的稳定性会受其他应用的影响;CDN对请求的缓存,使得即使缓存时间只有1分钟,Node应用也只在每60s才被CDN回源一次,大大降低了流量高峰时对Node服务稳定性的考验;以及CDN边缘程序的自动降级逻辑,使得SSR链路失败时,应用自动降级为CSR模式,不影响用户对页面的访问,不需要研发同学手动运维。
应用结构

后续
PICK ME
闲鱼是阿里巴巴旗下品牌,是中国最大的闲置交易平台,于2014年成立至今,使用闲鱼的用户规模已超过2亿,其中90后超过一半;闲鱼是继淘宝、天猫之后,阿里巴巴正在催生的第三个万亿级平台。
闲鱼技术部不断在驱动业务变革,通过创新追寻更多价值。从闲置生意的老本行,到打造“无忧购”“会玩社区““新线下”,从出版书籍、峰会发声,到开源专利、海外传播。闲不住,上闲鱼——技术团队对极致的探索与深耕是我们的底气。
立即加入
1、招项目经理/客户端/服务端/前端/数据+算法/质量工程师
2、发简历给guicai.gxy@alibaba-inc.com
3、您还可以在头条、知乎、掘金、facebook、twitter找到我们