前端Serverless:面向全棧的無服務器架構實戰( 簡體 字) | |
作者:楊凱 | 類別:1. -> 程式設計 -> 綜合 |
出版社:電子工業出版社 | 3dWoo書號: 54473 詢問書籍請說出此書號! 缺書 NT售價: 445 元 |
出版日:5/1/2021 | |
頁數:248 | |
光碟數:0 | |
站長推薦: | |
印刷:黑白印刷 | 語系: ( 簡體 字 ) |
ISBN:9787121409813 | 【不接受訂購】 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社) | |
第一部分 Serverless 綜述
第 1 章 什么是 Serverless ............ 2 1.1 Serverless 的價值 ............ 3 1.2 Serverless 是一種理念 .......... 5 1.3 Serverless 一詞的誕生 .......... 8 1.4 CNCF Serverless 白皮書 ........... 10 1.5 Serverless 與前端架構 ........... 12 1.6 從前端到全棧 ............ 18 本章小結 ............... 19 第 2 章 何時應用 Serverless .......... 20 2.1 Serverless 的優勢與劣勢 ........... 20 2.2 服務端的應用場景 ............ 22 2.2.1 多媒體處理 ............ 23 2.2.2 數據庫變更捕獲 .......... 24 2.2.3 處理 IoT 請求 .......... 25 2.2.4 聊天機器人 ............ 26 2.2.5 計劃任務 ............ 27 2.2.6 通用后端服務 .......... 27 2.3 前端的應用場景 ............ 28 2.3.1 Web 應用 ........... 29 2.3.2 SSR 應用 ........... 29 2.3.3 移動客戶端應用 .......... 31 2.3.4 小程序 ............ 31 本章小結 ............... 31 第 3 章 Serverless 與服務端技術 .......... 32 3.1 應用分層架構 ............ 32 3.2 微服務架構 ............ 34 3.3 云計算 .............. 37 3.4 容器化 .............. 39 3.5 NoOps ............. 40 本章小結 ............... 42 第 4 章 Serverless 與前端技術 ........... 43 4.1 Backend For Frontend .......... 43 4.2 Node.js .............. 44 4.3 TypeScript ............. 45 4.4 GraphQL ............. 46 4.5 NoBackend ............. 47 本章小結 ............... 47 第二部分 FaaS 技術 第 5 章 理解 FaaS ............. 50 5.1 FaaS 的特性 ............ 50 5.1.1 函數由事件驅動 .......... 50 5.1.2 無狀態的函數 .......... 51 5.1.3 函數應當足夠簡單 .......... 51 5.2 FaaS 的優點 ............ 52 5.2.1 更高的研發效率 .......... 52 5.2.2 更低的部署成本 .......... 53 5.2.3 更低的運維成本 .......... 54 5.2.4 更低的學習成本 .......... 54 5.2.5 更低的服務器費用 .......... 55 5.2.6 更靈活的部署方案 .......... 56 5.2.7 更高的系統安全性 .......... 56 5.3 FaaS 的缺點 ............ 57 5.3.1 存在平臺學習成本 .......... 57 5.3.2 較高的調試成本 .......... 58 5.3.3 潛在的性能問題 .......... 58 5.3.4 供應商鎖定問題 .......... 59 本章小結 ............... 60 第 6 章 第一個函數 ............. 61 6.1 從控制臺創建 ............ 61 6.1.1 開通產品 ............ 61 6.1.2 創建一個函數 .......... 62 6.1.3 調用函數 ............ 64 6.2 基于命令行工具 ............ 64 6.2.1 安裝命令行工具 .......... 64 6.2.2 身份認證配置 .......... 65 6.2.3 初始化 FaaS 項目 .......... 66 6.2.4 本地調試 ............ 67 6.2.5 發布項目 ............ 69 6.3 Serverless Framework........... 70 6.3.1 初始化命令行工具 .......... 70 6.3.2 阿里云授權 ............ 71 6.3.3 開通配套服務 .......... 71 6.3.4 創建項目 ............ 72 6.3.5 發布部署 ............ 72 6.3.6 遠程調用 ............ 73 本章小結 ............... 73 第 7 章 函數的生命周期 ............ 74 7.1 函數的定義 ............ 74 7.1.1 函數名 ............ 74 7.1.2 參數 ............ 75 7.2 函數的調試 ............ 76 7.2.1 本地調用 ............ 76 7.2.2 在線調用 ............ 77 7.3 函數的發布 ............ 77 7.3.1 配置 ............ 77 7.3.2 編譯 ............ 78 7.3.3 部署 ............ 78 7.4 函數的更新 ............ 78 7.4.1 測試與發布 ............ 78 7.4.2 灰度與 A/B 測試 ........... 80 本章小結 ............... 81 第 8 章 理解函數運行時 ............ 82 8.1 函數的觸發 ............ 82 8.1.1 客戶端觸發器 .......... 83 8.1.2 實踐:通過 Web API 調用函數 ........ 83 8.1.3 消息觸發器 ............ 88 8.1.4 實踐:通過消息觸發函數 ........ 89 8.1.5 存儲觸發器 ............ 92 8.1.6 實踐:生成上傳圖片的縮略圖 ........ 93 8.1.7 其他觸發器 ............ 98 8.2 函數的執行 ............ 98 8.2.1 入口方法 ............ 98 8.2.2 運行時 ............ 99 8.2.3 日志輸出 ............ 100 8.2.4 實踐:查詢函數調用日志 ........ 100 本章小結 ............. 101 第 9 章 自建簡易 FaaS ........... 102 9.1 基礎能力 ............ 102 9.1.1 基于進程隔離運行函數 ........ 103 9.1.2 標準函數的執行能力 .......... 105 9.1.3 更安全的執行環境 .......... 106 9.1.4 增加 HTTP 服務 .......... 111 9.2 進階挑戰 ............ 114 9.2.1 提升性能:通過進程池管理子進程的生命周期 .... 115 9.2.2 增強安全性:限制函數的執行時間 ...... 119 9.2.3 確保穩定性:對函數資源進行限制 ...... 122 9.2.4 提高效率:內置前端常用服務 ........ 128 本章小結 ............. 130 第三部分 BaaS 技術 第 10 章 BaaS 的由來 ........... 132 10.1 傳統的 IT 時代:原始部落的刀耕火種 ....... 132 10.2 云計算時代:現代城市的集中供應 ....... 133 10.3 新一代基礎設施:CaaS .......... 134 10.4 PaaS 的演進:BaaS .......... 136 10.5 Google Firebase ............ 137 10.6 BaaS 的優勢和價值 ........... 142 本章小結 ............. 144 第 11 章 初始化 BaaS 應用 ........... 145 11.1 注冊小程序的賬號........... 145 11.2 配置云服務 ............ 146 11.3 初始化代碼 ............ 148 11.4 添加 BaaS SDK ........... 150 本章小結 ............. 151 第 12 章 數據的持久化 ............ 152 12.1 數據庫設計原則 ............ 154 12.1.1 BSON 與數據類型 ......... 154 12.1.2 三大范式與 NoSQL 數據庫 ........ 155 12.1.3 引用方式:規范數據模型 ........ 156 12.1.4 內嵌方式:高效數據模型 ........ 158 12.2 使用數據存儲服務 .......... 159 12.2.1 通過控制臺管理集合 .......... 159 12.2.2 通過客戶端查詢數據 .......... 162 12.2.3 在云函數中調用 .......... 162 12.2.4 數據權限管理 .......... 165 12.2.5 實踐:數據的 CURD ......... 165 本章小結 ............. 167 第 13 章 文件的存儲與分發 ........... 168 13.1 內容分發網絡(CDN) .......... 168 13.1.1 性能優化的利器 .......... 168 13.1.2 CDN 加速的基本原理 ........ 169 13.1.3 文件存儲與 CDN .......... 170 13.2 使用文件存儲服務 .......... 172 13.2.1 通過控制臺管理文件 .......... 172 13.2.2 文件的權限管理 .......... 173 13.2.3 使用 SDK 上傳 .......... 174 13.2.4 實踐:實現圖片的上傳和展示 ........ 174 本章小結 ............. 180 第 14 章 用戶身份識別與授權 ........... 181 14.1 認證的演進 ............ 181 14.1.1 統一身份認證:OpenID ......... 182 14.1.2 第三方授權登錄:OAuth ......... 185 14.1.3 進一步完善:OIDC .......... 189 14.2 身份認證即服務:Auth0 .......... 191 14.2.1 注冊并創建租戶 .......... 191 14.2.2 控制中心概覽 .......... 192 14.3 實踐:實現基于 Auth0 的身份認證 ....... 195 14.3.1 創建并配置應用 .......... 195 14.3.2 創建登錄頁面 .......... 196 14.3.3 啟動 Web 服務 ........... 198 14.3.4 實現登錄與注銷 .......... 198 14.3.5 用戶體驗改進 .......... 202 14.4 實踐:實現 GitHub 賬號授權 ......... 206 14.4.1 開通 GitHub OAuth .......... 206 14.4.2 配置第三方登錄 .......... 208 14.4.3 測試與認證 .......... 209 14.5 擴展:詳解 JWT ........... 209 14.5.1 令牌的類型 .......... 210 14.5.2 構造一個令牌 .......... 211 14.5.3 深入理解 JWT 原理 .......... 213 14.5.4 JWT 的優勢/劣勢與應用場景 ....... 218 本章小結 ............. 223 本書以云原生(Cloud Native)技術為背景,講述了 Serverless 的基本原理與實戰應用。書中首先探討 Serverless 與當前云計算技術和前端技術的關系,隨后分別從 Serverless 的兩大能力(FaaS 和 BaaS)展開,探討了它們的歷史由來和底層原理,并且結合實際應用場景,有針對性地提供了操作指南。本書從手動構建一套基于進程的 FaaS 架構開始,之后深入剖析云計算服務的內核,闡述其背后的原理和思想,從而讓讀者理解下一代軟件架構的本質。本書主要從前端研發人員的視角介紹 Serverless 的原理及應用。相信無論是希望更多了解服務端技術的前端研發人員,還是已經涉足后端但希望更多了解云原生技術的全棧工程師,或是希望通過 Serverless 提升團隊研發效率的架構師,都會從閱讀本書中獲益良多。
序 一
蔣江偉(小邪) 阿里云技術研發負責人/云智能基礎產品事業部負責人 Serverless 屬于一種架構模式,其初衷很簡單,就是提升同質編程模型的研發效率。隨著云計算、互聯網分布式技術的發展,Serverless 也站上了重要的歷史舞臺。Serverless 可以大幅度簡化分布式架構中遇到的挑戰,在提升研發人員研發效率的同時,解決了分布式的難題——資源彈性、低成本、高可用三個關鍵架構要素。同時其研發質量可以很好地受控。它是企業面對靈活多變的業務需求下非常好的架構選擇。比如在開放平臺場景中,服務端工程師通過開放平臺透出的每一個服務都可以通過簡單腳本進行封裝后發布為針對不同端的服務。這簡單有效,并且無須關心計算、存儲、網絡等資源的彈性問題。同時,所發布服務的質量可以通過配套的測試流程模塊來嚴格保障。由于腳本的運行態處在一個安全的高質量的環境,因此不容易犯錯;另外,研發過程中本來需要注意的很多技術細節問題,也可通過平臺來統一解決,類似于代碼執行效率低、安全性問題、潛在的 bug 等都可以被提前識別出來,最終實現高效率的業務迭代。 Serverless 使得平臺和邏輯被嚴格分離,并進一步進行了分工。其編碼簡單,經過適當的學習培訓就能夠編寫出原來需要非常優秀的大量工程師才能獲得的結果。Serverless 的架構理念幾乎可以用在現在所有的軟件研發場景、多端場景、平臺開放服務場景、數據庫服務場景。當然最典型的要數大數據的各種計算場景。已有證據表明,Serverless 的運用使得大數據的研發場景,效率得以 10 倍級別的提升。這使得 BI(Business Intelligence)的工程師也能利用簡單編程來實現復雜的數據分析計算。阿里云上的函數計算也是典型的通用型 Serverless 平臺,可以通過編寫腳本實現邏輯,包括對數據的獲取、邏輯處理,以及格式化輸出和寫入。這樣對程序員的要求就降低了很多,因為不用考慮搭建服務器、搭建數據庫,以及選擇文件系統、配置網絡、負載均衡等基礎產品,也不用考慮計算存儲網絡資源的彈性問題、資源運維問題,而且還可按需計費。看起來唯一需要關心的就是邏輯。該平臺是編寫簡單任務的一套非常好的平臺,可應用于簡單 Web 應用、監控運維、音視頻處理、AI 大數據處理等場景。我曾經致力于研發一款面向普惠在線業務場景的 Serverless 平臺,用來解決電商研發效率的問題。電商系統具有架構復雜度,是大型的分布式系統,對數據的一致性要求較高,同時會有高并發的流量。如果這個場景能被Serverless 平臺解決,那么 Serverless 才算真正走向了“舞臺”的中央。由于一些原因,直至今日我還沒有完成這個產品。有的原型產品為了避免對業務本身架構的侵入,設計得過于通用,以致不夠高效和一體化,像一堆工具的堆砌;而有的原型產品設計得于專用,只能滿足一些特定的業務場景,以致只能簡單地進行模板的替換,解決一些經常變化的邏輯,適用范圍較小。 總之,本人還需要繼續努力。 本書作者的經驗來源于實踐,其對很多問題都有深刻的思考,書中的很多內容對于讀者都頗有借鑒意義。 序 二 楊皓然(不瞋) 阿里云 Serverless 負責人/阿里云函數計算負責人 過去的 10 年,云取得了巨大的成功,并深刻地改變了企業創新的方式。只需要簡單的 API調用就可以啟動成百上千臺機器,算力的獲取變得前所未有的簡捷。但如何管理和有效地利用海量的算力則是極具挑戰性的事情。資源水位管理、機器擴容/縮容、網絡配置、安全補丁升級、搭建監控報警系統等工作過于底層化,像一條巨大的鴻溝,橫亙于前端開發者和云平臺之間。 前端開發者是離云最遠的開發者群體。 下一個 10 年,云的使命是,賦能于 10 倍規模的開發者,讓他們能夠高效地利用算力構建各種類型的應用,快速迭代創新。這是云的進化動力,也是 Serverless 誕生、發展、壯大的邏輯。因此,我們看到 Serverless 產品版圖在飛速擴大,計算、存儲、數據庫、中間件、大數據…… 越來越多的新產品或者新功能已經呈現出 Serverless 的形態。各種云服務的 API,不只是為開發者提供了算力,更是成為構建應用的基本元素。Serverless 將成為云的新一代編程模型。 前端是一個飛速發展的技術領域,從基于 Ajax 的前后端分離,到基于 Node.js 的前端工程化和全棧化,每一次變革都因革命性的技術而興起,最終又推動了前端開發模式的變化,大大拓展了前端開發者的能力范圍。而 Serverless 的出現毫無疑問是前端行業迄今為止最具革命性和長遠影響力的一次變革。Serverless 讓前端開發者有能力駕馭云的強大力量,可基于豐富的云服務 API 構建彈性、高可用、低成本的應用(而無須管理和運維基礎設施),并真正成為業務創新的核心力量。 Serverless 將填平前端開發者和云之間的鴻溝,但這不是一蹴而就的。開發者在學習Serverless 時,面臨概念不清、場景不明、難以落地等困難,甚至對其還有很多誤解,本書則致力于解決這些問題。作為一名經驗豐富的前后端全棧專家,楊凱顯然對 Serverless 所蘊含的巨大潛力以及落地挑戰有非常深刻的認識。在本書中,他對 Serverless 的概念、源起、現狀和未來做了清晰的闡述,也將自己非常豐富的 Serverless 實戰經驗進行提煉、抽象,以幫助廣大開發者理解、掌握相關知識。 本書結構清晰,內容翔實。書中首先介紹了 Serverless 的概念、優劣勢,以及相關聯的前后端技術。接下來以前端場景中的典型場景為例,對 Serverless 架構、復雜應用構建、工程化實踐進行了深入的剖析。本書既有方法論,也有實戰案例,對 Serverless 技術進行了全面系統的解讀,是一本為前端開發者量身定做的、值得一讀的 Serverless 圖書。 Serverless 將改變我們看待和使用云的方式,也將重新定義價值交付的方式。衷心祝愿本書能成為廣大讀者 Serverless 旅程的起點。 前 言 本書主要面向有一定 Node.js 實戰經驗的全棧工程師。其中的示例代碼均采用 JavaScript 編寫,該代碼在 Node.js 12.x 的運行環境下可正常執行。因此,如果讀者熟悉 Node.js 編程,就會對其中的示例代碼有更充分的了解。不過對于前端研發人員來說,在熟悉 JavaScript 的基礎之上,學習 Node.js 應該是非常容易的。本書的定位是讓前端研發人員能夠快速地了解并掌握服務端編程。因此,即使沒有 Node.js 經驗的前端研發人員,理解本書中的示例也并不困難。 本書并不假設讀者已經具備任何云原生的研發經驗,或任何云計算平臺的使用經驗。但如果讀者在這之前已經具備相關經驗,將對學習本書的內容有所助益。 示例風格 本書的部分章節將包含代碼示例,它們均以統一的風格編寫而成,希望讀者能夠將這些代碼示例放在實際的運行環境中進行實踐,以加強對相關內容的理解,從而可以在今后的實際工作中更靈活地應用書中的內容。另外,本書的部分章節使用了特定的云計算供應商提供的環境,作為代碼示例的運行環境。由于目前 Serverless 并沒有形成行業規范,因此代碼示例可能并不能直接應用于不同的云計算供應商。若有需要,讀者可以自行對其進行小幅調試,以適配不同的云計算供應商。 內容結構 本書整體分為三大部分。 第 1 部分(第 1~4 章)將從 Serverless 的誕生和定義開始,講述什么是 Serverless 思想,以及在云計算時代為什么需要 Serverless。通過對本部分的學習,讀者可從宏觀層面感性認識到Serverless 與當前已有技術的定位關系,明確它與這些技術的合作模式,并可更全面地認識到Serverless 給研發和運維所帶來的巨大變化。 第 2 部分(第 5~9 章)將著重探討 FaaS 部分,它是 Serverless 核心思想的實際應用技術。我們將首先在云計算供應商所提供的 FaaS 產品中體驗它與傳統研發模式的不同,再深入其內部,了解它的核心設計原理和思想,最后動手實踐一套簡單的 FaaS 架構。通過對本部分的學習,讀者可更透徹地理解 FaaS 的內部機制,以便在實際業務場景中更靈活地應用 FaaS。 第 3 部分(第 10~14 章)則將視角轉向 BaaS,它是 Serverless 的另一大分支體系。BaaS 的出現,讓應用的研發成本大幅度降低,并使得如數據庫、緩存等服務端技術的使用變得十分便捷。本章將從 BaaS 的基本理念開始介紹,幷通過實踐,講解最核心的三大 BaaS 產品,即數據庫、文件系統和用戶身份驗證系統。通過對本部分的學習,讀者可掌握 BaaS 的使用技巧,從而在今后的應用研發過程中只需要關注前端部分的工作,而后端的各種服務端技術則完全通過 BaaS API 來實現。 章節概覽 第 0 章從 Serverless 對前端的顛覆性影響入手,從三個方面剖析了 Serverless 的價值導向與實踐意義,為讀者開始學習后面的完整體系,奠定了認知基礎與定位坐標。 第 1 章將從 Serverless 的起源談起,介紹其基本理念以及 CNCF Serverless 白皮書對它的定義,并從廣義定義和標準定義兩個角度來闡述什么是 Serverless 架構。隨后,將結合前端架構的演進,探討為什么在基于 BFF 前后端分離的技術上,前端應該使用 Serverless 架構,以及它的價值和意義。 第 2 章介紹 Serverless 架構的優勢與劣勢,通過案例講解了 Serverless 在服務端與前端領域中的不同應用場景。希望讀者在了解了 Serverless 架構的特性和優勢/劣勢后,能夠基于這些特點,探索 Serverless 的更多應用場景。 第 3 章將介紹 Serverless 與各個服務端技術之間的關系,并介紹如何從傳統架構和微服務架構逐漸遷移到 Serverless 架構。 第 4 章將介紹多個與 Serverless 相關的前端技術,以及如何從 BFF 遷移到 Serverless 架構。另外,還將介紹云計算廠商的 Serverless 服務為什么都采用了 Node.js 語言作為最初支持的語言,同時還將探討 TypeScript 和 GraphQL 在 Serverless 中的應用場景和局限性。 第 5 章將介紹 FaaS 的基本概念以及函數事件驅動、無狀態的特性等內容。通過分析這些特性,闡明 FaaS 技術的優點與缺點,以使大家能更容易地知道自己應該在什么場景下應用 FaaS。 第 6 章開始進入 FaaS 的實踐環節。在本章中,將通過 3 種不同的方式,完成一個HelloWorld 函數的創建、調試和發布。其中,通過控制臺來管理函數,讓我們只需要有一個瀏覽器即可完成工作,但它無法管理超過一定數量的函數配置;而通過官方命令行工具,我們可以選擇自己習慣的終端和代碼編輯器,從而實現管理大型應用。 第 7 章將介紹函數發布的內部細節,包括它是如何在云服務器中進行構建、部署的。此外,還將介紹在 FaaS 場景下,如何通過版本和別名的配置操作,完成服務的灰度發布和 A/B 測試。與虛擬機或容器鏡像相比,對函數的管理將更簡捷、自然。 第 8 章將介紹函數的觸發與執行機制。函數觸發器,實際上是云計算各個產品中的“黏合劑”,通過它的靈活運用,可以讓不同的云計算產品有機地結合起來,從而提供更強大的服務。當函數被觸發器調用后,會大致經歷與入口方法、運行時和日志輸出分別相關的 3 個階段,本章將逐一進行介紹。 第 9 章將介紹如何從零開始搭建一個函數的運行環境。通過實踐,讀者可深入地理解 FaaS 的運轉機制,包括如何保障函數的隔離性、如何限制函數的計算資源等。 第 10 章將進入 BaaS 的學習階段。本章首先介紹 BaaS 的背景知識,通過了解云計算的不同服務模式,讀者可感受到 BaaS 在研發中的定位。隨后,通過對 Google Firebase 的介紹,讀者可一窺 BaaS 所提供的能力。 第 11 章開始進入實踐環節。我們將基于阿里云 Serverless 小程序平臺和微信小程序,創建屬于自己的 Serverless 應用。 第 12 章將介紹數據庫方向的 BaaS 產品。首先將簡單介紹 NoSQL 背景,以及 MongoDB 的數據結構設計基本原則,隨后,以阿里云 Serverless 小程序平臺為例,介紹如何使用 BaaS 服務實現數據的持久化。與傳統的數據庫服務相比,基于 BaaS 的數據存儲服務實現了開箱即用 的能力,我們只需在控制臺通過簡單的配置,即可在客戶端中對數據集進行操作;無須關注操作系統、數據庫類型選擇,以及數據庫版本升級等一系列問題。 第 13 章將介紹 BaaS 的另一大產品——文件存儲服務。本章將講解如何通過 API 完成文件的上傳和分發。 第 14 章將介紹與身份認證有關的內容。通過對 OpenID 與 OAuth 協議的學習,讀者可了解應用身份認證與授權登錄的區別。隨后,我們將基于 Auth0 提供的身份認證 BaaS 產品來創建一個 Serverless 的身份認證系統。這樣在不依賴任何后端服務的情況下,就能完成用戶注冊、用戶登錄以及密碼找回等一系列功能。 |