Serverless 时代,这才是 Web 应用开发正确的打开方式

本文涉及的产品
函数计算FC,每月15万CU 3个月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 如同 iPhone 当年颠覆了诺基亚,Serverless 的出现也带来了一种全新的、颠覆式的云开发架构模式。

如同 iPhone 当年颠覆了诺基亚,Serverless 的出现也带来了一种全新的、颠覆式的云开发架构模式。在 Serverless 出现前,开发者们根本无法想象几分钟就能快速部署一个 Web 应用上线。近日,亚马逊云科技 Tech Talk 特别邀请了资深无服务器技术专家孙华带来分享《 如何高效、极简构造无服务器 Web 应用》。孙华以 Amazon Lambda 的视角介绍了无服务器 Web 应用的构造方式,并讲述了如何利用最新发布的 Lambda Function URLs 和 Lambda Adapter 进一步简化无服务器 Web 应用的开发和调试并且实现 Web 应用在 Lambda,Fargate 和 EC2 等计算平台之间平滑迁移。

Serverless 时代的应用开发

2012 年,Iron 公司首次提出 Serverless 的概念。2014 年亚马逊云科技发布 Amazon Lambda 第一次让 Serverless 从概念走向落地,也标志着 Serverless 时代的开启。孙华认为,Amazon Lambda 作为无服务器计算服务,主要有以下四个特点。

  • 无需部署管理基础设施:无服务器计算并不代表真的没有服务器,而是不需要管理部署服务器。
  • 自动扩展:不用考虑扩容、容量规划的问题,底层的服务会自动实现按需扩容。
  • 按需付费:按照时间和使用量收费,避免为闲置计算资源浪费。
  • 高度可靠与安全:基于高可用架构开发,可用性高。

Amazon Lambda 的出现为应用开发和部署提供了极简的模型。目前,Amazon Lambda 已有数十万用户,用户的调用峰值通常超过每秒超过百万级。

可口可乐公司就是 Amazon Lambda 的用户之一。在疫情期间,可口可乐通过 Amazon Lambda 仅用一周时间就快速把 mobile pour 应用的原型上线,实现手机与饮料机毫秒级的通讯,从创意到交付的时间缩短了 50%。

Babble 是一家线上教育服务商。疫情期间,线上学习访问量激增 2-3 倍。Babble 通过将服务迁移到 Amazon Lambda 服务器,P95 性能提高了 250ms (降低近 50%),且通过提高利用率,成本降低了四分之一。

无服务器 Web 应用使用场景

Serverless 架构常见的应用场景有数据处理、IT 运维自动化等,不少用户还会将 Serverless 应用到前端的 Web 应用上,包括 Flask、Django、Express.js、Rails 等应用。Serverless 可以渲染相应的 Web 页面到客户端,同时也支持提供 json 的 REST API,进行前后端的分离,静态的 React、Angular、Vue 前端通过 HTTP 请求, 来调用后端的 API,获取数据,从而展示给客户。此外,手机后端应用也经常会使用 Serverless 开发小程序的后端。

无服务器 Web 应用有哪些特点呢?首先,最常见的 Web 应用开发方式,服务器里面运行的是 Web 应用进程,此时,Web 应用会监听到一个端口。并且,在 Amazon Lambda 里面每个请求都是由一个单独的计算实例来处理的,不管 CPU 还是内存,都专门为这一个请求服务。这种方式的优势在于,可以将每个请求全部隔离开,不会出现某一个请求崩溃,影响其他用户的并发需求。

其次,Web 应用在 Amazon Lambda 里面运行,需要是无状态的应用。因为 Amazon Lambda 请求会随机分发到多个计算实例上,每个计算实例在本地缓存数据,下一个请求进入,可能不会分配到同一个实例上。所以,如果需要共享状态,可以存储在 Redis 或者数据库中。

第三,在 Amazon Lambda 的计算环境上,每次调用的请求处理完毕后,计算环境会被冻结到下一次请求来之前。在这段时间里是没有 CPU 资源的,后台任务不能运行,所以不能在 Amazon Lambda 里面运行后台的进程。

最常见的基于前后端分离的 Web 应用架构,通常会把前端的 SPEA 应用放在 Amazon S3 上做 HTTP、Django 等,前端用 CDN 加速。用户下载了前端后,前端会通过 API Gateway,来调用后端动态的数据。API Gateway 提供相应的 HTTP 的入口,触发 Lambda 函数,从而运行 Web 应用。Web 应用可以访问数据库或者任何后端。

image.png

新功能:Lambda Function URLs

