Serverless是近年来云计算领域最热门的方向之一,它让开发者不需要管理服务器,只需要写函数代码就能部署应用。我从2019年开始学习Serverless,踩了很多坑,也总结了一些经验。本文是我的Serverless学习路线分享,包括学习的阶段划分、每个阶段需要掌握的知识点、推荐的学习资源、以及实战项目建议。如果你也想学习Serverless,但是不知道从哪里开始,希望这篇文章能帮你理清思路,少走弯路。

一、我为什么学Serverless

先说说我为什么要学Serverless吧。

我是一个后端开发,平时主要用Java和Python写服务。传统的后端开发流程是这样的:写代码、打包、部署到服务器、配置Nginx、监控运维。这个流程很繁琐,尤其是部署和运维,要花很多时间。而且服务器是一直运行的,即使没有请求也要花钱,资源利用率不高。

2019年的时候,Serverless开始火起来。我了解到Serverless的核心理念是"无服务器",开发者只需要写函数代码,上传到平台,平台会自动处理部署、扩容、运维等事情。而且是按实际使用量付费,没有请求的时候不花钱。这听起来太美好了,于是我就开始学习Serverless。

刚开始学习的时候,我走了很多弯路。一会儿看这个云厂商的文档,一会儿看那个框架的教程,东一榔头西一棒子,学了很久还是云里雾里。后来我慢慢理清了思路,制定了一个系统的学习路线,按照这个路线一步步学习,才真正入门了Serverless。

下面我就把我的学习路线分享给大家,希望能帮想学习Serverless的朋友少走一些弯路。

二、第一阶段:理解概念,建立认知

学习任何新技术,第一步都是理解基本概念,建立认知。Serverless也不例外。

1. 什么是Serverless

首先要搞清楚什么是Serverless。Serverless不是没有服务器,而是开发者不需要关心服务器。服务器还是存在的,只是由云厂商来管理。

Serverless有两个核心概念:FaaS(Function as a Service,函数即服务)和BaaS(Backend as a Service,后端即服务)。

FaaS就是把代码写成函数,上传到云平台,平台会根据请求自动调用函数,自动扩容和缩容。常见的FaaS平台有AWS Lambda、阿里云函数计算、腾讯云SCF、Azure Functions等。

BaaS就是把后端的各种能力做成服务,直接调用就行,不需要自己开发和运维。比如数据库服务、存储服务、消息队列服务、认证服务等。常见的BaaS有Firebase、LeanCloud等。

Serverless = FaaS + BaaS,这是目前比较公认的定义。

2. Serverless的优势和劣势

学习Serverless之前,要搞清楚它的优势和劣势,知道它适合什么场景,不适合什么场景。

优势主要有:

  • 免运维:不需要管理服务器,云厂商帮你搞定
  • 自动扩缩容:根据请求量自动扩容和缩容,不用担心流量高峰
  • 按需付费:按实际调用次数和执行时间付费,没有请求不花钱
  • 开发效率高:只需要写业务逻辑,不需要关心基础设施
  • 高可用:云厂商提供高可用的基础设施,不需要自己做容灾

劣势主要有:

  • 冷启动:函数长时间没有调用之后,再次调用会有冷启动延迟
  • 调试困难:本地调试和云端调试都不如传统应用方便
  • 厂商绑定:不同云厂商的Serverless平台不兼容,迁移成本高
  • 执行时间限制:函数有最大执行时间限制,不适合长任务
  • 状态管理困难:函数是无状态的,状态管理比较复杂

了解了这些优势和劣势,你就知道Serverless适合什么场景了。它适合事件驱动、流量波动大、无状态的短任务,比如API接口、数据处理、定时任务、Webhook处理等。不适合长连接、长任务、高并发低延迟的场景。

3. 主流的Serverless平台

目前主流的Serverless平台有:

  • AWS Lambda:最早也是最成熟的FaaS平台,生态最完善
  • 阿里云函数计算:国内用户最多,文档和教程比较丰富
  • 腾讯云SCF:和微信生态结合紧密,做小程序开发很方便
  • Azure Functions:微软的Serverless平台,和Azure生态结合好
  • Google Cloud Functions:谷歌的Serverless平台
  • 开源方案:OpenFaaS、Knative、Kubeless等,可以自己部署

初学者建议选一个国内的云平台,比如阿里云或者腾讯云,因为访问速度快,文档是中文的,社区也比较活跃。等入门之后再了解其他平台。

