使用 Dapr 缩短软件开发周期,提高生产效率
Microsoft DevOps 文檔里的文章(https://docs.microsoft.com/zh-cn/azure/devops/report/dashboards/cycle-time-and-lead-time?view=azure-devops)中的這張圖片在給我們介紹了?什么是周期時(shí)間?以及它如何影響我的項(xiàng)目流時(shí)非常有影響力。
第一次輸入 "正在進(jìn)行" 或 "已解決" 狀態(tài)類別到輸入 "已完成" 狀態(tài)類別,計(jì)算周期時(shí)間。當(dāng)開(kāi)發(fā)人員編寫代碼時(shí),能夠快速驗(yàn)證更改并進(jìn)行修訂對(duì)于保持較短的周期時(shí)間至關(guān)重要。
豐田生產(chǎn)方式之父大野耐一曾經(jīng)說(shuō)過(guò):我們唯一要做的就是降低從接到訂單到交付產(chǎn)品給客戶的周期時(shí)間。周期時(shí)間的降低可以有效保證軟件的按時(shí)交付 。所以周期時(shí)間是軟件交付的核心目標(biāo)。
特別是微服務(wù)的設(shè)計(jì)和開(kāi)發(fā),通常需要達(dá)成下列4個(gè)目標(biāo):
構(gòu)建的API 驅(qū)動(dòng)設(shè)計(jì)的微服務(wù)
一切都可以在本地構(gòu)建、測(cè)試和運(yùn)行,而無(wú)需復(fù)雜的設(shè)置。
云端和本地依賴關(guān)系的等效性
設(shè)備環(huán)境無(wú)關(guān),可以自由在Windows,Linux,Mac 之間切換。
我們借助于Dapr 可以非常容易的達(dá)成以上4個(gè)目標(biāo), 使用 Docker Compose 和 Dapr 技巧進(jìn)行本地開(kāi)發(fā),測(cè)試和生產(chǎn)環(huán)境運(yùn)行于Kubernetes, Kubernetes現(xiàn)在是各大云廠的標(biāo)配服務(wù)。借助于Dapr 的語(yǔ)言無(wú)關(guān)性,平臺(tái)無(wú)關(guān)性,我們可以在環(huán)境上盡量的縮短了時(shí)間,保持較短的周期時(shí)間交付軟件。
我們可以在大腦里面來(lái)回顧一下我們的開(kāi)發(fā)過(guò)程,對(duì)于每個(gè)任務(wù)/代碼更改:
開(kāi)發(fā)人員會(huì)將更改部署到生產(chǎn)環(huán)境
如果發(fā)現(xiàn)任何錯(cuò)誤,請(qǐng)重新部署舊 鏡像
在本地修復(fù)所有更改
推動(dòng)其分支以生成可部署的內(nèi)部版本,然后返回到 (1)
只有當(dāng)開(kāi)發(fā)人員脫離這個(gè)循環(huán)時(shí),他們才能將他們的代碼簽入主程序。這個(gè)過(guò)程太瘋狂了!僅第 4 步在鏡像創(chuàng)建和部署之間就花費(fèi)了大約 20 分鐘。兩三個(gè)遺漏的錯(cuò)誤可能會(huì)使開(kāi)發(fā)人員在一天中花掉大約1個(gè)小時(shí),并且考慮到除了日常工作之外,我們都在從事這項(xiàng)工作,這扼殺了生產(chǎn)力。還有可能要考慮到部署對(duì)依賴項(xiàng)的更改所需的周期,此處的部署花費(fèi)了更長(zhǎng)的時(shí)間。
下面我們從 提高軟件開(kāi)發(fā)生產(chǎn)力角度來(lái)聊聊,Dapr所提供的主要生產(chǎn)力提高優(yōu)勢(shì)是:
減少技術(shù)債務(wù)?- 通過(guò)生產(chǎn)和使用軟件來(lái)實(shí)現(xiàn),該軟件封裝了具有高變化率的領(lǐng)域,具有出色的關(guān)注點(diǎn)分離性,并具有廣泛的解耦。
減少所需的編碼工作量?— 通過(guò)使用"低代碼"方法實(shí)現(xiàn),方法是提供許多通常需要的預(yù)構(gòu)建軟件部件,尤其是實(shí)現(xiàn)較低業(yè)務(wù)價(jià)值的商品管道功能的部件,例如將服務(wù)連接在一起的代碼。
開(kāi)發(fā)人員更加專注于生成高價(jià)值的業(yè)務(wù)邏輯?— 通過(guò)減少花費(fèi)大量時(shí)間生成商品管道代碼和/或使用可以使用自動(dòng)化代碼的手動(dòng)流程和工具來(lái)實(shí)現(xiàn)。
對(duì)共享狀態(tài)的并發(fā)訪問(wèn)的有效協(xié)調(diào)?— 分布式系統(tǒng)中這個(gè)眾所周知的困難區(qū)域在許多情況下可以使用 Actor 模型來(lái)生成此結(jié)果。
將分布式系統(tǒng)的服務(wù)彼此分離,可以使軟件開(kāi)發(fā)、擴(kuò)展和維護(hù)軟件更具時(shí)間和成本效益,也更容易。為什么?將軟件片段彼此分離可以使其內(nèi)部代碼內(nèi)容和代碼結(jié)構(gòu)彼此獨(dú)立地變化,從而大大減少了需求更改時(shí)代碼更改所需的工作量。這種脫鉤是減少技術(shù)債務(wù)的最佳方法之一,并隨著歲月的流逝保持低水平,從而從長(zhǎng)遠(yuǎn)來(lái)看提高生產(chǎn)率。
Dapr 產(chǎn)生解耦的一個(gè)關(guān)鍵方式是通過(guò)其構(gòu)建塊,每個(gè)構(gòu)建塊都定義了分布式系統(tǒng)常用功能的概念接口。對(duì)于大多數(shù)構(gòu)建塊,Dapr 還提供了許多預(yù)構(gòu)建的插件組件,每個(gè)組件都為構(gòu)建塊概念的特定實(shí)例實(shí)現(xiàn)構(gòu)建塊接口的全部或部分。使用預(yù)構(gòu)建的插件組件還可以減少所需的編碼工作量。如果沒(méi)有 Dapr,開(kāi)發(fā)人員不知道有多少次必須一遍又一遍地編寫大致相同的低級(jí)管道代碼,才能連接到我們的代碼使用的每個(gè)數(shù)據(jù)庫(kù)或云服務(wù)并與之交互?使用Dapr的構(gòu)建塊/組件方法,答案為零!使用預(yù)構(gòu)建的插件組件可節(jié)省大量時(shí)間,使開(kāi)發(fā)人員能夠?qū)W⒂诟邇r(jià)值的工作。
如果我告訴你,Dapr是一個(gè)用于分布式系統(tǒng)的瑞士軍刀實(shí)用程序服務(wù),你很可能會(huì)想發(fā)現(xiàn)Dapr的許多功能,因?yàn)樗仁侵薪橛质墙怦钫摺apr 提供的主要功能如下,其中許多功能通過(guò)構(gòu)建塊和組件實(shí)現(xiàn),但不是全部:
狀態(tài)存儲(chǔ)?— Dapr 為鍵/值對(duì)狀態(tài)存儲(chǔ)構(gòu)建塊定義一個(gè)概念接口,然后提供了許多預(yù)構(gòu)建的插件狀態(tài)存儲(chǔ)提供程序組件,每個(gè)組件都連接到特定的外部鍵值對(duì)狀態(tài)存儲(chǔ),如 Redis 存儲(chǔ)或其他流行的鍵/值對(duì)數(shù)據(jù)庫(kù)。Dapr State Store 的目的是提供低延遲存儲(chǔ),如緩存。有關(guān)對(duì)通用存儲(chǔ)或數(shù)據(jù)庫(kù)管理系統(tǒng)的支持,請(qǐng)參閱下面的資源綁定和觸發(fā)器。
Pub/Sub?— 與狀態(tài)存儲(chǔ)類似,Dapr 為發(fā)布/訂閱構(gòu)建基塊定義了一個(gè)概念接口,此外還提供了許多預(yù)構(gòu)建的插件發(fā)布/訂閱組件,每個(gè)組件都連接到外部發(fā)布/訂閱消息傳送服務(wù),例如 Azure 服務(wù)總線主題或 Redis 流。
安全機(jī)密訪問(wèn)?— 與上述想法相同,但適用于各種外部機(jī)密存儲(chǔ),如密鑰保管庫(kù)。
資源綁定和觸發(fā)器?— 與上述想法相同,但應(yīng)用于各種外部資源(許多是云資源),如隊(duì)列、事件中心、服務(wù)網(wǎng)格、Blob 存儲(chǔ)、某些數(shù)據(jù)庫(kù)等。
服務(wù)到服務(wù)調(diào)用?— 此構(gòu)建基塊允許"Daprized"服務(wù)通過(guò) RPC 使用服務(wù)名稱加方法名稱尋址(而不是通過(guò) HTTP 或 gRPC 地址)相互通信。這會(huì)將服務(wù)到服務(wù)的通信與特定網(wǎng)絡(luò)終結(jié)點(diǎn)分離。使用集群計(jì)算主機(jī)時(shí)需要這樣做,并且使用其他主機(jī)也可以節(jié)省時(shí)間。
Actor?— 此構(gòu)建塊允許每個(gè)"Daprized"服務(wù)使用 Actor 模型來(lái)利用其獨(dú)特的特征:1) 保持狀態(tài)和在同一實(shí)體內(nèi)操作狀態(tài)的代碼,以及 2) "基于回合的并發(fā)",以防止當(dāng)多個(gè)客戶端同時(shí)使用同一個(gè) Actor 時(shí)狀態(tài)不同步。
可觀察性?— 可觀察性構(gòu)建基塊概念界面提供分布式系統(tǒng)中服務(wù)到服務(wù)交互流(包括各種組件的詳細(xì)信息)的跟蹤、指標(biāo)和運(yùn)行狀況監(jiān)視,以及將數(shù)據(jù)發(fā)送到外部聚合器,例如 Azure Monitor、Application Insights 和 Zipkin。
有效安全性?— 在"Daprized"服務(wù)的廣度和深度以及整個(gè)協(xié)作"Daprized"服務(wù)系統(tǒng)中提供高級(jí)別的通常可配置的安全性。
中間件管道?— 允許以聲明方式將自定義"中間件管道組件"代碼"插入"到 Dapr 請(qǐng)求/響應(yīng)處理管道。這允許 Dapr 編排開(kāi)發(fā)人員定義的服務(wù)與 Dapr 之間通信的自定義處理,反之亦然。例如,Dapr 提供了一個(gè)現(xiàn)成的 OAuth 2.0 中間件管道組件。
巨大的可擴(kuò)展性?— 這是由于 Dapr 的解耦、基于接口的設(shè)計(jì),以及它的組件化插件架構(gòu)。請(qǐng)注意,在給定的構(gòu)建基塊中,開(kāi)發(fā)人員可以編寫自己的代碼來(lái)實(shí)現(xiàn)針對(duì)其特定需求定制的 Dapr 組件。
HTTP 和 gRPC 通信,以及對(duì)最流行的編程語(yǔ)言和云提供商的支持。
請(qǐng)注意,上述所有預(yù)構(gòu)建的插件組件也是可配置的。"插入"特定組件的行為只是在標(biāo)準(zhǔn)組件目錄中提供聲明性配置文件。Dapr 負(fù)責(zé)加載組件代碼和"掛接"所需的工作。
如果我告訴你Dapr是一個(gè)Sidecar,你就會(huì)知道,通常Dapr的單個(gè)實(shí)例與服務(wù)的單個(gè)實(shí)例配對(duì),每個(gè)實(shí)例都在自己的進(jìn)程中運(yùn)行。Dapr 目前不是代碼庫(kù)。Dapr Sidecar 實(shí)例和使用它的服務(wù)實(shí)例通過(guò) HTTP 或 gRPC(使用 HTTP2)跨其進(jìn)程邊界相互通信,如下圖 所示。當(dāng)您將服務(wù)實(shí)例與 Dapr Sidecar 配對(duì)時(shí),您實(shí)質(zhì)上是"Daprize"您的服務(wù)。
此外,每個(gè) Dapr Sidecar 實(shí)例都知道協(xié)作"Daprized"服務(wù)系統(tǒng)中的所有其他 Dapr Sidecar 實(shí)例。所有這些協(xié)作 Dapr Sidecar 實(shí)例都使用 gRPC 在單獨(dú)的 Sidecar 專用通信通道上完全在后臺(tái)相互通信,如下圖所示。以這種方式在Dapr Sidecars之間進(jìn)行通信是Dapr的Pub / Sub,服務(wù)調(diào)用和Actor模型功能的關(guān)鍵。Dapr Sidecar 和使用 Dapr Sidecar 實(shí)例的服務(wù)通常在單獨(dú)的容器中運(yùn)行,或作為單獨(dú)的獨(dú)立進(jìn)程運(yùn)行。
"Daprized"服務(wù)通常只與其單個(gè)私有 Dapr Sidecar 交互,如上圖 所示,將所有凌亂的管道細(xì)節(jié)以及如何與其他服務(wù)、存儲(chǔ)、機(jī)密等通信的知識(shí)留給 Dapr Sidecar 本身,以及 Dapr Sidecar 實(shí)例中使用的 Dapr 組件。這使得服務(wù)代碼變得不那么復(fù)雜,并且在服務(wù)中的業(yè)務(wù)邏輯代碼與 Dapr Sidecar 及其組件中的管道邏輯代碼(也稱為基礎(chǔ)結(jié)構(gòu)代碼)之間提供了很好的關(guān)注點(diǎn)分離。在上面的圖 中,黃色服務(wù)包含所有業(yè)務(wù)邏輯,而粉紅色的 Dapr Sidecar 包含大部分(如果不是全部)管道代碼。業(yè)務(wù)邏輯代碼和管道邏輯代碼之間的這種關(guān)注點(diǎn)分離是使用Dapr導(dǎo)致的技術(shù)債務(wù)顯著減少的關(guān)鍵之一。因此,當(dāng)需求不可避免地發(fā)生變化時(shí),通常需要更改的代碼比管道代碼與業(yè)務(wù)邏輯代碼混合和交織的情況要少得多。
最后,在業(yè)務(wù)邏輯和管道代碼之間實(shí)現(xiàn)高度的關(guān)注點(diǎn)分離,再加上組件,開(kāi)發(fā)人員將更多的時(shí)間集中在高價(jià)值的業(yè)務(wù)邏輯上,而將更少的時(shí)間集中在低價(jià)值的組件管道代碼上。雖然低級(jí)管道規(guī)范是絕對(duì)必要的,但開(kāi)發(fā)低級(jí)管道規(guī)范既復(fù)雜又耗時(shí),并且需要高水平的經(jīng)驗(yàn) - 所有這些都需要時(shí)間和金錢。相反,使用預(yù)構(gòu)建的"插件"組件可以將開(kāi)發(fā)人員的大部分時(shí)間和技能重新定向到開(kāi)發(fā)業(yè)務(wù)邏輯上,從而產(chǎn)生與軟件最終用戶最直接相關(guān)的價(jià)值。
現(xiàn)在可以看到Dapr Sidecar(加上它使用的組件)如何站在使用Sidecar的服務(wù)和分布式系統(tǒng)中的所有其他服務(wù)之間,以及"Daprized"服務(wù)可以連接到的所有可能的云服務(wù)或本地服務(wù)之間。這可能是很多服務(wù)!因此,在理解"Daperized"服務(wù)的以下3個(gè)主要使用場(chǎng)景時(shí),Dapr作為中介的角色至關(guān)重要。
可移植服務(wù) — 一次寫入/隨處運(yùn)行。Dapr 在此方案中表現(xiàn)出色,允許開(kāi)發(fā)人員只需插入服務(wù)用于與外部服務(wù)和資源交互的不同組件(以聲明方式配置)。將服務(wù)與 Dapr Sidecar 實(shí)例放在單獨(dú)的容器中一起放入容器中,可以高度隔離硬編碼的外部依賴項(xiàng)。這允許相同的"Daprized"和容器化服務(wù)在本地、云中或邊緣設(shè)備(如 IoT 現(xiàn)場(chǎng)網(wǎng)關(guān))上運(yùn)行,而無(wú)需更改服務(wù)代碼。相反,可能只需要對(duì)與外部依賴項(xiàng)接口的 Dapr 組件的聲明性定義進(jìn)行更改。從本質(zhì)上講,將容器化的Dapr Sidecar與容器化服務(wù)集成實(shí)際上將服務(wù)的所有外部依賴關(guān)系分離,從而以較低的工作成本實(shí)現(xiàn)最大的可移植性,以將端口移植到不同的托管環(huán)境或連接到不同的外部服務(wù)。
多語(yǔ)言服務(wù)系統(tǒng)。借助 Dapr 的服務(wù)調(diào)用、發(fā)布/訂閱、機(jī)密以及狀態(tài)存儲(chǔ)以及資源綁定和觸發(fā)器,用各種語(yǔ)言編寫的服務(wù)可以相互通信,而無(wú)需重寫大量代碼,開(kāi)發(fā)人員也不必學(xué)習(xí)許多其他語(yǔ)言。為了便于理解,Dapr 為許多流行的語(yǔ)言(如 .NET C#、Java、JavaScript、Python 和 Go 等)提供了軟件開(kāi)發(fā)工具包 (SDK)。從本質(zhì)上講,使用任何受支持語(yǔ)言和 SDK 的開(kāi)發(fā)人員將針對(duì)相同的標(biāo)準(zhǔn)化 Dapr 接口進(jìn)行編程,而不是針對(duì)一堆特定于臨時(shí)語(yǔ)言或外部服務(wù)接口進(jìn)行編程。這也方便了其他2個(gè)使用場(chǎng)景。
延長(zhǎng)舊版軟件的使用壽命也屬于此使用場(chǎng)景。但請(qǐng)注意,舊版軟件絕對(duì)必須支持與其Dapr Sidecar的HTTP交互。如果是這種情況,那么"Daprize"遺留軟件可能是可行的,以允許它更經(jīng)濟(jì)高效地成為服務(wù)系統(tǒng)的一部分,通過(guò)Dapr Sidecar及其構(gòu)建塊和組件與其他服務(wù)和資源進(jìn)行通信。
具有動(dòng)態(tài)依賴項(xiàng)的靜態(tài)服務(wù)。需要將發(fā)布/訂閱消息主干從 Redis 更改為 Azure 服務(wù)總線?當(dāng)組織需要適應(yīng)變化時(shí),通常會(huì)發(fā)生這種情況。使用"Daprized"服務(wù)系統(tǒng),與在不使用 Dapr 的情況下重寫許多行代碼(在許多單個(gè)服務(wù)中實(shí)現(xiàn)發(fā)布/訂閱消息傳遞)的成本相比,進(jìn)行此更改(即更改聲明性組件定義)的每個(gè)服務(wù)的成本可能相當(dāng)小。這同樣適用于其他構(gòu)建基塊及其組件。
另請(qǐng)注意,"Daprized"服務(wù)可以托管在Kubernetes上的容器中,也可以托管在支持Docker等容器的其他主機(jī)上,包括在適當(dāng)?shù)那闆r下使用Docker Compose。"Daprized"服務(wù)也可以托管,而無(wú)需在各種計(jì)算主機(jī)(包括您自己的開(kāi)發(fā)系統(tǒng))上使用容器作為獨(dú)立進(jìn)程。
縱觀軟件的歷史,Dapr的潛在節(jié)省時(shí)間和勞動(dòng)力的特點(diǎn)真的是一件大事!到目前為止,還沒(méi)有像Dapr這樣的東西,它幾乎可以在任何地方運(yùn)行,并且還提供了與分布式系統(tǒng)服務(wù)的大規(guī)模解耦,以及組件化和出色的關(guān)注點(diǎn)分離。所有這些都減少了初始開(kāi)發(fā)所需的工作,并且從長(zhǎng)遠(yuǎn)來(lái)看,還導(dǎo)致技術(shù)債務(wù)明顯低于平時(shí)。從短期和長(zhǎng)期來(lái)看,所有這些都可以顯著提高軟件開(kāi)發(fā)生產(chǎn)力,從而減少需要完成的工作量,節(jié)省時(shí)間和金錢。
總結(jié)
以上是生活随笔為你收集整理的使用 Dapr 缩短软件开发周期,提高生产效率的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C# 制作指示灯(经典)
- 下一篇: 星跃计划 | 新项目持续招募中!MSR