在Dapr 文件和實踐案例中多是推薦採用k8s, 其實我目前也是在k8s 上操作的,有公有云TKE,AKS,還有私有云的Rancher ,它並沒有傳聞中的那麼難,而且我認為它非常容易上手。不過,我還是有很多人不願意使用k8s 。那麼在虛擬機器場景下如何使用Dapr呢? 當然也有虛擬機器部署的案例,比如2021年第一屆DaprConf 上分享的Dapr case study: Man Group:https://blog.dapr.io/posts/2021/10/05/join-us-for-daprcon-october-19th-20th-2021/
如果我們脫離K8s 的 虛擬機器環境下會碰到什麼問題?
- 你需要安裝 Docker 來執行 Dapr
- 使用Invoke API進行名稱解析時無法在其他伺服器上找到 Dapr 應用程式
除了這兩個問題,應該沒有什麼其他問題,因為根據 Dapr 的配置檔案,它使用了外部伺服器或者服務。
我們先來看一下第一個問題,在沒有 Docker 的情況下使用 Dapr ,官方文件裡已經給我們了答案:入門指南: 不使用 Docker 在自託管模式下執行 Dapr。
Dapr CLI 提供了使用 slim init 初始化 Dapr 的選項,而無需預設建立依賴於 Docker 的開發環境。 要使用 slim init 初始化 Dapr ,請在安裝 Dapr CLI 後使用以下命令:
dapr init –slim
在此模式下安裝了兩個不同的二進位制檔案 daprd 和 placement。在此模式下,不會為狀態管理或釋出/訂閱安裝任何預設元件,例如Redis 和 Zipkin 不會安裝,但是如果需要的話會單獨設定,所以沒有問題。
那麼第二個問題是 名稱解析 ,我們還是來看一下官方文件裡的 使用 服務呼叫概述-mDNS 輪詢負載均衡:https://docs.dapr.io/zh-hans/developing-applications/building-blocks/service-invocation/service-invocation-overview/,Dapr 使用 mDNS 協議提供輪詢負載均衡的服務呼叫請求,例如用於本地或多個聯網的物理機器。但是mDNS只能在可以使用多播的環境中使用,這在雲環境下通常是不可用的,在雲環境下還有一個選擇,官方文件裡有 :詳細介紹了關於 HashiCorp Consul 服務發現元件的資訊,它既可以用於虛擬機器也可以用於k8s 環境下,文章開頭提到的案例就是用Consul 。
說到這裡,如果你是在用Azure,在Azure上有 Managed HashiCorp Cosul ServiceAzure,簡稱HCS, 客戶可以透過Azure Marketplace將 HCS直接配置到他們的 Azure 環境中,而 HashiCorp 則負責服務的維護和運營。使用 HCS 允許使用者在雲、混合和本地場景中使用各種環境(包括虛擬機器和 Kubernetes)。所以我嘗試了一下,但是我使用的賬號用不了,需要額外付費:
AWS 上也有,具體可以看 Consul on Amazon ECS 0.3 Adds Extended Configuration。
上面這兩個問題我們都解決了,總結一下:
- Docker 對於 Dapr 來說並不是必需的。
- 如果你的環境支援使用多播,則可以使用 mDNS 在多臺伺服器上執行 Dapr。
- 虛擬機器環境下推薦使用Consul 作為名稱解析服務。
針對這個問題 陳一獅同學很早就寫了一篇文章, Dapr + .NET Core實戰(十四)虛擬機器叢集部署 mDNS + Consul 。他還特別錄製一個系列的影片課程放在騰訊課堂裡。
我們再回到開篇時提到的那個使用Consul 部署的案例 ,他們開發了一個 Dapr 的輕量級生命週期管理元件:https://github.com/man-group/dapr-sidekick-dotnet,Sample 目錄下有Consul的演示示例:https://github.com/man-group/dapr-sidekick-dotnet/tree/main/samples/AspNetCore,也可以看影片:https://www.bilibili.com/video/BV1br4y167u6?share_source=copy_web