4. 推荐学习资源

这个阶段推荐的学习资源:

  • 各云厂商的官方文档:最权威、最全面的学习资料
  • 《Serverless架构》这本书:系统介绍Serverless的概念和架构
  • Serverless社区的文章和教程:比如Serverless中文社区、云栖社区等

这个阶段不需要写代码,重点是理解概念,建立对Serverless的整体认知。花一两周时间,把基本概念搞清楚就可以了。

三、第二阶段:动手实践,掌握基础

理解了基本概念之后,就要开始动手实践了。这个阶段的目标是掌握Serverless的基本用法,能独立开发简单的函数。

1. 注册账号,开通服务

首先选一个云平台,注册账号,开通函数计算服务。国内的云平台一般都有免费额度,初学者用免费额度就够了,不需要花钱。

开通服务之后,熟悉一下控制台的界面,看看有哪些功能,怎么创建函数,怎么查看日志,怎么配置触发器。

2. 写第一个Hello World函数

然后写第一个函数,就是经典的Hello World。在控制台创建一个函数,选择运行时(比如Python、Node.js、Java等),写最简单的代码,返回"Hello World"。然后测试调用,看看能不能正常返回。

这一步虽然简单,但是能让你熟悉函数的创建、测试、调用的基本流程。

3. 学习触发器

触发器是Serverless的核心概念之一。函数本身是被动的,需要通过触发器来调用。常见的触发器有:

  • HTTP触发器:通过HTTP请求调用函数,可以用来做API接口
  • 定时触发器:按照时间规则定时调用函数,可以用来做定时任务
  • 对象存储触发器:文件上传到对象存储时触发函数,可以用来做数据处理
  • 消息队列触发器:消息队列收到消息时触发函数,可以用来做异步处理
  • 数据库触发器:数据库发生变更时触发函数

每种触发器都要试一下,了解它们的用法和适用场景。尤其是HTTP触发器和定时触发器,是最常用的,一定要熟练掌握。

4. 学习函数的配置

函数有很多配置项,比如内存大小、超时时间、环境变量、并发度等。这些配置会影响函数的性能和费用,要了解每个配置的作用和设置方法。

比如内存大小,函数的CPU性能和内存大小是挂钩的,内存越大CPU越强,但是费用也越高。要根据函数的实际需求选择合适的内存大小。

比如超时时间,函数有最大执行时间限制,超过这个时间函数会被强制终止。要根据函数的执行时间设置合适的超时时间。

5. 学习日志和监控

Serverless的调试比较困难,所以日志和监控就非常重要。要学会查看函数的执行日志,通过日志来排查问题。也要学会看监控指标,比如调用次数、执行时间、错误率、并发度等,通过监控来了解函数的运行状况。

云平台一般都提供了日志查询和监控告警的功能,要熟悉这些功能的使用。

6. 推荐学习资源

这个阶段推荐的学习资源:

  • 云厂商的快速入门教程:跟着教程一步步做,快速上手
  • 官方的最佳实践文档:学习官方推荐的用法和架构
  • GitHub上的示例项目:看别人是怎么写的,模仿学习

这个阶段要多动手,不要只看教程。每个功能都要自己试一下,写一些简单的函数,熟悉整个开发流程。花两三周时间,把基本功能都掌握了。

四、第三阶段:深入学习,掌握进阶技能

掌握了基础之后,就要深入学习,掌握一些进阶技能。这个阶段的目标是能开发复杂的Serverless应用。

1. 学习Serverless应用开发框架

直接在控制台写函数只适合简单的场景,复杂的应用需要用开发框架来管理。常见的Serverless开发框架有:

  • Serverless Framework:最流行的开源Serverless框架,支持多个云厂商
  • 阿里云Funcraft:阿里云的Serverless开发工具
  • 腾讯云Serverless Framework:腾讯云的开发工具
  • AWS SAM:AWS的Serverless应用模型

用开发框架可以在本地写代码,然后一键部署到云端,还能管理多个函数和相关资源,比在控制台操作方便很多。

选一个你用的云平台对应的框架,学习它的安装、配置、部署、调试等用法。

2. 学习本地调试

Serverless的本地调试是一个难点,但是必须掌握。每次改完代码都部署到云端测试,效率太低了。