亚马逊云科技经常会收到客户的反馈。客户希望在 Amazon Lambda 上学习运行 Web 应用或者将单独的应用运行在 Lambda Function 里面。在 Lambda Function 里面处理所有 URL 相应的业务逻辑,只需要暴露一个 HTTP 入口就可以了,几乎不需要任何额外的学习成本。上个月,亚马逊云科技推出了 Amazon Lambda 内置的 Function URLs 端口,在 Lambda 函数里配置一个 Function URL,就可以提供 HTTPS Endpoint。目前该功能仅在 Amazon Global 提供,在中国区会于近期上线。Function URLs 指向 Amazon Lambda 的最新版本,或者是 Amazon Lambda 别名。Amazon Lambda 别名可以指向 1~2 个 Amazon Lambda 的版本,因此可以通过指向 alias 的方式进行灰度发布或者蓝绿部署。

Lambda Function URLs 与 API Gateway 之间有什么区别?

首先,Function URLs 是非常简单地内置提供 HTTP 入口的方式。它是暴露在公网上的 HTTP 入口,其入口方式是 HTTPS 的,认证方式可以采用 IAM 的权限控制或者在公网上实现。Function URLs 不提供 Custom domain 支持,但是提供 CORS 支持,因此可以跨站请求,比如,浏览器发来 Option,Function URLs 会主动根据配置,返回相应的结果,不会触犯 Lambda 函数。但是,Function URLs 只具备一些简单的功能,对于一些高级的功能没办法实现,比如,使用 Usage Plans,基于 WAF 的集成和在内部提供 Private Enedpoint,目前 Function URLs 是无法实现的。因此,如果想使用 WAF、Usage Private、Private Enedpoint 等功能,请使用 API Gateway 的 Rest API。

其次,Lambda Function URLs 的超时时间是与函数的超时时间是一样的,比如,函数最长要运行 15 分钟,Lambda Function URLs 请求就可以运行 15 分钟,而 Rest API 和 HTTP API 的超时时间仅为 29-30s。在 Payload Size 上,Function URLs 跟 Amazon Lambda 是一样的,均为 6MB。

第三,采用 Lambda Function URLs 不需要支付额外的费用,但是采用 Rest API 与 HTTP API 都需要支付相应的费用。

image.png

很多用户需要 Web 应用有相应的自定义域名访问网站。这时,可以在前面通过 CDN 的方式,加上自定义域名,比如,在 CloudFront 上加上自己的域名,同时结合 Amazon WAF 进行相应集成应用的防护。因为 Function URLs 只提供 HTTPS 的入口,在 CDN 回源的时候,是通过 HTTPS 回到源站的,不能把 Host Header 传回源站,不能获得用户真正访问的自定义域名。如果域名是固定的,可以在应用里通过配置了解,但如果域名不是固定的,那么就需要根据二级域名确定是哪个租户在做相应的处理。这种情况下,就可以利用 CloudFront Function 的功能。CloudFront Function 可以在用户请求端获取域名,加到另外的 Header 里面,再把 Header 传回源站,在源站的应用里面就可以通过这个 Header 获得用户访问的真实的域名。

image.png

如果基于 Lambda Function URLs 部署单函数的的 Web 应用,前面通过 CloudFront 做动态请求的代理,静态资源放在 Amazon S3,就会统一为如下架构,也就不需要 API Gateway 了。

image.png

新工具:Lambda Adapter

Lambda Function URLs 为大家提供了一个非常简单就可以获得 HTTP 入口的方式,但是 Amazon Lambda 的开发方式是基于事件驱动的方法来进行开发的,会将事件源过来的事件转换为 json 对象。对于熟悉 Web 应用开发的开发者,会有额外的学习成本,一般采用的做法是在应用里面写一个 Handler 函数,进行一层转换,把 json 转成 Web 应用需要的格式,但是这种方式可以进一步简化。

亚马逊云科技推出的新工具 Lambda Adapter 作用就是帮助用户完成转化。采用 Lambda Adapter 无需修改代码即可在 Amazon Lambda 上运行 Web 应用。Lambda Adapter 从 Amazon Lambda 获得相应的 json 对象,把它转换成 HTTP 请求,发送到 Web 应用上,Web 应用处理之后通过 HTTP Response 回到 Lambda Adapter,Lambda Adapter 会将它转换成 Lambda 需要的 json Response 的格式。这样不管用什么语言,什么样的 Web 框架,开发 Web 应用或者 HTTP API,都可以通过这样的方式,不需要修改代码,也不需要添加任何的依赖,就可以在 Amazon Lambda 上运行,且不需要用特殊的工具,就可以用熟悉的方法在本地开发调试 API。

image.png

此外,Lambda Adapter 支持 API Gateway 的 Rest API、HTTP API,作为 HTTP 的事件源。不管是哪种格式,Lambda Adapter 都可以做相应的解析并转换。同时因为 Lambda Function URLs 的事件格式和 API Gateway HTTP API V2 事件格式完全一致,所以 Lambda Adapter 不用做任何的修改,就可以接入 Lambda Function URLs。用户结合 Lambda Function URLs 和 Lambda Adapter 就可以把 Web 应用或者 HTTP API 运行在 Lambda 上面。同时,因为 Web 应用有可能返回图片等 Binary 数据,因为 json 里面是不能直接存 Binary 数据的,所以 Binary 数据要做 base64 encoding,Lambda Adapter 会检测返回的数据是不是 Binary 数据,并且自动完成 base64 转码工作。

