分享人|王庆,阿里云云原生前端负责人
直播地址:0 基础晋级 Serverless 高手课 — Serverless 架构在软件研发工程实践方面的价值
本篇文章将通过五个部分为大家介绍Serverless架构在软件工程的研发实践和JAMStack的原理。
- 现代化web站点构建方式JAMStack介绍
- 阿里云JAMStack解决方案
- JAMStack服务化实现介绍
- 部署工具介绍
- 其他Serverless工程实践
一、现代化web站点构建方式JAMStack介绍
在介绍JAMStack原理之前,首先介绍下什么是JAMStack。
JAMStack是当下前端推崇的一种新的站点开发理念,它将内容进行预渲染,然后把静态的部分交给CDN进行加速来实现更好的访问体验;然后再把动态的API用背后的Serverless技术来实现整个站点的动态能力,这样开发的站点在用户体验上就会有很大的改进。
JAMStack由三个主要的概念构成,即Javascript、API和Markup。
- Javascript是主流的web开发的语言,能够做数据的交互,也能增强站点动态能力;
- API提供站点数据的动态能力,是由传统Server提供,也可以使用Serverless提供API的能力,实现降低成本和应对大规模流量以及容灾的诉求;
- Markup是标记类型语言,HTML,Markdown这类也是标记型语言的一种。这是JAMStack实现静态化预渲染的基础。
JAMStack具有五大优势,它们是:
- 更好的性能,即将预渲染的静态内容交给CDN,极大提升用户访问你的站点效率;
- 更安全性,当站点静态化,被攻击的面就比较少了,动态API本身的Serverless服务运行也有很高的安全保障;
- 更便宜,静态资源本身的托管费用比较低,基于Serverless的API服务弹性调用花费也比较低;
- 更容易扩展,动态API部分跟静态资源解耦,动态API扩展起来更加便捷;
- 更好的开发体验,松散的耦合方式可以让开发者专注在某个部分,比如前端页面或是后端接口,基于Git的工作流也能大幅减少集成部署时间。
JAMStack基本实现原理
由下图可见,传统的web一般通过客户端访问你它背后的数据库或是内容系统,这里会有几个链路。通过客户端访问web server, 然后web server再去发起请求调用背后的应用服务,应用服务也可以被拆分成各种微服务,也都是通过这种间接的方式调取的。应用服务也会在背后直接操作数据库和内容管理系统。JAMStack其实是简化了这个架构。
整个策略就是把静态的部分都交给CDN,因为静态的部分是提前做了渲染的,然后CDN帮助加速,意思是用户可以第一时间就看到这个站点的效果。动态的部分再做处理,通过其他方式扩展到站点上。总而言之,JAMStack实际上减少了动态的访问路径,可以通过提升站点的访问呢性能,并实现更好的安全保障。
二、阿里云JAMStack解决方案
在JAMStack服务化实现之前,这里先介绍一下,基于阿里云提供的服务完成的JAMStack解决方案。介绍这些解决方案的好处是老师可以介绍给学生,让学生了解了之后增加动手的能力。
目前,用阿里云的一些产品来做JAMStack框架,可以通过下图来了解一下。途中一共包含了几个产品,比如CDN,OSS和FC函数计算产品。这些产品中,CDN是主角,它一方面处理对静态资源的缓存和全球网络加速,另外还具备写脚本的能力,提供一些边缘脚本,可以利用这个能力做一些网关处理。
举个例子,当用户通过浏览器发起一个域名访问,这个域名会首先经过CDN,然后CDN本身是有一套默认配置的,这套配置提供了边缘配置,可以把它理解成是一个钩子的流程,用友前后关系。经过这些配置之后,会自动分析动态请求,比如build部分,就先去缓存中看有没有,如果没有再去OSS里查看,OSS这边也会给一个回源,表示这边是更新的,可以先把它缓存下来然后再把内容返回去。也就是直接把静态的部分呈现给用户了。而动态的部分,需要经过边缘脚本,通过它判断这是一个动态的API,然后再根据传的路由转发到背后的API服务,比如说这里依赖了一个函数计算的服务,函数计算返回一个域名,那么转发到函数计算上,然后再把他返回到页面上做渲染。经过这样的处理可以看到整个JAMStack的动静态分离的能力。好处也很明显,用户不需要再去搭建各种CDN、OSS或是函数计算的服务了,基于现有一些服务已经可以构建高性能站点服务了。
三、JAMStack服务化实现介绍
JAMStack服务化实现与阿里云已有的能力差距还是很大的。因为需要考虑当很多用户上来用的时候,怎么去做多租以及怎么去应对整个大规模的资源请求。
首先介绍下已经提供的JAMStack所包含的能力,如下:
域名托管+自定义域名,可以提供resume.net.cn一级域名,用户根据自己需求填写二级域名,比如Zhangsan.resume.net.cn即可使用。另外也支持自定义域名。
- 重定向处理,这个功能主要解决的是静态化文件重定向的问题;比如一个旧站点因为某种原因需要把它的某个配置文件重新命名,但是旧站点已经有人在访问了,这个时候就可以利用重定向处理能力,把旧的直接签到新的名字上,实现无缝升级。
- KvStore,通过存储静态资源,并且将资源更新,跟站点部署解耦,实现动态化能力。
- 动静态分流,这是JAMStack比较核心的能力。通过自定义网关把静态资源和动态资源的请求做分流,静态的到CDN上,动态的到API上。
- 多站点管理,意思是一个用户目前最多可以创建32个站点。
JAMStack服务整体架构图
如下JAMStack服务整体架构图,可以从两个部分来介绍。
首先,当JAMStack项目部署的时候,需要做一系列操作。比如先通过工具链执行S deploy,把需要的一些静态数据和动态的API,做一个分包。比如动态API可以直接上传函数计算,而静态部分会通过文件同步的服务,把它同步到OSS上。这个文件同步服务还会把站点的原数据,比如域名信息和路由信息等做二次存储。这是一个具有持久化的能力,可以存到OTS服务,然后再去发起一个消息通知给到终解析站点的Gateway,Gateway接到通知后会反过来查一下存储的网站原数据信息,然后在网关缓存下来,使得用户在访问网关的时候,不用再去查询相关的原数据信息。
所以如上可见,当应用在做部署的之前已经准备了很多东西了。包括把静态的文件做分离部署、创建动态API和把站点原数据信息同步到最终解析站点的网关上。
JAMStack项目用户的访问流程
用户像往常一样通过浏览器访问刚刚建好的域名,这时候域名会解析到Gateway上,然后因为Gateway已经拿到了这些原件信息,包含路由请求等等,这个时候就开始把这些请求做内部代理,也就是提供了一个service的内部网关,它会根据原数据信息去分别访问动态和静态部分,以及做好的KvStore部分,最终把所有的东西收集起来,从而呈现一个完整的结果给用户。
四、部署工具介绍
部署工具Serverless Devs
上面视频里演示的主体是Desktop,Desktop是用跨平台技术开发的,是用前端的技术HTML、CSS和js.技术打造的。它跟另外一个端侧命令行最大的区别是,当用户希望企业级管理基于JAMStack能力构建的企业站点的时候,势必需要回看部署好之后返回的域名并对它进行二次部署。甚至,要去对站点做一些性能提升,包括压测等等,然后做整个线上和线下的调试端。这一系列的企业服务能力实际上是命令行不具备的。
但是命令行也有它的优势,即被集成很方便。首先,一个专业的开发者一定希望有个非常清亮的工具,命令行就是最佳选择。通过安装命令行工具之后,依然可以操作建站能力,并且可以把命令行集成到工作流里。
所以这两种方式各有优势,大家可以基于自己的习惯和需求去使用。下图是整个工具链的功能列表,除了上述的两种,还有桌面端和应用中心。应用中心承载了很多场景,包括电商建站、博客建站等等模板,通过这些模板用户使用起来更便捷。
部署工具Serverless Devs还有一个最大的特色,即可以实现跨厂商的服务能力。当前的云服务都是每家厂商为自己提供服务的,这个时候一个开发者想要为多云服务,或是他自己本身就有多元服务,想要在不同的云厂商上尝试Service技术的花,需要安装不同的工具。
Serverless Devs拥有很强的扩展能力,也就是说具有基于组件的方式可以构建各个云上的业务的能力。所以只需要安装Serverless Devs就可以实现为多个云厂商服务了。这本身也是一种非常开源开放的理念。
目前Serverless Devs支持30款web框架;拥有7大应用场景模板,而且还在不断增加;另外也在跟其他社区有了更多合作,包括docker上的支持、国内外代码托管服务等等。
五、其他Serverless 工程实践
Serverless Devs本身是一个实际的例子。当前Serverless接口就是Service工具的接口,天生就是用Service的方案的。也就是说,上线当天就是用这套方案做的,本身代码也是用Python写的,10天内就开发了30个接口;而且运行到现在7个多月的实践仍然是0故障的状态。这全部得益于Service这套稳定的服务。
Serverless Devs官网本身也是用工具去做的部署,整个开发部署和上线及持续集成仅仅用了2天时间。
希望通过以上的分享,能够让大家看到Serverless架构在软件工程开发实践的价值,也希望能过激发大家的实践。
最后补充一点,如果想要获取命令行工具、桌面工具等等,可以直接登录官网下载,工具包括Mac版和Windows两个版本。