[原創]Dapr入門教程之一:Dapr初識


Dapr(Distributed Application Runtime)是微軟於2019年10月16日首次發布的分布式程序運行時,到現在已經過去1年多,從最初的v0.1.0到現在的v1.0.0-rc2,加入了好多新的功能。支持的中間件越來越多,基本上主流的中間件(本地版和各雲提供商的托管版)都可以被支持。Dapr運行時也從原來的只支持單Instance變成了v1.0.0-rc1以后的支持多Instance(HA mode)。讓我們一起進入精彩的Dapr的世界。

Dapr是什么?

參考Dapr官方網站,"An event-driven, portable runtime for building microservices on cloud and edge",或者復雜點說,"Dapr is a portable, event-driven runtime that makes it easy for any developer to build resilient, stateless and stateful applications that run on the cloud and edge and embraces the diversity of languages and developer frameworks"。翻譯過來就是,"Dapr是一個在雲和邊緣構建微服務用的事件驅動的,可移植的運行時"。更復雜的來說,"Dapr是一個可移植的,事件驅動的運行時,使開發人員可以輕松創建在雲和邊緣上運行的有彈性,無狀態和有狀態的應用程序,支持語言和開發人員框架的多樣性"。聽起來讓人一頭霧水,讓我解釋一下它到底是什么意思。

  • 分布式程序(Distributed Application)指的是什么?

    • 微服務是一個意思。大的系統分成彼此獨立的小的模塊,模塊和模塊之間通過API互相通信,這樣每個模塊可以用不同的語言開發,一個模塊升級的時候不會影響到別的模塊。
  • 雲和邊緣(cloud and edge)指的是什么?

    • 這里的雲和邊緣指的是Dapr的App可以跑在AWS,Azure,GCP等雲服務器上,也可以跑在本地的服務器上。
  • 事件驅動(event-driven)指的是什么?

    • 可以理解成Dapr在沒有監聽(Listening)到請求到來的時候會一直處於待機的狀態,什么也不做,只有監聽到請求事件來了才開始處理。
  • 可移植(portable)指的是什么?

    • 就是說寫的程序和運行的環境,用的中間件無關。比如說原來跑在AWS上,現在想跑在Azure上,Nosql數據庫原來用DynamoDB,現在想用CosmosDB,消息中間件原來用SNS/SQS,現在想用Service Bus,沒問題,只要在Dapr設定這邊做一下切換,程序無需改動。
  • 運行時(runtime)指的是什么?

    • 運行時指的是Dapr的運行環境。Dapr的Control Plane(不知道怎么翻譯,直接用英文,就是Dapr管理用的模塊)會單獨啟動,同時你的程序在啟動的時候Dapr會在你的程序上掛一個Sidecar(所謂的邊車模式),你的程序就可以通過Sidecar和Dapr的Control Plane聯系上。所有掛有Dapr Sidecar的各個微服務之間就可以互相調用了,也可以通過Dapr調用各種中間件。
  • 有彈性(resilient)指的是什么?

    • 指的是可以從故障中自動恢復的能力,比如說超時(Timeout),重試(retry)等。不會卡住或陷入一種死循環。
  • 無狀態和有狀態(stateless and stateful)指的是什么?

    • 無狀態指的是一個微服務經過計算得到結果,返回給調用者以后這個值在微服務這邊是不保存的(DB,內存等)。有狀態指的是在微服務這邊要把這個結果保存起來。
  • 支持語言的多樣性(the diversity of languages)指的是什么?

    • 指的是Dapr有各種語言的SDK,比如java,python,go,.net等都支持。
  • 開發人員框架(developer frameworks)指的是什么?

    • 指的是Dapr跟框架無關,你可以把各種語言的各種框架(比如java的spring boot框架)和Dapr(API或者SDK)混合使用。
  • 說了這么多,Dapr到底是個什么東西?

    • 我的理解是Dapr就是一個代理。什么意思呢,就是說它把不同組件(Component)的接口隱藏了起來,給你提供一個統一的接口讓你來通信。這樣做的好處不言而喻,不管你的組件怎么變,平台怎么變,我Dapr這邊只要接口是不變的,你程序就不用變。所以它是Makes it easy for any developer。從程序來看我只是把數據交給Dapr就可以了,由Dapr來處理,這塊的邏輯不寫在我的程序邏輯里。所以通過Dapr可以做到平台無關,中間件無關。打個比方,如果你不用Dapr,而是用springboot redis庫來實現的Message Queue,忽然有一天讓你不用redis而是RebbitMQ,你怎么辦,是不是只能用springboot rebbitmq重寫程序。不同於工作在網絡層的Service Mesh(如Istio和Linkerd),Dapr算是一個App Mesh,工作於APP層,專注於提供構建模塊(Building blocks),使開發人員更容易構建微服務。可以說Dapr以開發人員為中心,而Service Mesh則以基礎架構為中心。兩者可以共存。

Dapr能為我做什么?

Dapr提供如下的Building blocks:

  1. Service-to-service invocation,服務間調用,指的是一個微服務可以通過Dapr調用另一個微服務。
  2. State management,狀態管理,指的是一個微服務通過Dapr把狀態數據保存到某個地方(PostgreSQL,Redis,DynamoDB等等)。
  3. Publish and subscribe,就是所謂的消息總線(Message Bus),或者說發布者/訂閱者模式。一個微服務把消息通過Dapr發布(Publish)給某個Topic,所有訂閱(Subscribe)這個Topic的微服務都能通過Dapr收到這個消息。
  4. Resource bindings,就是所謂的消息隊列(Message Queue,或者叫消息代理,Message Broker),分為兩種綁定,一種是輸出綁定(Output Binding),一種是輸入綁定(Input Binding)。出和入是看數據的流向,輸出綁定就是作為Producer的App把消息通過Dapr傳給消息隊列,輸入綁定就是作為Consumer的App通過Dapr從消息隊列里得到消息。補充一點,這里的消息隊列和Pub/Sub里的消息總線有什么區別呢?可以這樣理解:一個消息進入消息總線的話,所有訂閱者都能得到這個消息。而一個消息進入消息隊列的話,由Consumer來取,一次只有一個人能得到。此外,消息總線是不要求處理順序的,兩個消息進入消息總線,誰先被拿到順序是不一定的,而消息隊列可以保證是先入先出的。
  5. Actors,實現了Actor Model
  6. Observability, 可觀測性,就是Dapr提供了模板讓你方便的進行觀測,比如說用Prometheus+Grafana來看系統的Metrics,用Zipkin來進行分布鏈路追蹤,用Elasticsearch+Fluentd+Kibana(俗稱EFK)來對日志進行檢索。
  7. Secrets,就是密鑰,指的是一個微服務通過Dapr從Secret Store取得密鑰。

本章到此結束。下一章講解如何配置Dapr的運行環境。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM