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