随着云计算技术的发展,Serverless 成为了一个备受关注的技术趋势。Serverless 可以让开发者专注于业务逻辑而不是基础设施,免去了自己搭建服务器的压力。但是,Serverless 的部署复杂性也给开发者带来了一定的挑战。
什么是 Serverless
简单来说,Serverless 是一种计算模式,它不需要开发者自己去管理服务器。在 Serverless 中,开发者可以通过函数完成代码逻辑的实现,函数的运行和维护都是由云服务厂商来完成的。因此,Serverless 的特点是节省成本、敏捷部署、低维护和按需付费。
Serverless 的部署复杂性
尽管 Serverless 极大地降低了开发者的运维成本,但状态管理、依赖管理和持久化等问题依然存在。除此之外,部署的环境、域名管理以及函数版本等内容也存在一定的复杂度。下面我们分别展开讨论一下。
状态管理
在 Serverless 中,状态是指各种运行上下文中的状态,包括函数状态、Web 应用状态、用户状态等等。其中,函数状态是最容易被忽视的部分。
通常情况下,Serverless 函数应该是幂等的。幂等是指函数的输出只与输入相关,与其它状态无关,对于函数来说始终是一样的。幂等的设计不需要考虑状态,但是一些业务场景无法实现幂等,如查询实时价格、创建订单等场景。这时,我们需要引入状态管理来解决这个问题。常用的状态管理方式包括使用数据库、使用全局存储服务等。
依赖管理
Serverless 函数通常需要依赖一些第三方库。在本地开发时,我们可以使用 package.json 管理依赖库。但是在部署时,需要将所有依赖打包到函数中进行上传。如果没有正确地打包,会导致函数无法正常调用。
为了解决这个问题,我们可以使用构建工具来自动打包依赖。对于 Node.js 函数,可以使用 webpack 或者 rollup。对于 Python 函数,可以使用 pipenv 。
持久化
Serverless 函数是自动扩缩容的,函数状态直接保存在内存中。这就要求我们需要使用其他的持久化方式,如数据库或者存储服务,来保存重要的业务数据。否则,当函数扩缩容时,函数状态就会无限制地丢失。
部署环境
Serverless 部署环境各不相同,需要按照不同的云服务厂商的要求进行配置。如果你同时使用多个云厂商,就需要在不同的平台上进行配置,大大增加了部署的复杂度。为了解决这个问题,我们可以使用类似 Terraform、 AWS CDK 或者 Serverless Framework 的工具来管理 Serverless 资源。
域名管理
如果我们需要将自己的 Serverless 函数暴露在公网上,通常需要配置域名。在 Serverless 中,域名管理也是个棘手的问题。对于不同的云服务商,可以使用各自的 DNS 服务,如 AWS Route 53 或者阿里云 DNS。如果你同时使用多个云服务商,就需要在多个平台上进行配置。
函数版本
在 Serverless 中,代码和配置都是定义在函数内部的。这就意味着当你需要更新函数代码和配置时,需要手动维护版本号。如果你使用了多个代码库和多个云服务商,就需要在多个平台上进行版本管理。为了解决这个问题,我们可以使用 Serverless Framework 中的变量功能来处理版本号,从而实现自动化的部署。
Serverless 部署最佳实践
基于上述 Serverless 部署复杂性,我们可以在实际开发中采取以下的最佳实践。
- 尽量将业务状态保存在数据库或者全局存储中。
- 使用构建工具自动打包第三方依赖库。
- 针对需要较长时间执行的任务,使用异步的方式,比如使用消息队列。
- 在部署环境中使用工具进行资源管理,实现控制可追溯和灵活度。
- 集中管理域名和 HTTPS 证书,使用云服务商提供的服务实现灵活配置。
- 使用 Serverless Framework 等工具自动化构建和部署,实现版本自动化处理。
下面是一个 Serverless 示例代码,实现在 AWS Lambda 上创建一条记录方式:
-- -------------------- ---- ------- ------ ---- ------ ----- -------- - -------------------------- ----- - ---------------------------- --- --------------------- --------- ---- - - ----- ------------ ------- -------------- ------ ------------ - -------- - --------------- --------- - ------ - ------------- ---- ------- ------------------ ------------ --------- -
如上所示,我们可以使用 Boto3 库在 Python 函数中访问 AWS DynamoDB 表,实现记录创建功能。
结论
Serverless 给云计算、互联网服务提供了全新的灵活性和弹性。对于开发者来说,Serverless 化可以更大地提高开发效率和灵活性。而处理 Serverless 的部署复杂性是必不可少的技能之一。通过本文介绍的技巧和最佳实践,我们可以在 Serverless 路上更加得心应手!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6750f7d6050cf9039c1837cd