- 了解云原生應用的新編程模型。
- 編寫高性能的分布式應用,而無需深入技術(shù)細節(jié)。
- 使用Dapr輕松編寫基于任何語言或框架的微服務。
- 了解Dapr如何通過開放的API,以及可擴展、社區(qū)驅(qū)動的組件來提供的一致性和可移植性。
- 探索Dapr如何處理狀態(tài)、資源綁定、以及發(fā)布/訂閱來實現(xiàn)可伸縮、可擴展、事件驅(qū)動的架構(gòu)。
- 將各種SaaS產(chǎn)品的能力集成進云應用,比如機器學習。
獲取關(guān)于Dapr(與現(xiàn)有的以及未來的編程語言一同工作的分布式應用運行時)的權(quán)威指南。該指南由模型的創(chuàng)建者親自撰寫,向你展示了Dapr是如何統(tǒng)一了無狀態(tài)、有狀態(tài),以及actor編程模型,而且能夠隨處運行,無論是在云上還是在邊緣。
來自微軟Azure CTO團隊的作者Haishi Bai和Yaron Schneider解釋說,你不需要在用戶代碼中包含任何SDK或者庫。相反,你自動的獲得了靈活的綁定、狀態(tài)管理、actor模式、發(fā)布/訂閱、可靠消息,以及許多其他的功能。本書面向開發(fā)人員、架構(gòu)師、CIO、學生,以及計算機愛好者等人群介紹了如何入門Dapr。
前言
2018 年秋,一個陰沉的下午,Boris Scholl、Yaron Schneider 和我(海石)在微軟位于雷德蒙德校園的一個小電話室,討論云應用程序的開發(fā)。當時,我們正在構(gòu)想一個與平臺無關(guān)的應用程序模型,使開發(fā)人員能獨立于特定平臺設計出分布式應用程序的拓撲。這個想法終成為開放應用程序模型(https://oam.dev),該模型將應用程序描述為在軟件定義的網(wǎng)格上相互連通的服務集合。
這個應用程序模型并不關(guān)心每個服務是怎么編寫的。當時,我認為提出一個統(tǒng)一的編程模型太有野心了。因此,我們試圖嚴格定義一個將服務視為黑盒的應用程序模型。然而,當我們進一步討論該想法時,似乎遺漏了一些東西。突然,Yaron 跳到白板前開始涂畫。通過他模糊的書寫,一個絕妙的主意浮出水面,他稱之為Reaktive(帶有k 的Reactive,這反映了 Yaron 對 Kubernetes的深厚感情)。 Reaktive 的核心思想很簡單通過邊車容器或進程將分布式系統(tǒng)構(gòu)件帶給用戶的代碼。我們將在簡介部分解釋這個優(yōu)雅而強大的想法是如何將這一新穎的思想帶入分布式系統(tǒng)的設計和實現(xiàn)中。現(xiàn)在,我們繼續(xù)故事的講述。
幾天后,Yaron 帶著原型回來了,我們都認為這很厲害。 Reaktive 為用戶的代碼帶來了狀態(tài)管理、服務發(fā)現(xiàn)以及與可靠消息傳遞等功能,并且不會用任何 SDK 或庫來污染用戶代碼。它可以與任何編程語言一起使用(為了證明這一點,Yaron 甚至在之后做了 COBOL 的示例),并且它非常輕量。
在接下來的幾周中,我們?nèi)齻人花了很多時間頭腦風暴,添加或刪除我們認為有意義或沒必要的功能,在微軟更大的技術(shù)場景下考量它,以及思考如何發(fā)布它。Boris 邀請了微軟和其他公司的架構(gòu)師和開發(fā)人員來進一步驗證我們的想法,并獲得了早期反饋?傮w而言,我們?nèi)齻人的方向似乎沒錯,因此我們將它介紹給了 Azure 的首席技術(shù)官 Mark Russinovich,他立刻喜歡上了我們的想法。他認為這個編程模型有可能對框架設計和分布式應用程序的開發(fā)產(chǎn)生深遠和普遍的影響這遠超我們之前的想法。
后來,Mark 提議我們將 Reaktive 改名為 Actions,即 Actor 和 Functions 的組合。該名稱反映了新產(chǎn)品的核心價值主張:一個非侵入式編程模型,并且將無狀態(tài)服務、有狀態(tài)服務、函數(shù)和 actor 統(tǒng)一在一起。我們都喜歡這個名字,所以保留了它。
一年過去了,Actions 經(jīng)過了數(shù)月的開發(fā)、大量的討論以及來自很多早期嘗試者的驗證。終,它準備好以新的名字 Dapr(https://dapr.io) 分布式應用運行時的縮寫,在佛羅里達州奧蘭多市的 Microsoft Ignite 主講臺上被公布于眾。這是微軟有史以來成功的開源項目之一。在初的24 小時內(nèi),該項目收集了 1000 多個 GitHub star,并且在短短幾天內(nèi)增速就超越了一些受歡迎的開源項目(見圖1)。Star 的熱度持續(xù)了幾個星期,團隊成員終于厭倦并停止了每隔幾個小時就去檢查一下的行為。
很快我們就疲于奔命,社區(qū)貢獻從四面八方涌來:合作伙伴的、競爭對手的、知名企業(yè)的,以及一些小公司的,每個人都在努力使 Dapr 變得更有用。這確實是開源好的地方。
巧合的是,OReilly 的 Kathleen Carr 通過 LinkedIn 聯(lián)系上了我,詢問我是否有出書的想法。 我提出了寫《Actions in Action》這本書的想法。 這是一個大膽的提議:寫一些仍在醞釀中的東西。Kathleen 依然很喜歡這個主意。幾周后,我們簽署了一份合同,將這本介紹 Actions (現(xiàn)在叫 Dapr)的書籍帶給大家。
你正在閱讀本書的事實證明了冒險是值得的。無論 Dapr 未來發(fā)生什么,你都在這里,我們也很高興你在這里。
資源
Dapr 主頁 (https://dapr.io)。
Dapr 運行時倉庫 (https://oreil.ly/SRqme)。
Dapr 文檔倉庫 (https://oreil.ly/MlQfS)。
Dapr 示例倉庫 (https://oreil.ly/7JBHH)。
Dapr 組件貢獻倉庫 (https://oreil.ly/lVk5V)。
本書使用的約定
本書采用了下列印刷規(guī)范。
斜體(Italic)
表示新的術(shù)語、URL、電子郵件地址、文件名和文件擴展名。
固定寬度字體(Constant width)
用于程序清單,以及在段落中引用的程序元素,如變量或函數(shù)名、數(shù)據(jù)庫、數(shù)據(jù)類型、環(huán)境變量、語句和關(guān)鍵字。
固定寬度加粗字體(Constant width bold)
顯示命令或其他應由用戶按字面輸入的文本。也用于在代碼片段中強調(diào)。
固定寬度斜體(Constant width italic)
顯示應該被替換為用戶提供的值或由上下文決定的值的文本。
OReilly 在線學習平臺(OReilly Online Learning)
近40 年來,OReilly Media 致力于提供技術(shù)和商業(yè)培訓、知識和卓越見解,來幫助眾多公司取得成功。
我們擁有獨一無二的專家和革新者組成的龐大網(wǎng)絡,他們通過圖書、文章、會議和我們的在線學習平臺分享他們的知識和經(jīng)驗。OReilly 的在線學習平臺允許你按需訪問現(xiàn)場培訓課程、深入的學習路徑、交互式編程環(huán)境,以及OReilly 和200 多家其他出版商提供的大量文本和視頻資源。有關(guān)的更多信息,請訪問http://oreilly.com。
如何聯(lián)絡我們
請將有關(guān)本書的評論和問題發(fā)送給出版商:
美國:
OReilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區(qū)西直門南大街2號成銘大廈C座807室(100035)
奧萊利技術(shù)咨詢(北京)有限公司
我們?yōu)檫@本書提供了一個網(wǎng)頁,其中列出了勘誤表、示例以及所有其他信息。
你可以通過https://oreil.ly/Dapr 訪問該頁面。
發(fā)送電子郵件到 bookquestions@oreilly.com 來評論或詢問有關(guān)此書的技術(shù)問題。
有關(guān)我們的書籍和課程的新聞和信息,請訪問http://oreilly.com。
在Facebook 上找到我們:http://facebook.com/oreilly。
在Twitter 上關(guān)注我們:http://twitter.com/oreillymedia。
在YouTube 上觀看我們:http://youtube.com/oreillymedia。
致謝
我們要感謝一直致力于Dapr,使其成為成熟產(chǎn)品的所有Dapr 核心團隊:Aman Bhardwaj,Mark Chmarny,Aaron Crawfis,Vinaya Damle,Pruthvidhar Dhodda,Luke Kim,Yotam Lemberger,Leon Mai,Ryan Nowak,Young Bu Park,Mark Russinovich,Shalabh Mohan Shrivastava,Will Smith,Arthur Souza,Charlie Stanley,Mukundan Sundararajan,Ryan Volum 和Ori Zohar。
特別感謝 Mark Fussell 和 Boris Scholl 兩位,本書的技術(shù)審稿人。我們還要感謝我們的合作伙伴、早期試用者,以及為Dapr 做出了巨大貢獻的杰出社區(qū)成員。
Haishi Bai是一位經(jīng)驗豐富的開發(fā)人員和架構(gòu)師,擁有30多年的編程經(jīng)驗。他作為Microsoft Azure CTO辦公室的成員領(lǐng)導了一系列云創(chuàng)新項目。同時他還是一位熱情的教育家,出版了八本云計算相關(guān)書籍。
Yaron Schneider是Microsoft Azure CTO團隊的首席軟件工程師。他是一位狂熱的開源倡導者和貢獻者,主要致力于云原生技術(shù)。Yaron是KEDA(CNCF項目)和Osiris的原創(chuàng)作者之一。
譯者介紹
羅毅Apache Dubbo PMC主席,Dapr Steering and Technical committee(STC)成員,從事分布式中間件領(lǐng)域多年。
曹勝利Apache Dubbo PMC,Dapr Steering and Technical committee(STC)成員,從事多年微服務相關(guān)的基礎(chǔ)建設工作。
敖小劍Servicemesh布道師,Dapr Approver,云原生愛好者和實踐者。
李志信Apache Dubbo PMC,Dapr貢獻者,從事Go語言中間件研發(fā)和開源工作。
目錄
前言 .1
第0 章 簡介 .7
0.1 什么是 Dapr 7
0.1.1 異構(gòu)環(huán)境的編程模型 9
0.1.2 更多的幫助,更少的傾向 . 10
0.1.3 不要重復造輪子! 11
0.1.4 統(tǒng)一的編程模型 12
0.2 Dapr 的架構(gòu) 13
語言支持 15
0.3 開始使用 Dapr 16
0.3.1 Dapr 獨立模式下的 Hello world ! 16
0.3.2 Dapr Kubernetes 模式下的 Hello world 25
0.4 使用 gRPC 32
0.4.1 從 gRPC 客戶端調(diào)用應用程序 33
0.4.2 編寫 gRPC 服務器 . 36
0.5 綁定 40
0.5.1 獨立模式下的綁定 . 41
0.5.2 Kubernetes 模式下的綁定 44
0.6 小結(jié) 45
第1 章 服務 47
1.1 在云出現(xiàn)之前 47
1.2 云的承諾與挑戰(zhàn) 48
1.2.1 可用性 . 48
1.2.2 彈性 49
1.2.3 云原生應用 50
1.2.4 基礎(chǔ)設施是乏味的 . 51
1.3 服務調(diào)用 53
1.3.1 名稱解析. 54
1.3.2 請求和應答 56
1.3.3 并發(fā)控制. 57
1.3.4 服務調(diào)用練習 57
1.3.5 通用命名空間 60
1.4 發(fā)布/ 訂閱 61
1.4.1 基于消息的集成的好處 61
1.4.2 用Dapr 進行發(fā)布/ 訂閱 . 64
1.4.3 發(fā)布/ 訂閱的工作方式 65
1.5 Dapr 組件 . 65
1.5.1 Dapr 配置 67
1.5.2 自定義管道 68
1.5.3 自定義管道練習 . 69
1.5.4 OAuth 2.0 授權(quán) 72
1.5.5 編寫自定義中間件 . 74
1.6 分布式追蹤 . 75
1.6.1 追蹤中間件 75
1.6.2 使用Zipkin 追蹤 77
1.6.3 使用Azure Monitor 跟蹤 79
1.7 服務運維 81
1.7.1 服務部署與升級 . 81
1.7.2 OAM . 83
1.8 小結(jié) 84
第2 章 狀態(tài) 86
2.1 狀態(tài)管理 86
2.1.1 無狀態(tài)與有狀態(tài) . 87
2.1.2 為什么無狀態(tài)服務在云端更受歡迎? . 87
2.1.3 托管有狀態(tài)服務的挑戰(zhàn) 89
2.1.4 將有狀態(tài)服務轉(zhuǎn)換為無狀態(tài)服務 91
2.2 Dapr 狀態(tài)管理 92
2.2.1 并發(fā)模型. 93
2.2.2 一致性模型 93
2.2.3 批量操作和事務 . 93
2.2.4 多狀態(tài)存儲 94
2.2.5 重試策略. 94
2.3 Dapr State API 94
2.3.1 Key 方案 . 95
2.3.2 Get 請求 95
2.3.3 Set 請求 96
2.3.4 Delete 請求 97
2.3.5 事務性請求 97
2.4 使用Dapr State API 97
2.4.1 數(shù)據(jù)處理的考慮因素 99
2.4.2 數(shù)據(jù)查詢和聚合 . 99
2.5 狀態(tài)存儲 100
2.5.1 Redis 101
2.5.2 Azure Cosmos DB 102
2.5.3 etcd . 103
2.5.4 Apache Cassandra 104
2.5.5 Couchbase 106
2.6 自定義狀態(tài)存儲 106
2.6.1 實現(xiàn) State API 107
2.6.2 更新組件注冊表 110
2.7 小結(jié) . 112
第3 章 消息 113
3.1 事件驅(qū)動編程 . 113
3.1.1 消息與事件的對比 114
3.1.2 輸入綁定和輸出綁定 . 115
3.1.3 Pub/Sub 117
3.2 Pub/Sub with Dapr 118
3.2.1 實現(xiàn) Powershell 腳本 118
3.2.2 使用Dapr CLI 測試發(fā)布/ 訂閱 119
3.2.3 Dapr 發(fā)布/ 訂閱行為 . 120
3.2.4 擴展 Dapr Pub/Sub . 120
3.3 使用Dapr 進行輸入和輸出綁定 122
3.3.1 使用輸入綁定 123
3.3.2 使用輸出綁定 123
3.3.3 實現(xiàn)輸入綁定 124
3.3.4 實現(xiàn)輸出綁定 126
3.3.5 使用KEDA 自動縮放 127
3.4 消息傳遞模式 . 130
3.4.1 Saga 模式 . 130
3.4.2 基于內(nèi)容的路由 133
3.4.3 路由清單 134
3.4.4 智能代理 135
3.4.5 MapReduce . 136
3.5 小結(jié) . 137
第4 章 安全 138
4.1 保護分布式應用程序 138
4.1.1 訪問控制 139
4.1.2 數(shù)據(jù)保護 142
4.1.3 安全通信 144
4.1.4 入侵與異常檢測 145
4.2 Dapr 安全功能 146
4.2.1 密鑰存儲 146
4.2.2 實現(xiàn)密鑰存儲 148
4.2.3 Secret API 149
4.2.4 Mutual TLS (mTLS) 150
4.2.5 Dapr mTLS . 153
4.3 小結(jié) . 155
第5 章 Actor 156
5.1 Actor 模式 . 156
5.1.1 現(xiàn)代 Actor 框架 158
5.1.2 Actor 模型的誤用 159
5.2 Dapr 與 Actor 160
5.2.1 調(diào)用一個 Dapr Actor . 165
5.2.2 狀態(tài)管理 166
5.2.3 計時器 167
5.2.4 Reminder . 169
5.3 開始使用 Dapr Actors for C# 170
5.3.1 定義 Actor 接口 170
5.3.2 實現(xiàn) Actor 接口 171
5.4 小結(jié) . 173
第6 章 應用模式 174
6.1 云原生應用 174
6.1.1 云上環(huán)境 175
6.1.2 基于 Dapr 的云原生應用 . 179
6.2 使用 Dapr 進行系統(tǒng)集成 189
6.2.1 使用分布式工作流構(gòu)建有限狀態(tài)機 189
6.2.2 同步 191
6.3 更大生態(tài)系統(tǒng)中的 Dapr 195
6.3.1 Yeoman Dapr 生成器 . 195
6.3.2 在 Visual Studio Code 中使用 Dapr 195
6.3.3 在 ASP.NET Core 中使用 Dapr . 197
6.3.4 更大應用中的 Dapr 199
6.3.5 Dapr 和服務網(wǎng)格 . 200
6.4 邊緣場景中的 Dapr 201
6.5 小結(jié) . 202
第7 章 Dapr 的未來 . 203
7.1 能力交付 204
7.1.1 架構(gòu) 204
7.1.2 應用場景 207
7.2 增強的 Actor 209
7.2.1 聚合器 210
7.2.2 查詢接口 210
7.2.3 Actor 圖 211
7.2.4 多版本 Actor 212
7.2.5 Actor 中間件 213
7.3 通用命名空間 . 213
7.3.1 架構(gòu) 214
7.3.2 應用場景 215
7.4 邊緣場景中的 Dapr 216
7.4.1 作為輕量級函數(shù)運行時的 Dapr 217
7.4.2 WebAssembly 中的 Dapr . 218
7.4.3 作為腳本的 Dapr . 221
7.5 Dapr 的其他改進 222
7.5.1 Dapr 組件投影 222
7.5.2 實踐和經(jīng)過驗證的模式 223
7.5.3 Dapr 描述符 224
7.5.4 Dapr 對多方計算的促進 225
7.6 小結(jié) . 225