image.png

同时,Adapter 支持用容器镜像的方式打包函数,也支持用 zip 的方式来打包函数。当用户使用容器镜像的方式打包函数,得到的容器镜像既可以在 Amazon Lambda 上运行,也可以在容器环境里面运行,甚至在本地的电脑上运行。所以 Web 应用可以非常方便地运行在不同的计算平台上,不需要做修改,就可以在不同的平台之间平滑地迁移。

构造无服务器 Web 应用实践

通过 Lambda Function URLs 和 Lambda Adapter 可以很方便的通过熟悉的 API 的方式,构建了 Web 应用。但是如果用 Lambda Adapter,是否可以把现有的 Web 应用运行在 Amazon Lambda 上呢?

亚马逊云科技用 WooCommerce 进行了尝试。WooCommerce 是一个电商的场景,为什么要尝试将 WooCommerce 运行在 Amazon Lambda 上呢?首先,在 Buildwith 网站上,访问量最大的一百个网站中,WooCommerce 所占份额第一;其次,Wordpress 是基于 PHP 开发的,PHP 在 Web 应用网站建设上,大概有 70-80% 的网站是基于 PHP 开发的,使用量非常广;第三,PHP 语言,每个请求进入,都需要重新进行初始化,同 Amazon Lambda 无状态的计算环境非常契合。

亚马逊云科技团队采用了如下无服务器 WooCommerce 架构,在 Amazon Lambda 上运行 WordPress。

image.png

该架构前面部分采用 Route53、CloudFront 做 CDN,用 Amazon Lambda 运行应用,前端用 Lambda Function URLs 代替 API Gateway 作为入口,并将静态资源通过 Amazon S3 存储。然后,在 Lambda 函数里面通过 Docker 镜像的方式,把 PHP Runtime、NGINX Server 和 PHP FPM 运行的进程管理服务加载进来,把 Wordpress 与 WooCommerce 代码打包进去。后端用相应的数据库,比如 Redis、最新的 V2 数据库做数据的缓存,用 EFS 共享的系统来保存用户上传的文件。通过该架构,亚马逊云科技实现了在 Serverless 基础上运行 WordPress。

在 Serverless 上运行网站实际性能如何呢?如果在 WordPress 的网站想要做到比较好的性能,可以把 WordPress 静态化,变成静态内容放在前端的 CDN 网站上。如果运行的是 WooCommerce 电商网站,用户浏览商品、将商品加入购物车、提交订单、支付,是动态请求,需要回到后端的 PHP 应用上。对于静态应用,性能方面可以做到 3 分钟内从无请求到最高峰值,每分可处理 2 万多笔订单,持续 1 小时。成本方面,每处理一笔订单需要调用 10 次 API,也就是处理 100 万笔订单需要调用 1000 万次 Lambda 函数。据统计,1000 万次 Lambda 函数调用的费用也仅为 300 美元。不仅如此,在测试过程中网站的 API 响应时间也非常平稳,P99 延迟仅为在 1-2s,P50 延迟只有 500ms 左右。

分享的最后,孙华针对 Serverless 上运行网站实际性能进行了演示,并提供了 Serverless 相关的资料,感兴趣的开发可扫描下方二维码进行获取。👇

image.png

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
138 3
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
150 45
|
16天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
30 2
|
1月前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
43 1
|
1月前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
1月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
51 2
|
1月前
|
监控 安全 Serverless
"揭秘D2终端大会热点技术:Serverless架构最佳实践全解析,让你的开发效率翻倍,迈向技术新高峰!"
【10月更文挑战第23天】D2终端大会汇聚了众多前沿技术,其中Serverless架构备受瞩目。它让开发者无需关注服务器管理,专注于业务逻辑,提高开发效率。本文介绍了选择合适平台、设计合理函数架构、优化性能及安全监控的最佳实践,助力开发者充分挖掘Serverless潜力,推动技术发展。
61 1
|
2月前
|
监控 Serverless 云计算
探索Serverless架构:开发的未来趋势
【10月更文挑战第5天】Serverless架构,即无服务器架构,正逐渐成为云计算领域的热点。它允许开发者构建和运行应用程序而无需管理底层服务器。本文介绍了Serverless架构的基本概念、核心优势及挑战,并展示了其在事件驱动编程、微服务架构和数据流处理等场景中的应用。通过优化冷启动、使用外部存储等实战技巧,开发者可以更好地利用Serverless架构提升开发效率和应用性能。随着技术的成熟,Serverless将在未来软件开发中扮演重要角色。
WK
|
1月前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
65 0
|
1月前
|
JavaScript 前端开发 Java
SpringBoot_web开发-webjars&静态资源映射规则
https://www.91chuli.com/ 举例:jquery前端框架
20 0

热门文章

最新文章

相关产品

  • 函数计算