开发框架一般都支持本地运行和调试函数,要学会在本地调试函数。可以在本地模拟各种触发器,测试函数的逻辑,确认没问题之后再部署到云端。

对于HTTP触发器的函数,可以在本地启动一个HTTP服务,直接用浏览器或者Postman测试。对于其他触发器的函数,可以用框架提供的本地调用功能来测试。

3. 学习数据库和存储的使用

Serverless函数是无状态的,数据需要存在外部的数据库或者存储中。要学习如何在函数中使用数据库和对象存储。

常见的组合是:函数计算 + 云数据库 + 对象存储。函数处理业务逻辑,数据库存结构化数据,对象存储存文件和图片等非结构化数据。

要学习如何在函数中连接数据库,如何进行CRUD操作,如何管理数据库连接(因为函数是无状态的,数据库连接的管理和传统应用不一样)。也要学习如何上传、下载、删除对象存储中的文件。

4. 学习Serverless的架构设计

Serverless的架构设计和传统应用不一样。传统应用是一个单体服务或者几个微服务,而Serverless应用是由很多个函数组成的,每个函数负责一个小功能。

要学习如何把一个应用拆分成多个函数,如何设计函数之间的调用关系,如何用事件驱动的方式来组织函数。也要学习如何用BaaS服务来减少自己开发的工作量。

常见的Serverless架构模式有:

  • 函数组合模式:多个函数组合起来完成一个复杂的业务流程
  • 事件驱动模式:通过事件来触发函数,实现解耦
  • 后端服务模式:用函数做API后端,前端直接调用
  • 数据处理模式:用函数做ETL、数据清洗、数据分析等

5. 学习性能优化

Serverless的性能优化也是一个重要的课题。主要优化方向有:

  • 冷启动优化:减少冷启动时间,比如用更小的部署包、选择合适的运行时、保持函数热度等
  • 执行时间优化:优化函数代码,减少执行时间,因为执行时间直接影响费用
  • 内存优化:选择合适的内存大小,在性能和费用之间找到平衡
  • 并发优化:合理设置并发度,避免被限流

这些优化技巧需要在实践中慢慢积累,但是基本的原理要了解。

6. 学习成本优化

Serverless虽然按需付费,看起来很便宜,但是用不好也会花很多钱。要学习如何优化成本。

成本优化的方法有:

  • 合理设置内存和超时时间,避免不必要的费用
  • 优化代码,减少执行时间
  • 用对象存储和CDN来处理静态资源,减少函数的调用次数
  • 设置并发限制,防止异常流量导致费用暴增
  • 利用云厂商的免费额度和优惠活动

7. 推荐学习资源

这个阶段推荐的学习资源:

  • 开发框架的官方文档
  • 云厂商的最佳实践和架构白皮书
  • Serverless相关的技术博客和公众号
  • GitHub上的开源Serverless项目

这个阶段要做一些比较复杂的实战项目,比如用Serverless做一个博客系统、一个待办事项应用、一个图片处理服务等。通过实战来掌握进阶技能。花一两个月时间,基本就能熟练使用Serverless了。

五、第四阶段:工程化和生产级应用

掌握了进阶技能之后,就要学习工程化的东西,能开发和维护生产级的Serverless应用。

1. CI/CD流水线

生产级的应用需要有CI/CD流水线,实现代码提交之后自动测试、自动部署。要学习如何把Serverless应用集成到CI/CD流水线中,比如用Jenkins、GitLab CI、GitHub Actions等。

2. 监控和告警

生产级的应用需要完善的监控和告警。要学习如何监控Serverless应用的各项指标,如何设置告警规则,出了问题能及时发现和处理。

除了云平台自带的监控,还可以用第三方的APM工具来做更详细的监控,比如阿里云的ARMS、Datadog等。

3. 安全

Serverless的安全也很重要。要学习如何保护函数的安全,比如权限控制、输入校验、防止注入攻击、密钥管理等。

Serverless的权限模型和传统应用不一样,要了解如何给函数分配最小权限,如何管理访问密钥,如何防止未授权的调用。

4. 灰度发布和版本管理

生产级的应用需要支持灰度发布和版本管理,出了问题可以快速回滚。要学习如何管理函数的版本和别名,如何做灰度发布,如何平滑地升级应用。

5. 容灾和高可用

虽然云厂商提供了高可用的基础设施,但是应用层面也要做容灾设计。要学习如何做多可用区部署,如何处理云厂商的故障,如何保证应用的高可用。

