前端 Serverless:面向全栈的无服务器架构实战 -- 杨凯
🏷️ Serverless
本书前面介绍了 Serverless 的起源、定义以及优缺点等。后面详细介绍了 Serverless 的两个主要组成部分:FaaS 和 BaaS,并且基于阿里云做了示例。
总体来说个人感觉作为入门的介绍书籍还是蛮好的,比较容易理解,介绍也比较详细。比较适合于我这样经常听到,但是又没有使用过的开发者。
由于作者是阿里的员工,书中的示例都是基于阿里云的,所以有不少的篇幅用于介绍具体服务的使用。我这里只是大概瞄了一下,没有实际去操作。
这里仅记录下 Serverless 相关的核心名词和书的目录,以作备忘。
核心名词
- Cloud Native:云原生
- 云原生的代表技术包括:容器、服务网格、微服务、不可变基础设施和声明式 API。
- CNCF:Cloud Native Computing Foundation,云原生计算基金会
- CI:Continuous Integration,持续集成
- CD:Continuous Delivery,持续交付 / Continous Deployment,持续部署
- DevOps:Development & Operations,开发运维
- NoOps:No Operations,无需运维
- BFF:Backend For Frontend,服务于前端的后端
- 由 ThoughtWorks 公司的 Sam Newman 在一篇名为 Pattern: BVackends For Frontends 的博客文章中提出。
- BFF 主要通过在前端和后端之间增加一个“胶水层”(这个“胶水层”由对应的客户端负责编写),实现对客户端所需要的 API 的聚合和裁剪,从而解决前后端分离之后所带来的协作问题。
- FaaS:Function as a Service,函数即服务。提供基于事件驱动的计算服务。开发者以函数片段的方式来管理应用代码,这些函数通过事件或 HTTP 请求来触发。
- 如:Amazon AWS Lambda、Google Cloud Functions、Microsoft Azure Functions、IBM OpenWhisk、阿里云 Function Compute。
- BaaS:Backend as a Service,后端即服务。指的是可以用来替换应用程序中的一些核心能力,且直接通过 API 的方式提供的第三方服务。
- 如:GitHub Pages、CDN(Content Delivery Network,内容分发网络)、OSS(Object Storage Service,对象存储服务)、RDS(Relational Database Service,关系型数据库服务)、MQS(Message Queue Servie,消息队列服务)。
- Serverless:指的是无论在应用的构建环节还是运行环节,都无需对服务器进行维护和管理。Serverless 计算平台应该包含以下一种或两种能力:FaaS、BaaS。
- 中文译为“无服务器的”;但并不是真正意义上没有服务器的架构,而是针对开发者来说,无需关心服务器。包括服务器的资源情况、部署情况、操作系统以及依赖软件等在内的所有细节,开发者均无需关注,这一切由平台完成,开发者只需要专注于业务实现。
- 首次提出于 2012 年 Ken Fromm 发表的 The Future Of Software And Apps Is Serverless 。
- 因 2014 年 Amazon 推出的 AWS Lambda 服务而广为人知。
- Pay As You Go:按量付费
- Elastic Compute:弹性计算
- IaaS:Infrastructure as a Service,基础设施即服务
- PaaS:Platform as a Service,平台即服务
- SaaS:Software as a Service,软件即服务
- 容器化:容器化技术进一步将操作系统虚拟化。通过 Linux 的 Control Groups 和 Namespace 两大特性,实现了对资源(主要是 CPU 和内存)的隔离,提供了能使不同容器独立并且安全运行的环境。代表产品是 Docker。
- CaaS:Containers as a Service,容器即服务
目录
第一部分 Serverless 综述
- 第 1 章 什么是 Serverless
- 1.1 Serverless 的价值
- 1.2 Serverless 是一种理念
- 1.3 Serverless 一词的诞生
- 1.4 CNCF Serverless 白皮书
- 1.5 Serverless 与前端架构
- 1.6 从前端到全栈
- 本章小结
- 第 2 章 何时应用 Serverless
- 2.1 Serverless 的优势与劣势
- 2.2 服务端的应用场景
- 2.2.1 多媒体处理
- 2.2.2 数据库变更捕获
- 2.2.3 处理 IoT 请求
- 2.2.4 聊天机器人
- 2.2.5 计划任务
- 2.2.6 通用后端服务
- 2.3 前端的应用场景
- 2.3.1 Web 应用
- 2.3.2 SSR 应用
- 2.3.3 移动客户端应用
- 2.3.4 小程序
- 本章小结
- 第 3 章 Serverless 与服务端技术
- 3.1 应用分层架构
- 3.2 微服务架构
- 3.3 云计算
- 3.4 容器化
- 3.5 NoOps
- 本章小结
- 第 4 章 Serverless 与前端技术
- 4.1 Backend For Frontend
- 4.2 Node.js
- 4.3 TypeScript
- 4.4 GraphQL
- 4.5 NoBackend
- 本章小结
第二部分 FaaS 技术
- 第 5 章 理解 FaaS
- 5.1 FaaS 的特性
- 5.1.1 函数由事件驱动
- 5.1.2 无状态的函数
- 5.1.3 函数应当足够简单
- 5.2 FaaS 的优点
- 5.2.1 更高的研发效率
- 5.2.2 更低的部署成本
- 5.2.3 更低的运维成本
- 5.2.4 更低的学习成本
- 5.2.5 更低的服务器费用
- 5.2.6 更灵活的部署方案
- 5.2.7 更高的系统安全性
- 5.3 FaaS 的缺点
- 5.3.1 存在平台学习成本
- 5.3.2 较高的调试成本
- 5.3.3 潜在的性能问题
- 5.3.4 供应商锁定问题
- 本章小结
- 5.1 FaaS 的特性
- 第 6 章 第一个函数
- 6.1 从控制台创建
- 6.1.1 开通产品
- 6.1.2 创建一个函数
- 6.1.3 调用函数
- 6.2 基于命令行工具
- 6.2.1 安装命令行工具
- 6.2.2 身份认证配置
- 6.2.3 初始化 FaaS 项目
- 6.2.4 本地调试
- 6.2.5 发布项目
- 6.3 Serverless Framework
- 6.3.1 初始化命令行工具
- 6.3.2 阿里云授权
- 6.3.3 开通配套服务
- 6.3.4 创建项目
- 6.3.5 发布部署
- 6.3.6 远程调用
- 本章小结
- 6.1 从控制台创建
- 第 7 章 函数的生命周期
- 7.1 函数的定义
- 7.1.1 函数名
- 7.1.2 参数
- 7.2 函数的调试
- 7.2.1 本地调用
- 7.2.2 在线调用
- 7.3 函数的发布
- 7.3.1 配置
- 7.3.2 编译
- 7.3.3 部署
- 7.4 函数的更新
- 7.4.1 测试与发布
- 7.4.2 灰度与 A/B 测试
- 本章小结
- 7.1 函数的定义
- 第 8 章 理解函数运行时
- 8.1 函数的触发
- 8.1.1 客户端触发器
- 8.1.2 实践:通过 Web API 调用函数
- 8.1.3 消息触发器
- 8.1.4 实践:通过消息触发函数
- 8.1.5 存储触发器
- 8.1.6 实践:生成上传图片的缩略图
- 8.1.7 其他触发器
- 8.2 函数的执行
- 8.2.1 入口方法
- 8.2.2 运行时
- 8.2.3 日志输出
- 8.2.4 实践:查询函数调用日志
- 本章小结
- 8.1 函数的触发
- 第 9 章 自建简易 FaaS
- 9.1 基础能力
- 9.1.1 基于进程隔离运行函数
- 9.1.2 标准函数的执行能力
- 9.1.3 更安全的执行环境
- 9.1.4 增加 HTTP 服务
- 9.2 进阶挑战
- 9.2.1 提升性能:通过进程池管理子进程的生命周期
- 9.2.2 增强安全性:限制函数的执行时间
- 9.2.3 确保稳定性:对函数资源进行限制
- 9.2.4 提高效率:内置前端常用服务
- 本章小结
- 9.1 基础能力
第三部分 BaaS 技术
- 第 10 章 BaaS 的由来
- 10.1 传统的 IT 时代:原始部落的刀耕火种
- 10.2 云计算时代:现代城市的集中供应
- 10.3 新一代基础设施:CaaS
- 10.4 PaaS 的演进:BaaS
- 10.5 Google Firebase
- 10.6 BaaS 的优势和价值
- 本章小结
- 第 11 章 初始化 BaaS 应用
- 11.1 注册小程序的账号
- 11.2 配置云服务
- 11.3 初始化代码
- 11.4 添加 BaaS SDK
- 本章小结
- 第 12 章 数据的持久化
- 12.1 数据库设计原则
- 12.1.1 BSON 与数据类型
- 12.1.2 三大范式与 NoSQL 数据库
- 12.1.3 引用方式:规范数据模型
- 12.1.4 内嵌方式:高效数据模型
- 12.2 使用数据存储服务
- 12.2.1 通过控制台管理集合
- 12.2.2 通过客户端查询数据
- 12.2.3 在云函数中调用
- 12.2.4 数据权限管理
- 12.2.5 实践:数据的 CURD
- 本章小结
- 12.1 数据库设计原则
- 第 13 章 文件的存储与分发
- 13.1 内容分发网络(CDN)
- 13.1.1 性能优化的利器
- 13.1.2 CDN 加速的基本原理
- 13.1.3 文件存储与 CDN
- 13.2 使用文件存储服务
- 13.2.1 通过控制台管理文件
- 13.2.2 文件的权限管理
- 13.2.3 使用 SDK 上传
- 13.2.4 实践:实现图片的上传和展示
- 本章小结
- 13.1 内容分发网络(CDN)
- 第 14 章 用户身份识别与授权
- 14.1 认证的演进
- 14.1.1 统一身份认证:OpenID
- 14.1.2 第三方授权登录:OAuth
- 14.1.3 进一步完善:OIDC
- 14.2 身份认证即服务:Auth0
- 14.2.1 注册并创建租户
- 14.2.2 控制中心概览
- 14.3 实践:实现基于 Auth0 的身份认证
- 14.3.1 创建并配置应用
- 14.3.2 创建登录页面
- 14.3.3 启动 Web 服务
- 14.3.4 实现登录与注销
- 14.3.5 用户体验改进
- 14.4 实践:实现 GitHub 账号授权
- 14.4.1 开通 GitHub OAuth
- 14.4.2 配置第三方登录
- 14.4.3 测试与认证
- 14.5 扩展:详解 JWT
- 14.5.1 令牌的类型
- 14.5.2 构造一个令牌
- 14.5.3 深入理解 JWT 原理
- 14.5.4 JWT 的优势/劣势与应用场景
- 本章小结
- 14.1 认证的演进