乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时
Dapr是一個由微軟主導(dǎo)的云原生開源項目,國內(nèi)云計算巨頭阿里云也積極參與其中,2019年10月首次發(fā)布,到今年2月正式發(fā)布V1.0版本。在不到一年半的時間內(nèi),github star數(shù)達(dá)到了1.2萬,超過同期的kubernetes、istio、knative等,發(fā)展勢頭迅猛,業(yè)界關(guān)注度非常高。
什么是云原生
云原生技術(shù)有利于各組織在公有云、私有云和混合云等新型動態(tài)環(huán)境中,構(gòu)建和運(yùn)行可彈性擴(kuò)展的應(yīng)用。云原生的代表技術(shù)包括容器、服務(wù)網(wǎng)格、微服務(wù)、不可變基礎(chǔ)設(shè)施和聲明式API。
這些技術(shù)能夠構(gòu)建容錯性好、易于管理和便于觀察的松耦合系統(tǒng)。結(jié)合可靠的自動化手段,云原生技術(shù)使工程師能夠輕松地對系統(tǒng)作出頻繁和可預(yù)測的重大變更。
云原生計算基金會(CNCF)致力于培育和維護(hù)一個廠商中立的開源生態(tài)系統(tǒng),來推廣云原生技術(shù)。我們通過將最前沿的模式民主化,讓這些創(chuàng)新為大眾所用。
什么是Dapr
Dapr(Distributed Application Runtime)分布式應(yīng)用運(yùn)行時,是一個可移植的、事件驅(qū)動的運(yùn)行時,它使任何開發(fā)人員能夠輕松構(gòu)建出彈性的、無狀態(tài)和有狀態(tài)的應(yīng)用程序,并可運(yùn)行在云平臺或邊緣計算中,它同時也支持多種編程語言和開發(fā)框架。
Dapr 愿景
可移植,事件驅(qū)動,彈性,有狀態(tài)和無狀態(tài),云和邊端,語言無關(guān),框架無關(guān)。
Any language, Any framework, Anywhere
其核心是要提供一個有標(biāo)準(zhǔn),可配置,包含各種分布式能力的運(yùn)行時。
如今,我們正經(jīng)歷著上云浪潮。開發(fā)人員對Web+數(shù)據(jù)庫應(yīng)用結(jié)構(gòu)(例如經(jīng)典3層設(shè)計)非常熟悉,并且使用得手,但對本身能支持分布式的微服務(wù)應(yīng)用結(jié)構(gòu)卻感覺陌生。成為分布式系統(tǒng)專家很難,并且你也不需要這么做。開發(fā)人員希望專注于業(yè)務(wù)邏輯,同時希望平臺為其提供可伸縮的、彈性的、可維護(hù)性和云原生架構(gòu)的其他功能。
這就是Dapr所要解決的。Dapr將構(gòu)建微服務(wù)應(yīng)用的最佳實踐設(shè)計成開放、獨立和模塊化的方式,讓你能夠選擇的任意開發(fā)語言和框架構(gòu)建可移植應(yīng)用程序。每個構(gòu)建塊都是完全獨立的,您可以采用其中一個或多個或全部來構(gòu)建你的應(yīng)用。
此外,Dapr是和平臺無關(guān)的,這意味著您可以在本地、Kubernetes群集或者其它集成Dapr的托管環(huán)境中運(yùn)行應(yīng)用程序。這使得您能夠在云平臺和邊緣計算中運(yùn)行微服務(wù)應(yīng)用。
使用Dapr,您可以使用任何語言、任何框架輕松構(gòu)建微服務(wù)應(yīng)用,并運(yùn)行在任何地方。
Dapr 發(fā)展歷程
2019年10月:微軟在GitHub上開源了Dapr,發(fā)布0.1.0版本
2021年2月:Daprv1.0版本發(fā)布
阿里巴巴深度參與Dapr項目,不僅僅以終端用戶的身份成為Dapr的早期采用者,也通過全面參與Dapr的開源開發(fā)和代碼貢獻(xiàn)成為目前Dapr項目中的主要貢獻(xiàn)公司之一,僅次于微軟:
2020年中:阿里巴巴開始參與Dapr項目,在內(nèi)部試用功能并進(jìn)行代碼開發(fā)
2020年底:阿里巴巴內(nèi)部小規(guī)模試點Dapr,目前已經(jīng)十幾個應(yīng)用在使用Dapr。
Dapr 引領(lǐng)云原生的未來
分布式應(yīng)用所需:
生命周期:包括部署,健康檢查,水平擴(kuò)展,配置管理等,目前這些需求的最佳實踐,都陸續(xù)在kubernetes上有了落地。
網(wǎng)絡(luò):網(wǎng)絡(luò)方面的需求是service Mesh的主戰(zhàn)場,比如istio可以滿足這里絕大部分需求,除了pub/sub。
狀態(tài):包括數(shù)據(jù)的讀寫,狀態(tài)其實是非常難以管理的,涉及冪等,緩存,數(shù)據(jù)流等等。
綁定:主要是指和系統(tǒng)外部資源的交互。
Multi runtime是由RedHat首席架構(gòu)師Bilgin Ibryam提出的,實際上multi runtime和dapr并沒有直接的關(guān)系,multi runtime的提出是在dapr開源之后。作者的文章重點對當(dāng)今分布式應(yīng)用的需求做了歸類,并且分析了當(dāng)前流行的云原生項目是如何滿足這些分布式需求,包括kubernetes,istio,dapr等,最后,作者對分布式應(yīng)用和中間件的未來發(fā)展,做了推導(dǎo)和預(yù)測,這就是multiruntime。
過去,我們對云原生的全景:
有了Dapr之后,我們對云原生的全景:
應(yīng)用的期望就是中間件的方向:
應(yīng)用可以使用任意喜愛而適合的語言編寫,可以快速開發(fā)和快速迭代。
應(yīng)用需要的能力都可以通過標(biāo)準(zhǔn)的API提供,無需關(guān)心底層具體實現(xiàn)。
應(yīng)用可以部署到任意的云端,不管是公有云、私有云還是混合云,沒有平臺和廠商限制,無需代碼改造。
應(yīng)用可以根據(jù)流量彈性伸縮,頂住波峰的壓力,也能在空閑時釋放資源。
Service Mesh探索了Sidecar模式,Dapr將Sidecar模式推廣到更大的領(lǐng)域:
完善的多語言支持和應(yīng)用輕量化的需求推動中間件將更多的能力從應(yīng)用中分離出來
Sidecar模式會推廣到更大的領(lǐng)域,越來越多的中間件產(chǎn)品會開始Mesh化,整合到Runtime。
對廠商鎖定的天然厭惡和規(guī)避,會加劇對可移植性的追求,從而進(jìn)一步促使為下沉到Runtime中的分布式能力提供標(biāo)準(zhǔn)而業(yè)界通用的API。
API的標(biāo)準(zhǔn)化和社區(qū)認(rèn)可,將成為Runtime普及的最大挑戰(zhàn),但同時也將推動各種中間件產(chǎn)品改進(jìn)自身實現(xiàn),實現(xiàn)中間件產(chǎn)品和社區(qū)標(biāo)準(zhǔn)API之間的磨合與完善。
預(yù)測未來:
Dapr 與Istio、Linkerd或OSM等服務(wù)網(wǎng)格相比如何?
Dapr不是一個服務(wù)網(wǎng)格。雖然服務(wù)網(wǎng)側(cè)重于細(xì)粒度網(wǎng)絡(luò)控制,但Dapr專注于幫助開發(fā)人員構(gòu)建分布式應(yīng)用程序。Dapr和服務(wù)網(wǎng)都使用sidecar模式,并隨應(yīng)用程序一起運(yùn)行,它們確實具有一些重疊的功能,但也提供獨特的優(yōu)勢。
雖然Dapr和服務(wù)網(wǎng)格確實提供了一些重疊功能,但dapr不是服務(wù)網(wǎng)格,其中服務(wù)網(wǎng)格被定義為網(wǎng)絡(luò)的服務(wù)網(wǎng)格。與專注于網(wǎng)絡(luò)問題的服務(wù)網(wǎng)格不同,Dapr專注于提供構(gòu)建基塊,使開發(fā)人員更容易將應(yīng)用程序構(gòu)建為微服務(wù)。Dapr以開發(fā)人員為中心,而服務(wù)網(wǎng)格以基礎(chǔ)設(shè)施為中心。
在大多數(shù)情況下,開發(fā)人員不需要意識到他們正在構(gòu)建的應(yīng)用程序?qū)⒉渴鹪诎ǚ?wù)網(wǎng)格在內(nèi)的環(huán)境中,因為服務(wù)網(wǎng)格會攔截網(wǎng)絡(luò)流量。服務(wù)網(wǎng)格主要由系統(tǒng)操作員管理和部署。但是,Dapr構(gòu)建塊API旨在供開發(fā)人員在其代碼中明確使用。
Dapr與服務(wù)網(wǎng)格共享的一些常見功能包括:
使用mTLS加密實現(xiàn)安全的服務(wù)到服務(wù)通信
服務(wù)到服務(wù)指標(biāo)集合
服務(wù)到服務(wù)分布式跟蹤
通過重試獲得可恢復(fù)能力
重要的是,Dapr通過以開發(fā)人員為中心的關(guān)注點提供服務(wù)發(fā)現(xiàn)和調(diào)用。這意味著,通過Dapr的服務(wù)調(diào)用API,開發(fā)人員在服務(wù)名稱上調(diào)用一種方法,而服務(wù)網(wǎng)格則處理網(wǎng)絡(luò)概念,如IP和DNS地址。但是,Dapr不為路由或流量拆分等流量行為提供功能。流量路由通常使用應(yīng)用程序的入口代理處理,并且不必使用服務(wù)網(wǎng)格。此外,Dapr還為狀態(tài)管理、發(fā)布/訂閱、Actor等提供了其他應(yīng)用級別的構(gòu)建塊。
Dapr和服務(wù)網(wǎng)之間的另一個區(qū)別是可觀察性(跟蹤和指標(biāo))。服務(wù)網(wǎng)格在網(wǎng)絡(luò)級別運(yùn)行,并跟蹤服務(wù)之間的網(wǎng)絡(luò)調(diào)用。Dapr通過服務(wù)調(diào)用來達(dá)到此操作,但Dapr也使用寫入Cloud Events信封的跟蹤Id在發(fā)布/訂閱調(diào)用上提供可觀察性(跟蹤和指標(biāo))。這意味著Dapr的指標(biāo)和跟蹤比使用服務(wù)到服務(wù)調(diào)用和發(fā)布/訂閱進(jìn)行通信的應(yīng)用程序的服務(wù)網(wǎng)格更為廣泛。
下圖捕獲Dapr和服務(wù)網(wǎng)格提供的重疊功能和獨特功能:
Dapr 三駕馬車
Dapr的設(shè)計是典型的分層架構(gòu),其核心理念,是利用抽象層來實現(xiàn)應(yīng)用關(guān)注點的分離,用以降低分布式應(yīng)用的復(fù)雜性。
在Dapr的架構(gòu)中,核心的三個組成部分:API,Building Blocks和Components。
Dapr API
Dapr提供兩種API,HTTP1.1/REST和HTTP2/gRPC,兩者在功能上是對等的。
應(yīng)用如何能使用到這些分布式能力,這是Dapr最核心的設(shè)計,也是dapr應(yīng)用和非dapr應(yīng)用最關(guān)鍵的區(qū)別: dapr利用標(biāo)準(zhǔn)API暴露各種分布式能力。API定義了應(yīng)用所需的分布式能力。dapr提供兩種API:?HTTP1.1/REST和HTTP2/gRPC,兩者在功能上是等價的。這些API是平臺無關(guān)的,或者說是實現(xiàn)無關(guān)的,這是dapr能否流行的一個關(guān)鍵。
應(yīng)用只需要按照API規(guī)范發(fā)起,不管是服務(wù)訪問,還是存儲,還是發(fā)布消息到隊列里,都是HTTP接口。不管是操作redis還是mysql都是一樣的API。在應(yīng)用看來,一切所需的能力,都可以用HTTP協(xié)議來表示,這些能力的獲取是標(biāo)準(zhǔn)化的,只要應(yīng)用需要的分布式能力不變,那應(yīng)用的代碼就不需要改變。
將「分布式原語」映射到HttpAPI上,極大地減少了程序員心智的開銷。在應(yīng)用代碼中不再需要引入相關(guān)的組件調(diào)用庫,不需要去封裝組件的具體調(diào)用方式,不需要對不同的實現(xiàn)做區(qū)分。
另外在用戶應(yīng)用側(cè),dapr還提供了多種語言的SDK,這些SDK的目的是用更便捷的方式來暴露buildingBlocks的API,用更加語義化的方法調(diào)用,來封裝Http/gRPC的調(diào)用。
Dapr Building Blocks(構(gòu)建塊)
翻譯為構(gòu)建塊,這是Dapr對外提供能力的基本單元,每個構(gòu)建塊對外提供一種分布式能力。
Dapr對外提供能力的基本單元,是對分布式能力的抽象和歸類,包括以下幾大類:
service-to-service invocation
State management
Publish and subscribe
Resource bindings
Actors
Observability
Secrets
Dapr目前已有的構(gòu)建塊和他們提供的能力的簡單描述:
Building Block構(gòu)建塊是可以從您的代碼中調(diào)用的HTTP或gRPC API,并且由一個或多個Dapr組件組成。
構(gòu)建塊解決了構(gòu)建彈性微服務(wù)應(yīng)用程序中的常見挑戰(zhàn),并編纂了最佳實踐和模式。Dapr由一組構(gòu)建塊組成,并且具有可擴(kuò)展性以添加新的構(gòu)建塊。
下圖顯示了構(gòu)建塊如何公開了可被代碼調(diào)用的公共API,并使用組件來實現(xiàn)構(gòu)建塊的能力。
以下是Dapr提供的構(gòu)建塊類型:
每個構(gòu)建塊都是獨立的,這意味著您可以采用其中一個或多個或全部來構(gòu)建應(yīng)用。在當(dāng)前Dapr的初始版本中,提供了以下構(gòu)建塊:
| 服務(wù)間調(diào)用 | 彈性的服務(wù)間調(diào)用能在遠(yuǎn)程服務(wù)上進(jìn)行方法調(diào)用(包括檢索),無論它們是否位于受支持的托管環(huán)境中的。 |
| 狀態(tài)管理 | 對于存儲鍵/值對的狀態(tài)管理,長時間運(yùn)行,高可用性,有狀態(tài)服務(wù)可輕松寫入應(yīng)用程序中的無狀態(tài)服務(wù)。狀態(tài)存儲是可插拔的,可以包括Azure Cosmos DB,Azure SQL Server,Postgre SQL,AWS Dynamo DB或Redis等。 |
| 發(fā)布訂閱 | 發(fā)布活動并訂閱主題 |
| 資源綁定 | 帶觸發(fā)器的資源綁定通過接收和發(fā)送事件到任何外部源(如數(shù)據(jù)庫、隊列、文件系統(tǒng)等)來進(jìn)一步構(gòu)建事件驅(qū)動架構(gòu),以實現(xiàn)擴(kuò)展性和彈性。 |
| Actors | 一種用于有狀態(tài)和無狀態(tài)對象的模式,通過方法和狀態(tài)的封裝讓并發(fā)變得簡單。Dapr在其actor運(yùn)行時提供了很多能力,包括并發(fā),狀態(tài)管理,用于actor激活/停用的生命周期管理,以及喚醒a(bǔ)ctor的計時器和提醒器。 |
| 可觀測性 | Dapr可以發(fā)出度量,日志和跟蹤以調(diào)試和監(jiān)控Dapr和用戶應(yīng)用程序。Dapr支持分布式跟蹤,通過使用W3C跟蹤上下文標(biāo)準(zhǔn)和OpenTelemetry發(fā)送到不同的監(jiān)控工具,以方便診斷和服務(wù)于生產(chǎn)中的服務(wù)間調(diào)用。 |
| 秘密 | Dapr提供秘密管理,并與公有云和本地秘密存儲集成,以檢索秘密,用于應(yīng)用代碼。 |
Dapr Components(組件)
組件層,這是Dapr的能力實現(xiàn)層,每個組件都會實現(xiàn)特定構(gòu)建塊的能力。
Components提供和各種分布式實現(xiàn)的對接,包括自建的,云上的,邊緣等等。
理論上building block可以組合使用任意的components,一個component也可以被不同的building block使用。比如actor和state都會使用state component;另一個例子,service invocation會使用namere solution和middleware component,而且不同的場景下,可以選擇不同的component實現(xiàn)。
Component類型和實現(xiàn):在實現(xiàn)層面,每一種component類型定義了一系列接口(interface definition),每一種component類型有多種component實現(xiàn),他們都實現(xiàn)了component類型要求的接口(interface)。
三駕馬車的關(guān)系
Dapr Building Blocks提供“能力”
Dapr API提供對分布式能力的“抽象”,對外暴露Building Block的能力
Dapr Components是Building Block能力的具體“實現(xiàn)”
Dapr API如何實現(xiàn)
比如一個電商系統(tǒng),需要持久化存儲,傳統(tǒng)的做法是,我們要先決策使用什么存儲,mysql或者redis等,我們需要在代碼里引入相應(yīng)的SDK,編寫各異的實現(xiàn),未來如果應(yīng)用想要切換存儲類型,或者從本地存儲遷移到云上,改動非常大。
假設(shè)這個系統(tǒng)的特征是讀多寫少,那我們傾向于用樂觀鎖來更新數(shù)據(jù)。業(yè)務(wù)提出來的「用樂觀鎖控制并發(fā)寫入」這就是一個典型的分布式需求,而這種需求的實現(xiàn)在不同的存儲系統(tǒng)中不盡相同,比如mysql是需要用戶顯式指定一個字段作為版本信息,用戶寫操作是需要把版本信息傳回服務(wù)器,而redis樂觀鎖需要用戶指定在redis server端watch某個key。類似的需求還有數(shù)據(jù)庫一致性,是使用最終一致性還是強(qiáng)一致性,各種存儲實現(xiàn)也不同。
如上圖所示,如果接入使用dapr runtime,應(yīng)用發(fā)起存儲調(diào)用非常簡單,不需要在應(yīng)用代碼里引入redis或者mysql的SDK,也不用關(guān)心實際存儲使用是什么通信協(xié)議,應(yīng)用代碼里只需要使用分布式原語和dapr runtime通信,通信的協(xié)議是簡單的Http或者gRPC,dapr runtime去實現(xiàn)這些分布式能力。
Dapr 服務(wù)發(fā)現(xiàn)(Service Invocation)
主要能力:
服務(wù)發(fā)現(xiàn)
通信安全
失敗重試
可觀測性
在kubernetes中使用dapr,dapr會為每個服務(wù)生成一個新的service(以-dapr結(jié)尾),sidecar之間的通信都是gRPC,每個應(yīng)用需要指定一個app-id用于服務(wù)發(fā)現(xiàn),應(yīng)用需要顯示的發(fā)起對runtimeAPI的調(diào)用,沒有類似mesh的iptables透明攔截。
大家可以腦洞一下,如果dapr這種模式能大規(guī)模流行,那市面上大部分RPC是不是都不再需要了,如今大部分RPC雖然各有專長,但是大部分功能都是類似的,服務(wù)發(fā)現(xiàn)、編解碼、網(wǎng)絡(luò)傳輸,有的RPC框架還帶服務(wù)治理的能力。大部分能力目前都可以由mesh或者dapr這類runtime來提供,這也是一個明顯的趨勢。
Dapr 狀態(tài)管理(State Management)
主要能力:
CRUD,包括批量操作
事務(wù)
并發(fā):
first-write-wins、last-write-wins
一致性:
最終一致、強(qiáng)一致性
可插拔(Pluggablestatestores)
State提供一致的鍵值對存儲抽象,這里不包括關(guān)系型或者其他類型的存儲。總的來說,在云原生領(lǐng)域(以kubernetes和etcd為代表),鍵值對存儲的適用范圍更廣。另外相比其他存儲類型,鍵值對存儲引擎的接口抽象更容易實現(xiàn),即使是關(guān)系型數(shù)據(jù)庫,也能輕松的實現(xiàn)對鍵值對API的支持。
但仍然不是所有的存儲引擎都能提供等價的鍵值對存儲能力。為了保證應(yīng)用程序的可移植性,這里的確是需要一些適配工作。比如像Memcached,Cassandra這些是不支持事務(wù)的,而很多數(shù)據(jù)庫也不能提供基于ETag的樂觀鎖能力。
對于并發(fā)控制,在API層,Dapr利用HTTP ETags來實現(xiàn)并發(fā)控制,類似kubernetes對象的resource version,具體地:Dapr在返回數(shù)據(jù)時,會帶上Etag屬性。如果用戶需要使用樂觀鎖做更新操作,請求中需要帶回Etag,只有當(dāng)Etag和服務(wù)器上數(shù)據(jù)的相同時,更新操作才會成功。如果更新操作沒有帶上Etag,那并發(fā)模式將是last-write-wins。
Dapr 發(fā)布和訂閱(Publish And Subscribe)
使用發(fā)布和訂閱模式,微服務(wù)間可以充分的解耦。
主要能力:
統(tǒng)一的消息格式:
CloudEvents
At-Least-Onceguarantees(消息絕不會丟,但可能會重復(fù)傳遞)
支持消息過期時間(permessageTTL)
支持topic可見性配置
Runtime不僅可以做能力的對接適配,還可以做增強(qiáng),這是一個例子:如果消息組件原生支持消息有效期,那Runtime直接轉(zhuǎn)發(fā)TTL相關(guān)操作,過期的行為由組件直接控制,而對于那些不支持消息有效期的組件,Dapr會在Runtime中補(bǔ)齊相關(guān)的過期功能。(Cloud Event里有Expiration)
Dapr 綁定(Bindings)
Bindings其實和之前的pub/sub非常類似,也是利用異步通信傳遞消息。它倆主要的區(qū)別是:pub/sub主要面向的是dapr內(nèi)部應(yīng)用,而bindings主要解決的和外部依賴系統(tǒng)的輸入輸出。
實際上它倆下層的components有很多是重疊的,比如說kafka,redis既可以作為內(nèi)部消息傳遞,也可以作為外部消息傳遞。pub/sub基本可以等同于消息隊列,但bindings主要是處理事件(trigger handler),比如twitter關(guān)鍵字事件,比如github webhooks等。
Dapr 并發(fā)模型(Actor)
最基本的計算單元,封裝了可以執(zhí)行的行為和私有狀態(tài)
通過信箱異步通信
內(nèi)部單線程
虛擬的:不需要顯示創(chuàng)建,自動GC
Actor是一種并發(fā)編程的模型,Actor表示的是一個最基本的計算單元,封裝了可以執(zhí)行的行為和私有狀態(tài)。actor之間相互隔離,它們并不互相共享內(nèi)存,也就是說,一個actor能維持一個私有的狀態(tài),并且這個狀態(tài)不可能被另一個actor所改變。在actor模型里每個actor都有地址(信箱),所以它們才能夠相互發(fā)送消息。每個actor只能順序地處理消息。單個actor不考慮并發(fā)。
Dapr中actor是虛擬的,它們并不一定要常駐內(nèi)存。它們不需要顯式創(chuàng)建或銷毀。dapr actor runtime在第一次接收到該actor ID的請求時自動激活actor。如果該actor在一段時間內(nèi)未被使用,那么runtime將回收內(nèi)存對象。如果以后需要重新啟動,它還將還原actor的一切原有數(shù)據(jù)。
Actor placement service為系統(tǒng)提供了actor分發(fā)和管理,placement會跟蹤actor類型和所有實例的分區(qū),并將這些分區(qū)信息同步到每個dapr實例中,并跟蹤他們的創(chuàng)建和銷毀。
Dapr 中間件原則(Middleware Pipelines)
注意middleware pipelines是一個component類型,而不是building block。
Dapr官方提供流量管控的能力比較弱,和istio相比的話,目前dapr只有重試,加密等少數(shù)的管控能力,但dapr提供一個擴(kuò)展的方式:這就是middleware pipelines,用戶可以按需編寫不同的實現(xiàn),并把他們級聯(lián)起來使用。
其實這種方式在各種編程語言web框架中非常常見,只是叫法不同,有的叫裝飾者模型,有的叫洋蔥模型,其實模式都是一樣:請求在路由到用戶代碼之前,會先按序執(zhí)行middleware pipelines,請求經(jīng)過應(yīng)用處理后,再按相反順序執(zhí)行上述middleware pipeline。通常在前序中對request做相應(yīng)的增強(qiáng)處理,在后續(xù)中對response做增強(qiáng)處理。
咋一看這可能是一個不太起眼的功能,但和傳統(tǒng)web框架的middleware不一樣,dapr runtime本身是在應(yīng)用進(jìn)程之外,所以不存在語言限制的問題。這使得middleware提供的功能可以跨語言共享。比如dapr原生沒有提供限流和自定義鑒權(quán)的功能(呼聲很高的2個場景),我們可以遵循middleware的接口按需實現(xiàn),然后植入dapr運(yùn)行時中。
Dapr 部署模式(托管方式)
Dapr可以托管在多種環(huán)境中,包括用于本地開發(fā)的自托管,或部署到一組VM、Kubernetes和邊緣環(huán)境(如Azure IoT Edge)。
Dapr使用sidecar模式來暴露building blocks的能力,這里的sidecar除了包括sidecar container外,還可以是sidecar process。
在非容器化環(huán)境中,用戶應(yīng)用和dapr runtime都是獨立的進(jìn)程;而在kubernetes這種容器化環(huán)境中,dapr runtime作為sidecar container注入到業(yè)務(wù)pod中,這和service mesh sidecar模式是一致的。
自托管
在自托管模式下,Dapr作為單獨的sidecar進(jìn)程運(yùn)行,服務(wù)代碼可以通過HTTP或gRPC調(diào)用該進(jìn)程。在自托管模式下,您還可以將Dapr部署到一組VM上。
Dapr可以配置為在開發(fā)人員本地計算機(jī)上以自托管模式運(yùn)行。每個運(yùn)行的服務(wù)都有一個Dapr運(yùn)行時進(jìn)程(或sidecar),配置為使用狀態(tài)存儲,pub/sub,綁定組件和其他構(gòu)建塊。
您可以使用Dapr CLI在本地機(jī)器上運(yùn)行啟用了Dapr的應(yīng)用程序。
Kubernetes托管
在容器托管環(huán)境(如Kubernetes)中,Dapr作為sidecar容器運(yùn)行,和應(yīng)用程序容器在同一個pod中。
Dapr可以配置為在任何Kubernetes集群上運(yùn)行。在Kubernetes中,dapr-sidecar-injector和dapr-operator服務(wù)提供一流的集成,以將Dapr作為sidecar容器啟動在與服務(wù)容器相同的pod中,并為在集群中部署的Dapr組件提供更新通知。
dapr-sentry服務(wù)是一個認(rèn)證中心,它允許Dapr sidecar實例之間的相互TLS進(jìn)行安全數(shù)據(jù)加密。
Dapr 儀表盤(控制面板)
整個控制面還是一個微服務(wù)。和istio早期有點類似。
Sidecarinjector:利用kubernetes mutating webhook給業(yè)務(wù)pod注入dapr runtime sidecar容器,以及運(yùn)行所需的環(huán)境變量,啟動參數(shù)等。包括連接控制面operator的地址(control-plane-address)等。
Operator:會list watch用戶定義的Component資源,并下發(fā)給數(shù)據(jù)面的dapr runtime。數(shù)據(jù)面runtime會持有一個Operator Client去連接控制面Operator。
Sentry: 為dapr系統(tǒng)中的工作負(fù)載提供基于mtls的安全通信。mtls能強(qiáng)制通信雙方進(jìn)行身份認(rèn)證,同時在認(rèn)證之后保證通信都走加密通道。Sentry的功能很類似istio里的Citadel(目前已經(jīng)合并到istiod)。在整個過程中,sentry充當(dāng)證書頒發(fā)機(jī)構(gòu)(CA),處理dapr sidecar發(fā)起的簽署證書請求,另外還要負(fù)責(zé)證書的輪轉(zhuǎn)。除了dapr sidecar之間的自動mTLS之外,sidecar和dapr控制面服務(wù)之間也是強(qiáng)制性的mTLS。
Placement:用于跟蹤actor的類型和實例分布,并同步給數(shù)據(jù)面的runtime。
Dapr Dashboard
Dapr Dashboard是一個WebUI,可幫助您可視化本地計算機(jī)或Kubernetes上運(yùn)行的Dapr實例的信息。
Dapr 性能
sidecar模式會帶來額外的性能開銷。以我們使用service mesh的經(jīng)驗來看,這種模式的性能開銷主要是2個方面,一個是流量經(jīng)過sidecar的攔截、流量管控和轉(zhuǎn)發(fā)損耗,另一個是sidecar需要從控制面同步管理數(shù)據(jù),sidecar需要存儲和處理這些數(shù)據(jù),這可能會給數(shù)據(jù)面內(nèi)存和CPU帶來壓力,特別是大規(guī)模場景下。
在官方對daprV1.0的性能測試數(shù)據(jù)看:在不開啟mtls和遙測的情況下,延遲P90大概增加1.4ms,在開啟mtls和0.1 tracingrate情況下,P90數(shù)據(jù)大概還會增加了3ms左右。
這個數(shù)據(jù)要比istio好,dapr sidecar沒有太多的流量管控和修改的功能,也沒有使用iptables攔截,開銷相對較小。為了盡可能提高通信效率,dapr sidecar之間的通信固定使用gRPC協(xié)議。而且dapr從數(shù)據(jù)面同步的數(shù)據(jù)量也非常少,所以也不會有類似istio場景下頻繁reload xDS的問題。
但相比service mesh,dapr sidecar管控了更多的流量類型,比如狀態(tài)存儲,應(yīng)用系統(tǒng)對這類流量的延遲變化更加敏感,用戶在接入dapr之前需要慎重評估。
Dapr 開發(fā)工具支持
DotNet Core SDK
雖然Dapr獨立于任何編程語言,但它可以輕松地集成到具有特定語言的SDK應(yīng)用程序中。隨著我們看到越來越多的開發(fā)人員使用Dapr,我們對這些SDK的投資已增加,以幫助簡化Dapr集成。Dapr為Java、Python、PHP、.NET、Go以及最近添加的Rust和C++提供SDK。此外,根據(jù)社區(qū)反饋,Java SDK中增加了許多改進(jìn),包括虛擬角色、鍵入類和與Spring Boot Web框架的集成。對于.NET,還改進(jìn)了類型類別,并與ASP.NET核心Web框架集成。作為未來路線圖的一部分,計劃為其他SDK提供類似的支持。
Dapr SDK for .NET
dapr.io by Nuget
Visual Studio Code擴(kuò)展
能夠在沒有任何云依賴的情況下開發(fā)本地機(jī)器上的應(yīng)用程序,這對生產(chǎn)力和成本非常重要,也是Dapr的關(guān)鍵目標(biāo)。Dapr視覺工作室代碼(VS代碼)預(yù)覽擴(kuò)展可幫助開發(fā)人員使用Dapr調(diào)試應(yīng)用程序,與Dapr運(yùn)行時間進(jìn)行交互,并與DaprCLI合并。
Dapr for Visual Studio Code
Dapr 入門教程(阿里知行動手實驗室)
十分鐘快速領(lǐng)略開源分布式運(yùn)行時Dapr應(yīng)用的開發(fā)、部署過程
https://start.aliyun.com/course?id=gImrX5Aj
參考
https://dapr.io/
https://cloudevents.io/
Announcing Dapr v1.0
云原生社區(qū) Dapr 特別興趣小組
The Cloud Native Computing Foundation (CNCF)
CNCF Cloud Native Definition v1.0
分布式應(yīng)用程序運(yùn)行時介紹
Dapr微服務(wù)應(yīng)用開發(fā)系列0:概述
Software Architecture and Design InfoQ Trends Report—April 2020
構(gòu)建塊
https://github.com/dapr/dashboard
Dapr for Visual Studio Code (Preview)
Dapr | 云原生的抽象與實現(xiàn)
一年增加1.2w星,Dapr能否引領(lǐng)云原生中間件的未來?
自發(fā)布以來,分布式應(yīng)用程序運(yùn)行時間 (Dapr) 是如何增長的
https://www.algolia.com/ref/docsearch/
Hugo
Docsy
Dapr 入門教程
Multi-Runtime Microservices Architecture
Multi-Runtime Microservices Architecture
相關(guān)文章:
Dapr能否引領(lǐng)云原生中間件的未來?
云原生 | 阿里巴巴的Dapr實踐與探索
Dapr | 云原生的抽象與實現(xiàn)
Dapr 可視化指南
Dapr 知多少 | 分布式應(yīng)用運(yùn)行時
Dapr 正式發(fā)布 1.0
Dapr 交通流量控制示例
Dapr是如何簡化微服務(wù)的開發(fā)和部署
微軟開源微服務(wù)運(yùn)行時Dapr,賦能云原生應(yīng)用開發(fā)
YARP實現(xiàn)Dapr服務(wù)調(diào)用的反向代理
Dapr微服務(wù)應(yīng)用開發(fā)系列0:概述
Dapr微服務(wù)應(yīng)用開發(fā)系列1:環(huán)境配置
Dapr微服務(wù)應(yīng)用開發(fā)系列2:Hello World與SDK初接觸
Dapr微服務(wù)應(yīng)用開發(fā)系列3:服務(wù)調(diào)用構(gòu)件塊
Dapr微服務(wù)應(yīng)用開發(fā)系列4:狀態(tài)管理構(gòu)件塊
Dapr微服務(wù)應(yīng)用開發(fā)系列5:發(fā)布訂閱構(gòu)建塊
Windows環(huán)境下Dapr入門
云原生 | .NET 5 with Dapr 初體驗
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(二)——通訊框架講解
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(三)——一步一步教你如何擼Dapr
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(四)——一步一步教你如何擼Dapr之訂閱發(fā)布
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(五)——一步一步教你如何擼Dapr之狀態(tài)管理
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(六)——一步一步教你如何擼Dapr之Actor服務(wù)
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(七)——一步一步教你如何擼Dapr之服務(wù)限流
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(八)——一步一步教你如何擼Dapr之鏈路追蹤
WebAssembly + Dapr = 下一代云原生運(yùn)行時?
dapr 應(yīng)用開發(fā) | 環(huán)境配置
總結(jié)
以上是生活随笔為你收集整理的乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mini api
- 下一篇: Visual Studio 2022这些