採用 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 將後端代碼部署到雲中,可以完全消除對後端服務器的需求。
現有應用程序可以逐步遷移到無服務器。 事實上,技術的發展方式可能意味著傳統的基於虛擬機的服務器解決方案將不再需要。