Serverless作為一種近幾年流行的架構,其內(nèi)部的設計相對復雜。本書盡可能使用通俗易懂的語言來幫助讀者理解和掌握Serverless的開發(fā)與設計。本書以JavaScript為主要語言進行講解,以Node.js運行時為主要運行環(huán)境進行服務設計的講解。本書共10章,分別為:Serverless架構的概述、Serverless的總體設計、Serverless架構的腳手架設計、Serverless架構的模塊設計、Serverless架構的函數(shù)設計、Serverless 結構設計、Serverless 架構的配置設計、Serverless架構的協(xié)議設計、Serverless架構的實踐以及Serverless架構最終形態(tài)的演變。內(nèi)容主要涉及JavaScript語言的開發(fā)(包括前端和后端的代碼和功能的實現(xiàn))、數(shù)據(jù)庫的開發(fā)(如MongoDB、ETCD等)、容器層面的開發(fā)(如Docker、 K8s)。從虛擬機(VM)的實現(xiàn)開始,逐步構造出一個虛擬化框架,最終形成一個Serverless架構平臺。為了提升讀者的閱讀體驗,本書使用盡可能少的代碼示例。本書配套有難點實現(xiàn)的微視頻(掃碼即可觀看),以及相關案例源碼(獲取方式見封底)。本書適合相關領域的研究人員和工程技術人員閱讀,也可作為高等院校計算機、軟件工程及相關專業(yè)師生的參考資料。
這本書清晰地梳理了Serverless架構的落地細節(jié)與實踐方法,既有深刻的技術洞察,也包含富有啟發(fā)性的創(chuàng)新設計。對于想要入門Serverless技術卻不知從何下手的讀者來說,此書無疑是一本不可多得的優(yōu)秀教程。
前言隨著后端技術的發(fā)展,人們對后端服務的分割和治理提出了更高的要求,在服務小顆;餍泻,人們更加確信函數(shù)化的編程方式在未來一定會成為主流。在此背景下,以Serverless為首的無服務架構思想開始進入開發(fā)者的視野。這種架構思想主推的就是函數(shù)化顆粒度編程,將開發(fā)和運維分離,其目的是讓開發(fā)更加專注完成編程這項工作。雖然這種方式已經(jīng)推出多年,但對于很多人來說仍屬于一項相對神秘的技術。所以筆者希望能通過通俗的文字把這項技術講清楚,同時能對Serverless進行一些更加深入的解讀。本書的初衷是幫助讀者從思想層面理解這項技術,從技術上實現(xiàn)這項技術。本書將先描述Serverless(無服務)架構的整體框架,再從總體拆解到每個模塊,讓新手開發(fā)到資深開發(fā)都能有所收獲。從純技術角度來說,本書更加適合前端開發(fā)人員、全棧開發(fā)人員和后端開發(fā)人員。而從思想角度來說,它則更加適合想要開發(fā)Serverless服務的開發(fā)者,幫助他們學習Serverless的服務設計思想。此外,對于對后端設計有追求的開發(fā)者來說,也可以從書中學習不一樣的后端開發(fā)與設計方法。對于即將步入職場的新人來說,本書也能拓寬他們的視野,幫助他們初步了解復雜服務的架構設計。本書以JavaScript為主要語言進行講解,以Node.js運行時為主要運行環(huán)境進行服務設計的講解。本書共10章,分別為:Serverless架構的概述、Serverless的總體設計、Serverless架構的腳手架設計、Serverless架構的模塊設計、Serverless架構的函數(shù)設計、Serverless結構設計、Serverless架構的配置設計、Serverless架構的協(xié)議設計、Serverless架構的實踐以及Serverless架構最終形態(tài)的演變。內(nèi)容主要涉及JavaScript語言的開發(fā)(包括前端和后端的代碼和功能的實現(xiàn))、數(shù)據(jù)庫的開發(fā)(如MongoDB、ETCD等)、容器層面的開發(fā)(如Docker、 K8s)。從虛擬機(VM)的實現(xiàn)開始,逐步構造出一個虛擬化框架,最終形成一個Serverless架構平臺。通過從設計到最終的實現(xiàn),展示如何從零構建一個大型平臺服務,以提升開發(fā)者的架構設計能力。通過通俗易懂的語言和生動有趣的故事,使初學者也能輕松理解Serverless架構的概念,并為學習Serverless相關技術的讀者打開一扇新世界的大門。本書由滴滴前高級開發(fā)工程師張原和滴滴專家工程師王昌鵬共同編寫。感謝機械工業(yè)出版社的支持,特別感謝策劃編輯李曉波的辛勤付出。由于筆者水平有限,書中難免存在內(nèi)容或引用錯誤,懇請讀者批評指正,我們會及時記錄反饋并在下一版中進行修正。筆者
張原,滴滴前高級開發(fā)工程師,曾任職于同花順、百草味、個推等知名企業(yè)。長期耕耘于Node.js領域,從事基建相關工作,對Serverless領域有自己獨特的見解,曾作為領域負責人,支撐每日千萬級別的調(diào)用量;钴S于知乎和Github等社區(qū),并在社區(qū)中有自己獨特的貢獻,一些具有創(chuàng)新性思維的文章受到社區(qū)成員的關注和認可。王昌鵬,畢業(yè)于東南大學,獲計算機碩士學位,曾任職于中國移動、阿里巴巴、網(wǎng)易等互聯(lián)網(wǎng)知名企業(yè),目前在滴滴擔任專家工程師。在嵌入式、客戶端、前端及node等領域具有豐富的開發(fā)經(jīng)驗,具有20多項授權專利技術。
前言第1章 Serverless架構的概述/1.1什么是Serverless架構/1.1.1后端服務的演化/1.1.2小顆粒度服務的流行/1.1.3Serverless架構的難點/1.2Serverless架構的作用/1.2.1屏蔽運維需求/1.2.2降低編碼門檻/1.2.3搭建低成本流水線/1.3Serverless架構的應用場景/1.3.1初創(chuàng)企業(yè)/1.3.2敏捷開發(fā)團隊/1.3.3無需架構管理/1.4主流Serverless架構設計的問題/1.4.1非通用使用設計/1.4.2回調(diào)與返回設計/1.4.3中心化路由和分布式路由設計/1.4.4黑盒和顯式引用設計/1.4.5生態(tài)和過于依賴廠商/1.5Serverless架構的目標/1.5.1開源與生態(tài)/1.5.2完善的標準/1.5.3私有化部署能力/1.5.4去中心化服務/第2章 Serverless的總體設計/2.1項目的結構/2.1.1設計結構一覽/2.1.2虛擬機結構設計/2.1.3框架結構設計/2.1.4平臺結構設計/2.2虛擬機的結構拆分/2.2.1VM模塊/2.2.2上下文設計/2.2.3模塊系統(tǒng)設計/2.2.4變量代理設計/2.3框架的結構拆分/2.3.1命令行工具設計/2.3.2基礎庫設計/2.3.3中間件設計/2.3.4線程系統(tǒng)設計/2.4框架線程系統(tǒng)的結構拆分/2.4.1線程池設計/2.4.2回收機制設計/2.4.3動態(tài)運行時設計/2.5運行時模塊拆分/2.5.1運行時與虛擬機的關系/2.5.2環(huán)境變量注入與模塊邏輯設計/2.5.3服務載入虛擬機設計/2.6平臺的結構拆分/2.6.1去中心文件系統(tǒng)設計/2.6.2代碼服務端部署設計/2.6.3配置與注冊中心設計/2.7平臺功能結構設計/2.7.1App的注冊與配置/2.7.2分流和灰度配置/2.7.3App域名配置/第3章 Serverless架構的腳手架設計/3.1腳手架功能概述/3.1.1服務運行/3.1.2代碼編譯/3.1.3服務部署/3.2服務運行功能概述/3.2.1配置獲取設計/3.2.2開發(fā)模式設計/3.2.3可插拔擴展設計/3.3可插拔擴展設計與功能實現(xiàn)/3.3.1插件出口入口設計與實現(xiàn)/3.3.2依賴擴展設計與實現(xiàn)/3.3.3擴展鏈路設計與實現(xiàn)/3.4項目初始化功能設計/3.4.1初始化模板的構建/3.4.2模板拉取功能的實現(xiàn)/3.5產(chǎn)物構建設計/3.5.1打包的前置檢測/3.5.2文件的構建和編譯/3.5.3單應用和多應用打包的實現(xiàn)/3.6服務部署設計/3.6.1App的上傳與同步/3.6.2服務器的服務載入/3.6.3部署通知邏輯/3.7分布式代碼更新/3.7.1分布式代碼更新的目的/3.7.2單機和多機代碼更新的區(qū)別/3.7.3分布式代碼更新實現(xiàn)/第4章 Serverless架構的模塊設計/4.1設計模塊化系統(tǒng)的目的/4.1.1代碼的解耦合和復用/4.1.2互不影響的模塊/4.1.3規(guī)范和模塊的擴展/4.1.4依賴的權限控制/4.2上下文的注入實現(xiàn)/4.2.1上下文概述/4.2.2模塊和文件的上下文/4.2.3全局變量和方法上下文的注入/4.3上下文的代理/4.3.1上下文代理的原理/4.3.2上下文和App綁定原理/4.3.3上下文代理的具體實現(xiàn)/4.4重新設計模塊化系統(tǒng)的實現(xiàn)/4.4.1重寫require功能/4.4.2權限系統(tǒng)判斷的實現(xiàn)/4.4.3外部文件引用的剝離/4.5import實現(xiàn)原理/4.5.1import和require的關系/4.5.2import的轉化實現(xiàn)/4.5.3執(zhí)行import的實現(xiàn)/4.6代碼文件加載實現(xiàn)/4.6.1VM遞歸加載實現(xiàn)/4.6.2文件相互引用加載實現(xiàn)/4.6.3高級語法支持/第5章 Serverless架構的函數(shù)設計/5.1Serverless架構采用函數(shù)的原因/5.1.1什么是函數(shù)/5.1.2降低編寫門檻的設計/5.1.3接口職責的設計/5.1.4相對靈活的服務/5.2Serverless架構函數(shù)功能概述/5.2.1主流Serverless架構的函數(shù)式設計問題/5.2.2數(shù)據(jù)返回和異常處理設計概述/5.2.3分布式路由設計概述/5.2.4代碼黑盒設計/5.3函數(shù)的實例化實現(xiàn)/5.3.1函數(shù)調(diào)用過程實現(xiàn)/5.3.2線程實例化服務類實現(xiàn)/5.3.3線程監(jiān)聽調(diào)用事件實現(xiàn)/5.4函數(shù)參數(shù)注入實現(xiàn)/5.4.1線程的參數(shù)序列化/5.4.2線程中重新實例化參數(shù)對象/5.4.3參數(shù)原值通信/5.5函數(shù)數(shù)據(jù)返回和異常設計實現(xiàn)/5.5.1數(shù)據(jù)返回的實現(xiàn)/5.5.2二進制數(shù)據(jù)和文件流的返回實現(xiàn)/5.5.3異常在線程中的實例化/5.5.4異常中間件捕捉實現(xiàn)/5.6跨App函數(shù)調(diào)用設計與實現(xiàn)/5.6.1RPC函數(shù)調(diào)用鏈路概述/5.6.2RPC函數(shù)實現(xiàn)/5.7分布式路由設計實現(xiàn)/5.7.1路由裝飾器實現(xiàn)/5.7.2線程的路由通信/5.7.3動態(tài)路由掛載實現(xiàn)/第6章 Serverless結構設計/6.1Serverless架構結構概述/6.1.1項目結構設計概述/6.1.2App結構設計概述/6.1.3代碼結構設計概述/6.2項目結構設計/6.2.1配置文件的設計與實現(xiàn)/6.2.2項目的編譯構建設計/6.2.3項目依賴結構設計/6.3App結構設計/6.3.1App入口文件結構設計/6.3.2App隔離結構設計/6.3.3App運行與管理結構設計/6.4代碼結構設計/6.4.1框架引用設計/6.4.2依賴引用設計/6.4.3服務類和函數(shù)設計/6.4.4代碼透出設計/6.5編譯結構設計/6.5.1編譯目錄結構設計/6.5.2編譯配置解析/6.5.3增量編譯實現(xiàn)/第7章 Serverless架構的配置設計/7.1配置模塊分類概述/7.1.1框架配置/7.1.2App配置/7.1.3部署配置/7.1.4流量配置/7.2框架配置設計/7.2.1項目基本配置設計/7.2.2異步獲取配置設計/7.3App配置設計/7.3.1最大線程配置設計/7.3.2系統(tǒng)權限管控配置設計/7.3.3超時配置設計/7.3.4VM和資源配置設計/7.4部署配置設計/7.4.1部署版本配置設計/7.4.2部署數(shù)據(jù)地址配置設計/7.5請求流量配置設計/7.5.1域名配置實現(xiàn)/7.5.2分流配置實現(xiàn)/7.5.3路由配置實現(xiàn)/第8章 Serverless架構的協(xié)議設計/8.1Serverless架構的協(xié)議組成/8.1.1代碼協(xié)議/8.1.2請求協(xié)議/8.1.3應用隔離協(xié)議/8.1.4通信協(xié)議/8.1.5執(zhí)行協(xié)議/8.1.6部署協(xié)議/8.1.7函數(shù)配置協(xié)議/8.2代碼協(xié)議設計/8.2.1路由協(xié)議/8.2.2裝飾器協(xié)議/8.2.3文件和路徑協(xié)議/8.2.4方法暴露協(xié)議/8.3請求協(xié)議設計/8.3.1請求方式協(xié)議/8.3.2請求分發(fā)協(xié)議/8.4應用隔離協(xié)議設計/8.4.1隔離方式協(xié)議/8.4.2影響協(xié)議/8.5通信協(xié)議設計/8.5.1調(diào)用協(xié)議/8.5.2溝通協(xié)議/8.5.3喚起協(xié)議/8.6執(zhí)行協(xié)議設計/8.6.1執(zhí)行入口協(xié)議/8.6.2返回值協(xié)議/8.7部署協(xié)議設計/8.7.1構建協(xié)議/8.7.2請求部署協(xié)議/8.7.3版本升級協(xié)議/8.8函數(shù)配置協(xié)議設計/8.8.1App配置協(xié)議/8.8.2分流配置協(xié)議/8.8.3部署配置協(xié)議/第9章 Serverless架構的實踐/9.1部署方案/9.1.1部署依賴/9.1.2部署規(guī)模準備/9.2容器部署實現(xiàn)/9.2.1Dockerfile準備/9.2.2K8s接入/9.2.3彈性伸縮配置/9.3Serverless架構的限制實例/9.3.1Serverless架構構建App/9.3.2開發(fā)者的權限控制實例/9.3.3開發(fā)者代碼引用規(guī)范實例/9.4基于Serverless架構開發(fā)/9.4.1接入數(shù)據(jù)庫/9.4.2增刪改查的實例/9.4.3前端頁面的渲染實例/9.5用戶模塊的實現(xiàn)/9.5.1登錄和注冊功能實現(xiàn)/9.5.2Token的校驗和App交互/9.6聊天系統(tǒng)功能實現(xiàn)/9.6.1實時聊天實現(xiàn)/9.6.2消息通知實現(xiàn)/9.7App上線實踐/9.7.1應用發(fā)布實踐/9.7.2域名的綁定實踐/9.7.3分流和灰度發(fā)布實踐/第10章 Serverless架構最終形態(tài)的演變/10.1Serverless架構的困境/10.1.1伴隨著異常的服務/10.1.2開發(fā)和調(diào)試的相對困難/10.1.3異常無法自行處理/10.2過渡的Serverless架構方式/10.2.1高信任度的提供商/10.2.2標準化的服務設計/10.3真正的Serverless架構/10.3.1服務的非中心化/10.3.2服務的真正開源/10.3.3標準的語言設計/10.4當前互聯(lián)網(wǎng)的瓶頸/10.4.1算力、存儲和網(wǎng)絡性能的瓶頸/10.4.2過渡的中心化/10.5發(fā)展中的機遇/10.5.1非中心化應用的爆發(fā)/10.5.2瓶頸的移除/10.5.3信任危機出現(xiàn)/10.6形態(tài)的演變/10.6.1代碼即所有/10.6.2去中心化的到來/