6. 推荐学习资源

这个阶段推荐的学习资源:

  • 云厂商的企业级最佳实践文档
  • Serverless相关的技术大会分享
  • 大型互联网公司的Serverless实践文章

这个阶段需要在实际项目中积累经验,处理各种生产环境的问题。经过几个生产级项目的历练,你就成为Serverless专家了。

六、我的实战项目建议

学习Serverless,实战非常重要。光看不练是学不会的。下面推荐几个适合初学者的实战项目,由易到难。

项目1:天气查询API

用HTTP触发器做一个天气查询的API。调用第三方的天气API,把结果返回给用户。这个项目很简单,但是能让你熟悉HTTP触发器的用法、如何在函数中调用外部API、如何处理请求和响应。

项目2:定时备份服务

用定时触发器做一个定时备份服务。每天定时把数据库的数据备份到对象存储中。这个项目能让你熟悉定时触发器的用法、如何操作数据库和对象存储、如何处理异常和重试。

项目3:图片处理服务

用对象存储触发器做一个图片处理服务。用户上传图片到对象存储,自动触发函数,对图片进行压缩、加水印、生成缩略图等处理。这个项目能让你熟悉对象存储触发器、图片处理库的用法、异步处理的模式。

项目4:个人博客系统

用Serverless做一个完整的个人博客系统。前端用静态页面存在对象存储上,后端用函数做API,数据存在数据库里。支持文章的增删改查、评论、分类标签等功能。这个项目比较复杂,能让你综合运用Serverless的各种技能,学习Serverless应用的架构设计。

项目5:小程序后端

用Serverless做一个微信小程序的后端。微信小程序和腾讯云SCF结合很紧密,可以很方便地开发。做一个简单的小程序,比如待办事项、记账本、打卡应用等,后端用Serverless实现。这个项目能让你学习Serverless在实际产品中的应用。

七、学习中的常见坑

最后分享一些我在学习Serverless过程中踩过的坑,希望大家能避免。

坑1:以为Serverless能解决所有问题

Serverless不是银弹,它有自己的适用场景。不要什么应用都想用Serverless来做。长连接、长任务、高并发低延迟的场景,Serverless可能并不适合。要根据实际需求选择合适的技术方案。

坑2:忽视冷启动的影响

冷启动是Serverless的一大痛点,尤其是对延迟敏感的应用。在设计应用的时候就要考虑冷启动的影响,采取一些优化措施。不要等上线之后才发现延迟太高,那时候再优化就麻烦了。

坑3:不注意成本控制

Serverless按需付费,看起来很便宜,但是如果代码写得不好,或者遇到异常流量,费用可能会很高。一定要设置预算告警和并发限制,防止费用暴增。也要优化代码,减少不必要的调用和执行时间。

坑4:调试全靠打日志

Serverless的调试确实比较困难,但是也不能全靠打日志。要学会用本地调试工具,在本地把逻辑调通了再部署到云端。打日志只是辅助手段,不是唯一的调试方式。

坑5:厂商绑定太严重

不同云厂商的Serverless平台不兼容,如果深度绑定某个厂商,以后想迁移就很困难。在设计应用的时候,可以适当做一些抽象,把平台相关的代码封装起来,这样以后迁移的时候成本会低一些。当然,完全避免厂商绑定是不可能的,但是可以尽量降低影响。

八、写在最后

Serverless是云计算的未来趋势之一,它代表了一种新的软件开发和部署模式。虽然现在还有一些不足,比如冷启动、调试困难、厂商绑定等,但是这些问题都在逐步解决。Serverless的生态也在越来越完善。

学习Serverless,不仅是学习一项新技术,更是学习一种新的架构思想和开发模式。掌握了Serverless,你会对云计算和分布式系统有更深的理解,也能在未来的技术竞争中占据优势。

我的学习路线不一定适合所有人,但是基本的思路是相通的:先理解概念,再动手实践,然后深入学习,最后在实战中成长。按照这个路线一步步来,你也能掌握Serverless。

希望这篇文章能帮到正在学习或者准备学习Serverless的你。如果有什么问题,欢迎在评论区交流。

用一句话结束本文:"Serverless不是让开发者失业,而是让开发者从繁琐的运维中解放出来,专注于创造价值。"愿每一个开发者都能在Serverless的浪潮中找到自己的位置。