采用 Firebase 无服务器 - 移动和 Web 应用程序变得简单
已发表: 2022-03-11移动和 Web 应用程序通常需要后端服务器。 Web 应用程序需要 Web 服务器来传送内容。 应用程序还需要存储用户配置文件和媒体,例如图像和视频。 应用程序和服务器之间的通信通常使用 API 完成,通常是 REST。
应用程序以多种语言编码。 iOS 应用程序是用 Swift 或 Objective-C 编写的。 Android 应用程序是用 Java 或 Kotlin 编写的。 Web 应用程序是用 HTML、CSS、JavaScript 和通常复杂的框架(如 Angular 或 React)编写的。 前端开发人员需要了解相关语言及其相关的开发工具。
后端服务器使用多种语言编写,包括 Go、Java、PHP 和 Python。 这些语言中的每一种都有自己的库套件,以方便编写复杂的应用程序。
大多数开发人员认为自己是前端或后端开发人员。 精通这两个角色的全栈开发人员相对较少。
运行和维护后端服务器有其自身的挑战。 服务器需要构建、更新和备份。 还需要保护服务器以防止意外或恶意数据丢失或访问敏感数据。 此外,服务器需要分配主机名和 IP 地址,以便它们可以连接。
什么是 Firebase?
Firebase 最初是一个移动消息架构,后来被谷歌收购。 从那以后,它已经发展成为一个包含超过 25 个组件的套件,可与 Google Cloud Platform 互操作。
Firebase 由软件开发工具包 (SDK) 组成,允许移动和 Web 开发人员简单、安全、可靠地访问云功能。 它们会自动补偿较差的网络连接。 Firebase Web 控制台可用于启用、管理和保护组件。 还有用于更深入使用的命令行工具和 REST API。
一些 Firebase 组件比其他组件更为人所知。 组件之间几乎没有依赖关系,这允许增量采用功能。 Firebase 身份验证和分析是最广泛使用的。
Firebase 已经发展成为一个平台,允许移动和 Web 前端开发人员开发完整的应用程序,而无需后端服务器。 最近的增强功能极大地促进了无服务器解决方案,它为云虚拟机服务器解决方案提供了一种可行、可扩展、经济高效的替代方案。
Firebase 定价和计费方案
称为 Spark 的基本 Firebase 计费计划是免费的。 云资源的使用是有限制的,但它们相当慷慨。 可以在不产生任何费用的情况下运行合理大小的应用程序。
在 Spark 计划下,可以托管最多 1GB 内容和每月少于 10GB 传输的网站。 Firestore 允许高达 1GB 的数据和高达 10GB/月的网络流量。 云存储限制为高达 5GB 的数据和高达 1GB/天的下载量。
如果应用程序需要更多资源,则需要付费计费计划,例如按需付费。 Spark 计划的免费限制仍然适用。 可计费的费用非常低。 定价可在 Firebase 定价页面上找到。
在云中运行的虚拟机在运行时会产生费用,即使它们没有被使用。 Firebase 无服务器解决方案可扩展到零。 这意味着资源仅在使用时有效地运行,并且在不使用时不会产生费用。 这非常适合用于季节性业务的应用,例如假期租赁或定期活动(例如音乐会)。 会有很多活动,然后是几个月的不活动。
如何设置 Firebase
身份验证需要电子邮件帐户。 首选 Google 邮件帐户。 它们可以在 https://mail.google.com 创建。
还需要 Google Cloud Platform (GCP) 帐户。 可在此处免费试用。 这将为您提供 300 美元的信用额度,有效期为一年。 需要信用卡作为身份证明。 Google 可能会收取 1 美元然后退款。 如果启用了计费功能并且使用了可计费资源,则信用卡将每月从信用卡中扣除。 也有谷歌提供商公司充当结算中间人。 您向提供商支付云使用费用,他们向 Google 支付费用。 他们有自己的计费计划,并可能提供免费试用。
经常监控云控制台的计费部分以监控使用情况非常重要。 在不需要时保持存储等资源很容易,但随着时间的推移会产生相当大的成本。
Firebase 项目也是 GCP 项目。 您可以创建一个 GCP 项目并将其导入 Firebase,或者创建一个 Firebase 项目,这也将创建一个 GCP 项目。 Firebase 控制台就在这里。
不同类型的应用程序需要不同的设置。 主要是 Android、iOS 和 Web 应用程序。 设置说明可以在官方 Firebase 指南中找到。
某些操作需要 Firebase 命令行界面 (CLI) 工具。 这些需要安装Node.js
和npm
工具。 如果在 macOS 或 Linux 上运行,则npm
命令需要与sudo
一起运行。
sudo npm install -g firebase-tools
认证和授权
Firebase 身份验证可能是使用最广泛的 Firebase 组件。 用户可以选择多种身份验证机制中的一种或多种。 这些是电子邮件地址和密码、电话号码以及联合身份提供商 Google、Facebook、Twitter 和 GitHub。 可以启用任意数量的身份验证机制。
Firebase UI 提示用户使用的机制:
Firebase 提供用于身份验证的用户界面,可以从客户端的几行代码调用。 还有用于手动进行身份验证的 API。 身份验证成功后,会生成一个身份令牌,可用于后端验证。
API 允许管理用户以编程方式管理用户。 操作包括:
- 创建、更新和删除用户
- 通过电子邮件地址或电话号码等搜索条件查找用户
- 访问信息,例如帐户创建日期和上次登录日期和时间
- 无需使用现有工作流程即可验证电子邮件地址和电话号码
大多数移动和 Web 应用程序都希望大量用户登录他们的应用程序。 例如,任何拥有 Google Mail 帐户的人都可以向任何允许 Google 身份验证的应用程序进行身份验证。 需要一种授权形式来限制某些用户对应用程序的访问。 这可以通过在数据存储中存储电子邮件地址和访问角色之间的关联来轻松完成。 成功验证后,将在数据存储中查找电子邮件地址。 如果用户以正确的角色存在,则授予访问权限; 否则,用户将被强制注销。
Firebase 托管
Firebase 托管允许将包括 JavaScript 在内的静态 Web 内容托管在云中,而无需 Web 服务器。 内容缓存在全球内容交付网络 (CDN) 的边缘。 这允许从世界任何地方快速访问内容。
可以通过将一个或多个网站添加到 Firebase 控制台中 Firebase 项目的托管部分来托管它们。 内容通过 SSL 传递,并提供两个 URL 形式,[https://site-name.web.app] 和 https://site-name.firebaseapp.com,其中site-name
是项目名称或用户指定的站点名称。
只要您可以更改域的 DNS 记录,就可以很容易地从您自己的域名托管该站点。 您将域名添加到 Firebase 控制台上的站点。 然后,您将获得一个 DNS TXT 记录,您必须将其添加到您域的 DNS 中,以向 Google 证明您拥有该域。 一旦 TXT 记录可见,您就可以获取该站点的 DNS A 记录。 会自动为该站点提供 SSL 证书。 提供证书后,该站点将在全球范围内可用。 原则上,DNS 更新和证书配置可能需要几个小时。 在实践中,该过程可以在 20 分钟内完成。
要将内容添加到托管,首先,为站点创建一个目录并从命令行cd
进入该目录。 接下来,登录 Firebase 并初始化项目目录。
firebase login firebase init
系统将提示您选择一个项目以及需要哪些客户服务。 服务总是可以稍后添加,而不必在此阶段选择。
创建一个名为firebase.json
的文件,它定义了网站根目录和要排除的文件。 您还需要一个.gitignore
文件来从版本控制中排除文件。
{ "hosting": { "public": "public", "ignore": [ "firebase.json", "**/.*", "**/node_modules/**" ] } }
然后,将静态内容复制到公共目录中。 最后,将站点部署到云中。
firebase deploy
要更改 Web 内容,只需更改内容文件并发出部署命令。 每个部署在 Firebase 控制台上显示为一个版本。 您可以通过单击回滚到以前的版本。
Firebase 托管还可以将 URI 重写为文件、Cloud Functions 和 Cloud Run。 这大大简化了事情,因为没有必要为这些服务分配域。 重写是通过将重写部分添加到 firebase.json 的托管部分来定义的。 如果服务不存在,托管部署将失败。
{ "hosting": { "public": "public", "rewrites": [ { "source": "/xxx", "destination": "/profile.html" }, { "source": "/yyy", "function": "profile" }, { "source": "/api{,/**}", "run": { "serviceId": "cloud-api", "region": "europe-west1" } } ] } }
数据存储
Firebase 提供用于访问基于云的数据存储的客户端 API。 存储方式分为三种:

- 实时数据库
- 云防火墙
- 云储存
这允许移动和 Web 客户端在不需要服务器的情况下存储和检索数据。
实时数据库
实时数据库是云托管的 NoSQL 数据库。 实时数据库中的数据会自动实时同步到所有连接的设备。 它适用于 Android、iOS 和 Web 的跨平台。 数据存储为 JSON 树结构。 可以设置安全规则来控制对数据的读写访问。
每个设备都保留数据库的本地副本。 这意味着数据在未连接到网络时可用。 重新连接时,本地和基于云的数据副本将同步。
应用程序使用侦听器读取数据。 侦听器侦听 JSON 树中的节点。 每当控制台或其他用户更改数据时,都会使用新数据值调用侦听器回调。 实时数据库也支持查询。 每个查询都返回一个节点及其所有子节点。
默认情况下,安全规则不允许访问数据。 可以全局添加规则,也可以将规则添加到 JSON 对象的各个节点。 安全规则控制对数据的读写访问,并且可以执行验证。
实时数据库最适合不需要深度嵌套数据结构的小块数据。 免费限制为 1GB 数据。
云防火墙
Cloud Firestore 被视为实时数据库的替代品。 它扩展了实时数据库的功能。 数据不在 JSON 树中,而是文档的分层集合。 每个文档由一组键值对和可选的子文档组成。 查询允许更复杂的过滤和排序,并且只返回完整的文档。 查询不返回子文档。
Cloud Firestore 即将取代 Cloud Datastore。 它可以在数据存储模式或本机模式下运行。 所有 Datastore 应用程序都将自动迁移到 Cloud Firestore。
Cloud Firestore 最适合存储相对较小的数据。 它可以具有深度嵌套的数据结构。 免费限制为 1GB 数据。
云储存
云存储用于存储图像和视频剪辑等文件。 移动和网络客户端可以使用 Firebase 直接在云端上传和下载文件,而无需后端服务器。 免费限制为 5GB 数据。
云函数
Cloud Functions 是创建无服务器应用程序的重要技术。 云函数可以用 JavaScript、TypeScript、Python 或 Go 编写,直接部署到 Google 云中。 函数由 HTTP 请求或云中的事件(例如写入 Cloud Storage)触发。
云函数一次只能处理一个请求,但云会通过复制它来自动扩展该函数。 用 Python 编写的云函数使用 Flask 库来处理 HTTP 请求。 该函数将请求对象作为参数并返回响应正文。
一个简单的 Python 云函数需要一个工作目录,入口点位于文件main.py
中。
def simple_cloud_function(request): return "It worked"
依赖项由 pip 管理并进入一个名为requirements.txt
的文件。
Flask==1.0.2
使用gcloud
命令行工具部署函数。 它指定函数名称、语言和触发器。
gcloud functions deploy simple_cloud_function --runtime python37 \ --trigger-http
该函数的 URL 在部署时显示,可以通过运行 describe 命令找到。
gcloud functions describe simple_cloud_function Url: https://europe-west1-project-id.cloudfunctions.net/simplecloud_function
Cloud Functions 可以调用 Google Cloud 和 Firebase API 来提供后端功能。 它们提供有关执行启动和执行时间的日志信息。 可以轻松添加额外的日志记录。 可以在 Stackdriver Logging UI 和gcloud
命令行工具中查看日志。
gcloud functions logs read simple_cloud_function
可以在 Google Cloud Console 中查看和删除函数。
Cloud Functions 最适合用于发生频率相对较低的操作。 一个示例用途是在将图像上传到 Cloud Storage 时创建缩略图。 免费限制为每月 125,000 次调用。
云跑
Cloud Run 是最近添加的功能,极大地促进了无服务器应用程序。 它使 Docker 容器能够在云中运行,而无需进行复杂的基础架构设置。 它可以在托管模式下运行,该模式使用基于 Kubernetes 构建的 Knative 运行时。 它还可以在 Anthos 上运行,Anthos 也是基于 Kubernetes 构建的,但允许容器跨云运行,甚至可以在您自己的数据中心上运行。 无需设置和管理 Kubernetes 集群,因为这一切都是自动完成的。
任何可以内置到 Docker 镜像中的应用程序都可以由 Cloud Run 管理。 它会根据需求自动扩展容器的数量。 当服务不被使用时,它也会缩小到零。 未使用的服务不收取任何费用。
如果要响应 HTTP 请求,Docker 容器需要运行 Web 服务器。 Python 服务将使用 Flask。 入口点将在app.py
中。
from flask import Flask, request app = Flask(__name__) @app.route('/api/profile') def profile(): page = ''' Page content ''' return page
应用程序需要一个Dockerfile
来创建镜像。
FROM python ENV APP_HOME /app WORKDIR $APP_HOME COPY . . ENV PORT 8080 RUN pip install Flask gunicorn firebase-admin CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 app:app
Cloud Run 容器直接部署到云端。
gcloud run deploy --image=image_name --platform=managed \ --region=europe-west1 --allow-unauthenticated
如果项目配置中未定义服务名称、平台、区域或是否允许未经身份验证,或未在命令行中提供,则会提示输入。 部署完成后,将显示服务 URL。 也可以使用 gcloud 命令获取 URL。
gcloud run services list SERVICE REGION URL LAST DEPLOYED BY LAST DEPLOYED AT cloud-api europe-west1 https://cloud-api-h42ifbxkyq-ew.a.run.app [email protected] 2020-02-05T10:53:30.006Z
URL 包含一个难以管理的随机数。 这是 Firebase 托管重写规则变得最有用的地方。
可以在 Google Cloud Console 中查看和删除服务。
Cloud Run 非常适合托管 REST API。 每月免费限制为 180,000 CPU 秒、360,000 GB 秒内存、200 万个请求和 1GB 网络出口。 仅当服务部署在北美地区时,免费网络出口限制才适用。
验证
默认情况下,Cloud Functions 和 Cloud Run 容器是公共的,互联网上的任何人都可以访问。 使用 Cloud Console 中的 IAM 规则,可以将服务限制为项目成员、Google 群组和个人电子邮件地址。
如果有限制,则禁止未经授权的访问。 要启用访问,必须将身份令牌添加到请求标头中。 可以使用 gcloud 命令或在 Firebase 身份验证过程中获取身份令牌。
gcloud auth print-identity-token
需要授权标头。
Authorization: Bearer id-token
概括
Google Cloud Platform 和 Firebase 提供了一系列产品,极大地促进了移动和 Web 应用程序的开发。 通过允许客户端直接访问云功能或使用 Cloud Functions 或 Cloud Run 将后端代码部署到云中,可以完全消除对后端服务器的需求。
现有应用程序可以逐步迁移到无服务器。 事实上,技术的发展方式可能意味着将不再需要传统的基于虚拟机的服务器解决方案。