- 了解云原生應(yīng)用的新編程模型。
- 編寫(xiě)高性能的分布式應(yīng)用,而無(wú)需深入技術(shù)細(xì)節(jié)。
- 使用Dapr輕松編寫(xiě)基于任何語(yǔ)言或框架的微服務(wù)。
- 了解Dapr如何通過(guò)開(kāi)放的API,以及可擴(kuò)展、社區(qū)驅(qū)動(dòng)的組件來(lái)提供的一致性和可移植性。
- 探索Dapr如何處理狀態(tài)、資源綁定、以及發(fā)布/訂閱來(lái)實(shí)現(xiàn)可伸縮、可擴(kuò)展、事件驅(qū)動(dòng)的架構(gòu)。
- 將各種SaaS產(chǎn)品的能力集成進(jìn)云應(yīng)用,比如機(jī)器學(xué)習(xí)。
獲取關(guān)于Dapr(與現(xiàn)有的以及未來(lái)的編程語(yǔ)言一同工作的分布式應(yīng)用運(yùn)行時(shí))的權(quán)威指南。該指南由模型的創(chuàng)建者親自撰寫(xiě),向你展示了Dapr是如何統(tǒng)一了無(wú)狀態(tài)、有狀態(tài),以及actor編程模型,而且能夠隨處運(yùn)行,無(wú)論是在云上還是在邊緣。
來(lái)自微軟Azure CTO團(tuán)隊(duì)的作者Haishi Bai和Yaron Schneider解釋說(shuō),你不需要在用戶(hù)代碼中包含任何SDK或者庫(kù)。相反,你自動(dòng)的獲得了靈活的綁定、狀態(tài)管理、actor模式、發(fā)布/訂閱、可靠消息,以及許多其他的功能。本書(shū)面向開(kāi)發(fā)人員、架構(gòu)師、CIO、學(xué)生,以及計(jì)算機(jī)愛(ài)好者等人群介紹了如何入門(mén)Dapr。
前言
2018 年秋,一個(gè)陰沉的下午,Boris Scholl、Yaron Schneider 和我(海石)在微軟位于雷德蒙德校園的一個(gè)小電話室,討論云應(yīng)用程序的開(kāi)發(fā)。當(dāng)時(shí),我們正在構(gòu)想一個(gè)與平臺(tái)無(wú)關(guān)的應(yīng)用程序模型,使開(kāi)發(fā)人員能獨(dú)立于特定平臺(tái)設(shè)計(jì)出分布式應(yīng)用程序的拓?fù)。這個(gè)想法終成為開(kāi)放應(yīng)用程序模型(https://oam.dev),該模型將應(yīng)用程序描述為在軟件定義的網(wǎng)格上相互連通的服務(wù)集合。
這個(gè)應(yīng)用程序模型并不關(guān)心每個(gè)服務(wù)是怎么編寫(xiě)的。當(dāng)時(shí),我認(rèn)為提出一個(gè)統(tǒng)一的編程模型太有野心了。因此,我們?cè)噲D嚴(yán)格定義一個(gè)將服務(wù)視為黑盒的應(yīng)用程序模型。然而,當(dāng)我們進(jìn)一步討論該想法時(shí),似乎遺漏了一些東西。突然,Yaron 跳到白板前開(kāi)始涂畫(huà)。通過(guò)他模糊的書(shū)寫(xiě),一個(gè)絕妙的主意浮出水面,他稱(chēng)之為Reaktive(帶有k 的Reactive,這反映了 Yaron 對(duì) Kubernetes的深厚感情)。 Reaktive 的核心思想很簡(jiǎn)單通過(guò)邊車(chē)容器或進(jìn)程將分布式系統(tǒng)構(gòu)件帶給用戶(hù)的代碼。我們將在簡(jiǎn)介部分解釋這個(gè)優(yōu)雅而強(qiáng)大的想法是如何將這一新穎的思想帶入分布式系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)中。現(xiàn)在,我們繼續(xù)故事的講述。
幾天后,Yaron 帶著原型回來(lái)了,我們都認(rèn)為這很厲害。 Reaktive 為用戶(hù)的代碼帶來(lái)了狀態(tài)管理、服務(wù)發(fā)現(xiàn)以及與可靠消息傳遞等功能,并且不會(huì)用任何 SDK 或庫(kù)來(lái)污染用戶(hù)代碼。它可以與任何編程語(yǔ)言一起使用(為了證明這一點(diǎn),Yaron 甚至在之后做了 COBOL 的示例),并且它非常輕量。
在接下來(lái)的幾周中,我們?nèi)齻(gè)人花了很多時(shí)間頭腦風(fēng)暴,添加或刪除我們認(rèn)為有意義或沒(méi)必要的功能,在微軟更大的技術(shù)場(chǎng)景下考量它,以及思考如何發(fā)布它。Boris 邀請(qǐng)了微軟和其他公司的架構(gòu)師和開(kāi)發(fā)人員來(lái)進(jìn)一步驗(yàn)證我們的想法,并獲得了早期反饋。總體而言,我們?nèi)齻(gè)人的方向似乎沒(méi)錯(cuò),因此我們將它介紹給了 Azure 的首席技術(shù)官 Mark Russinovich,他立刻喜歡上了我們的想法。他認(rèn)為這個(gè)編程模型有可能對(duì)框架設(shè)計(jì)和分布式應(yīng)用程序的開(kāi)發(fā)產(chǎn)生深遠(yuǎn)和普遍的影響這遠(yuǎn)超我們之前的想法。
后來(lái),Mark 提議我們將 Reaktive 改名為 Actions,即 Actor 和 Functions 的組合。該名稱(chēng)反映了新產(chǎn)品的核心價(jià)值主張:一個(gè)非侵入式編程模型,并且將無(wú)狀態(tài)服務(wù)、有狀態(tài)服務(wù)、函數(shù)和 actor 統(tǒng)一在一起。我們都喜歡這個(gè)名字,所以保留了它。
一年過(guò)去了,Actions 經(jīng)過(guò)了數(shù)月的開(kāi)發(fā)、大量的討論以及來(lái)自很多早期嘗試者的驗(yàn)證。終,它準(zhǔn)備好以新的名字 Dapr(https://dapr.io) 分布式應(yīng)用運(yùn)行時(shí)的縮寫(xiě),在佛羅里達(dá)州奧蘭多市的 Microsoft Ignite 主講臺(tái)上被公布于眾。這是微軟有史以來(lái)成功的開(kāi)源項(xiàng)目之一。在初的24 小時(shí)內(nèi),該項(xiàng)目收集了 1000 多個(gè) GitHub star,并且在短短幾天內(nèi)增速就超越了一些受歡迎的開(kāi)源項(xiàng)目(見(jiàn)圖1)。Star 的熱度持續(xù)了幾個(gè)星期,團(tuán)隊(duì)成員終于厭倦并停止了每隔幾個(gè)小時(shí)就去檢查一下的行為。
很快我們就疲于奔命,社區(qū)貢獻(xiàn)從四面八方涌來(lái):合作伙伴的、競(jìng)爭(zhēng)對(duì)手的、知名企業(yè)的,以及一些小公司的,每個(gè)人都在努力使 Dapr 變得更有用。這確實(shí)是開(kāi)源好的地方。
巧合的是,OReilly 的 Kathleen Carr 通過(guò) LinkedIn 聯(lián)系上了我,詢(xún)問(wèn)我是否有出書(shū)的想法。 我提出了寫(xiě)《Actions in Action》這本書(shū)的想法。 這是一個(gè)大膽的提議:寫(xiě)一些仍在醞釀中的東西。Kathleen 依然很喜歡這個(gè)主意。幾周后,我們簽署了一份合同,將這本介紹 Actions (現(xiàn)在叫 Dapr)的書(shū)籍帶給大家。
你正在閱讀本書(shū)的事實(shí)證明了冒險(xiǎn)是值得的。無(wú)論 Dapr 未來(lái)發(fā)生什么,你都在這里,我們也很高興你在這里。
資源
Dapr 主頁(yè) (https://dapr.io)。
Dapr 運(yùn)行時(shí)倉(cāng)庫(kù) (https://oreil.ly/SRqme)。
Dapr 文檔倉(cāng)庫(kù) (https://oreil.ly/MlQfS)。
Dapr 示例倉(cāng)庫(kù) (https://oreil.ly/7JBHH)。
Dapr 組件貢獻(xiàn)倉(cāng)庫(kù) (https://oreil.ly/lVk5V)。
本書(shū)使用的約定
本書(shū)采用了下列印刷規(guī)范。
斜體(Italic)
表示新的術(shù)語(yǔ)、URL、電子郵件地址、文件名和文件擴(kuò)展名。
固定寬度字體(Constant width)
用于程序清單,以及在段落中引用的程序元素,如變量或函數(shù)名、數(shù)據(jù)庫(kù)、數(shù)據(jù)類(lèi)型、環(huán)境變量、語(yǔ)句和關(guān)鍵字。
固定寬度加粗字體(Constant width bold)
顯示命令或其他應(yīng)由用戶(hù)按字面輸入的文本。也用于在代碼片段中強(qiáng)調(diào)。
固定寬度斜體(Constant width italic)
顯示應(yīng)該被替換為用戶(hù)提供的值或由上下文決定的值的文本。
OReilly 在線學(xué)習(xí)平臺(tái)(OReilly Online Learning)
近40 年來(lái),OReilly Media 致力于提供技術(shù)和商業(yè)培訓(xùn)、知識(shí)和卓越見(jiàn)解,來(lái)幫助眾多公司取得成功。
我們擁有獨(dú)一無(wú)二的專(zhuān)家和革新者組成的龐大網(wǎng)絡(luò),他們通過(guò)圖書(shū)、文章、會(huì)議和我們的在線學(xué)習(xí)平臺(tái)分享他們的知識(shí)和經(jīng)驗(yàn)。OReilly 的在線學(xué)習(xí)平臺(tái)允許你按需訪問(wèn)現(xiàn)場(chǎng)培訓(xùn)課程、深入的學(xué)習(xí)路徑、交互式編程環(huán)境,以及OReilly 和200 多家其他出版商提供的大量文本和視頻資源。有關(guān)的更多信息,請(qǐng)?jiān)L問(wèn)http://oreilly.com。
如何聯(lián)絡(luò)我們
請(qǐng)將有關(guān)本書(shū)的評(píng)論和問(wèn)題發(fā)送給出版商:
美國(guó):
OReilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國(guó):
北京市西城區(qū)西直門(mén)南大街2號(hào)成銘大廈C座807室(100035)
奧萊利技術(shù)咨詢(xún)(北京)有限公司
我們?yōu)檫@本書(shū)提供了一個(gè)網(wǎng)頁(yè),其中列出了勘誤表、示例以及所有其他信息。
你可以通過(guò)https://oreil.ly/Dapr 訪問(wèn)該頁(yè)面。
發(fā)送電子郵件到 bookquestions@oreilly.com 來(lái)評(píng)論或詢(xún)問(wèn)有關(guān)此書(shū)的技術(shù)問(wèn)題。
有關(guān)我們的書(shū)籍和課程的新聞和信息,請(qǐng)?jiān)L問(wè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 核心團(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ū)的技術(shù)審稿人。我們還要感謝我們的合作伙伴、早期試用者,以及為Dapr 做出了巨大貢獻(xiàn)的杰出社區(qū)成員。
Haishi Bai是一位經(jīng)驗(yàn)豐富的開(kāi)發(fā)人員和架構(gòu)師,擁有30多年的編程經(jīng)驗(yàn)。他作為Microsoft Azure CTO辦公室的成員領(lǐng)導(dǎo)了一系列云創(chuàng)新項(xiàng)目。同時(shí)他還是一位熱情的教育家,出版了八本云計(jì)算相關(guān)書(shū)籍。
Yaron Schneider是Microsoft Azure CTO團(tuán)隊(duì)的首席軟件工程師。他是一位狂熱的開(kāi)源倡導(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,云原生愛(ài)好者和實(shí)踐者。
李志信Apache Dubbo PMC,Dapr貢獻(xiàn)者,從事Go語(yǔ)言中間件研發(fā)和開(kāi)源工作。
目錄
前言 .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
語(yǔ)言支持 15
0.3 開(kāi)始使用 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 客戶(hù)端調(diào)用應(yīng)用程序 33
0.4.2 編寫(xiě) 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 名稱(chēng)解析. 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 編寫(xiě)自定義中間件 . 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 無(wú)狀態(tài)與有狀態(tài) . 87
2.1.2 為什么無(wú)狀態(tài)服務(wù)在云端更受歡迎? . 87
2.1.3 托管有狀態(tài)服務(wù)的挑戰(zhàn) 89
2.1.4 將有狀態(tài)服務(wù)轉(zhuǎn)換為無(wú)狀態(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ù)查詢(xún)和聚合 . 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 訪問(wèn)控制 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 開(kāi)始使用 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 的未來(lái) . 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 查詢(xún)接口 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)過(guò)驗(yàn)證的模式 223
7.5.3 Dapr 描述符 224
7.5.4 Dapr 對(duì)多方計(jì)算的促進(jìn) 225
7.6 小結(jié) . 225