為什麼Dapr是比SpringCloud和Istio更優雅的微服務框架?

来源:https://www.cnblogs.com/ups216/archive/2022/06/05/16345398.html
-Advertisement-
Play Games

兩個特性說明Dapr是比SpringCloud和Istio更有前途的微服務開發框架。 ...


Dapr 是微軟主導的雲原生開源項目,2019年10月首次發佈,到正式發佈 V1.0 版本的不到一年的時間內,github star 數達到了 1.2萬(現在已經超過1.7萬星),超過同期的 kubernetes、istio、knative 等,發展勢頭迅猛,業界關註度非常高。

Dapr 這個詞是是 「Distributed Application runtime」的首字母縮寫,非常精煉的解釋了 dapr 是什麼:dapr 是一個為應用提供分散式能力的運行時。

Dapr官網 https://dapr.io

Dapr

Dapr已經在多家大廠支撐生產環境

隨著各家大廠的IT系統規模擴大,微服務架構已經成為了必需品和標準品,這也催生了 Dapr 這類非侵入式的(或者叫邊車模式SideCar)的微服務開發框架的使用。根據Dapr官方倉庫中的記錄,已經有非常多的大廠在 生產環境 中使用Dapr來支撐自己的微服務開發。這裡面不乏大家熟悉的騰訊,阿裡,丁丁等國內大廠。

參考:

Dapr

Dapr比較SpringCloud或者Istio的優勢在哪裡?

這個可能是大多數人的第一個問題,簡單總結幾點供大家參考

  • 全棧多語言支持:這一點上Dapr和Istio是等同的,因為都採用了邊車模式,與應用進程之間沒有有侵入性,相比SpringCloud這種只能支持Java語言(當然現在有很多其他語言提供SpringCloud的SDK)的侵入性框架,具備先天的跨語言優勢。微服務化給開發人員帶來的一個重要價值就是可以隨意的選擇不同開發語言框架進行組裝,對於企業來說也可以避免被某一種技術框架綁定,甚至在招聘程式員的時候也可以有多的選擇。因此當微服務的理念開始在業界流行以後,採用者的團隊中必然出現多語言並存的狀況。當你面對一個Java/.Net/Python/Node/JavaScript/Golang多語言並存並且相互依賴的應用環境的時候,就會發現SpringCloud無法這種需求,變成了微服務支撐框架的瓶頸。

  • 多雲/非雲環境支持:這一點上Dapr和SpringCloud是等同的。SpringCloud作為雲原生時代之前出現的框架,它本身的根基就在非雲或者虛擬機環境上,因此SpringCloud本身就具備跨雲/非雲環境支撐,因為它本身和雲環境並無綁定關係。你當然可以在容器/k8s中運行SpringCloud,但這僅僅是給SpringCloud應用換了一種打包部署方式而已。Istio 在這一點上有天然的弱勢,因為Istio從一開始就誕生於雲原生的基礎設施k8s之上,也就順其自然的利用了k8s所提供的很多基礎能力,這些對於新生類應用來說非常合適,但是對於傳統/現存應用來說就面臨改造的問題。Dapr的設計則從根基上就相容了多雲/非容器和非雲環境,同時也借鑒了雲原生環境的特點來進行設計,因此你完全可以在傳統的主機/虛擬機/非雲環境中獲得和雲原生平臺類似的微服務體驗。這一點上對於已經有大量現存應用的傳統企業來說,是非常重要的一個福音。×備註:Isitio也已經開始支持與虛擬機環境的集成,這一點大家可以自行查閱資料。

這個鏈接中介紹了阿裡是如何引入 Dapr 以及背後的各種考量

簡單來說,Dapr 從設計上就借鑒並考慮了之前的2種類似框架各自的優勢,並將所有的好處融合進來,將弊端剔除掉;是當前最先進最有前途的分散式微服務開發框架。

Dapr

搭建Dapr開發環境的痛點

以下視頻是展示了在容器中使用 VSCode WebIDE 開發一個 Dapr 應用的整個過程

SmartIDE快速啟動 - Dapr分散式微服務開發環境_嗶哩嗶哩_bilibili

既然是一個面向微服務的開發框架,Dapr 環境本身可以變得非常複雜。因為要引入各種類型的中間件,很多開發者會發現搭建一個可以運行使用Dapr的環境,可能需要先安裝一堆的各種服務。比如下麵這個 Dapr 示例應用 Dapr-Traffice-Control

代碼庫

Dapr Traffice Control Sample

雖然應用本身並不是特別複雜,只用到了3個服務組件,但是支撐這3個服務的中間件卻有5個之多,包括:

  • 作為 MQTT Broker 的 Mosquitto
  • 常用的緩存中間件 Redis
  • 消息隊列 RabbitMQ
  • 電子郵件發送中間件 SMTP 服務
  • 密鑰服務 Secrets

簡單介紹一下這個示例的業務背景, dapr-traffice-control 模擬了一個常見的超速攝像頭系統的實現,通過檢測車輛通過道路上2個攝像頭之間的耗時,計算車速,併發送罰單給司機。如下圖:

Dapr Traffice Control Sample

這裡用到的業務組件只有3個,分別是:

  • TrafficControlService 是交通控制服務,也是主服務,其業務邏輯是根據公路上的2個固定位置攝像頭反饋的數據,計算車輛通過攝像頭的車速,以便判斷是否存在超速行為。
  • FineCollectionService 是罰單處理服務,根據 TrafficControlService 發送過來的車牌數據,查詢車輛註冊資料庫(VehicleRegistrationService)獲取聯繫人信息,併發送郵件
  • VehicleRegistrationService 是車輛註冊資料庫,提供車輛信息查詢,可以通過車牌號碼獲取車主信息,比如郵件地址。

這其實是微服務開發中一個非常普遍的問題:基礎環境往往比應用本身還要複雜。這一點上和微服務的理念是相符的,微服務就是希望通過對不同業務組件的抽象儘量減少開發人員花在通用組件上的投入,而專註於業務本身。從這個角度來說, dapr-traffice-control 非常完美的詮釋了這個理念;同時也非常直接的展示了這個困境。

從開發人員的角度來說,這帶來的一個非常麻煩的問題:單體時代只要拿到代碼就可以開始調試,現在的應用開發環境的搭建變得越來越複雜,開發人員需要瞭解的知識範圍也被放大了。

實際上,以上這個問題在運維領域早就被完美解決了,方案其實就是容器和雲原生技術本身。但是開發者作為雲原生技術的使用者,自己沒有從中獲益,反而招來了更多的麻煩。

開發者不使用容器?

首先說明,這裡所說的不是使用容器進行部署,而是使用容器進行開發。雲原生的典型部署模式一定是容器化的,開發者在這個問題上並不糾結。開發者的現狀是,雖然應用最終要在容器內運行,但是在開發的時候並不希望在容器內進行開發,主要原因是不方便,操作太繁瑣以及對容器技術的不瞭解。這樣帶來的問題也非常顯而易見,因為開發環境和生產環境不一致,就必須通過配置的方式,流水線自動化的方式來解決這些不一致的問題,造成整個發佈系統變得更加複雜和難以維護。

要解決這個問題,我們必須降低容器的使用門檻,讓開發者在 不瞭解/不學習 容器技術的前提下使用容器進行開發。SmartIDE就是為瞭解決這個問題而設計的,與繁瑣的環境搭建腳本不同,SmartIDE 允許你使用一個簡單的指令 smartide start 來啟動 任何應用 的開發調試環境,而且這個環境從一開始就是容器化的。

對於上面這個 dapr-traffic-control 而言,啟動命令如下

smartide start https://github.com/SmartIDE/sample-dapr-traffic-control

也就是說,開發者可以使用 smartide start 加上代碼庫地址來啟動任何應用的開發調試;而且,如果開發者自己有一臺可以運行Docker環境的雲主機,那麼就可以將這個 環境一鍵漫游 到這個主機上,整個過程只需要2個指令

## 添加主機到SmartIDE工具並獲取 主機ID
smartide host add <Docker主機IP地址> --username <SSH登錄用戶名> --password < SSH登錄用密碼>
## 一鍵漫游環境到遠程主機
smartide start --host <主機ID> https://github.com/SmartIDE/sample-dapr-traffic-control

完成以上操作後開發者就可以啟動整個 dapr-traffic-control 的 環境進行開發調試了,效果如下

Dapr Traffice Control Sample

Dapr-traffic-control 開發調試過程

使用以上指令啟動環境以後,開發者首先會獲得一個類似VSCode的WebIDE界面,SmartIDE會自動啟動瀏覽器並載入VSCode和應用代碼,這時開發者可以打開內置的終端工具,使用 dapr init 初始化 Dapr開發環境。

Dapr Development

這時,dapr 會啟動3個docker容器,分別是 dapr: 1.7.4zipkin 和 redis。預設情況下,dapr 會利用 docker 為開發者提供必要的中間件組件。要完成 dapr init 動作,開發者必須首先在本地安裝 docker 環境,而在剛纔的操作中,我們使用的是一個已經預裝了 docker 的容器環境,也就是在容器內提供了 docker 的支持,這樣開發者的環境完全處於容器內部,不再需要在開發機或者遠程伺服器上安裝這些服務, 這種環境我們稱之為 VM Like Container (VMLC),也就是類虛擬機容器環境,後續我們會專門針對VMLC進行更加詳細的介紹。這種方式也同時保證了無論開發者在什麼地方啟動這個環境,都可以獲得一致的體驗。

現在,鍵入 docker ps 就可以看到這3個容器已經啟動完畢

Dapr Development

現在,我們通過一個預先準備好的 PowerShell 腳本來啟動 Traffice-Control 應用的其他中間件環境,同樣,這個過程中你也不必考慮 PowerShell 工具是否存在的問題,因為這些都已經通過標準化的 開發者鏡像 提供了。你只需要在終端中執行

cd src/Infrastructure/
pwsh start-all.ps1

Dapr Development

你會註意到我們實際上在容器內執行了一系列的 docker build 和 docker run 的動作,完成了另外3個中間件容器的啟動,分別是:

  • Maildev: 1.1.0 - 負責模擬電子郵件發送和接受的調試工具
  • Rabbitmq: 3-management-alpine - 消息隊列服務
  • Mosquitto: 1.0 - MQTT Broker 服務

如果再次運行 docker ps,你可以看到現在我們已經有了6個容器運行在環境中,構成了當前應用的完整中間件環境。現在我們就可以依次啟動3個業務組件,完成整個 traffic-control 應用的開發調試了。分別啟動3個終端視窗,進入 src/TrafficControlServicesrc/VehicleRegistrationServicesrc/FineCollectionService,並運行啟動指令

## 使用PowerShell腳本啟動服務
pwsh start-selfhosted.ps1

Dapr Development

最後,我們來啟動模擬器。進入 src/VisualSimulation 目錄並運行以下指令

dotnet run 

Dapr Development

現在,我們可以開啟另外2個瀏覽器視窗,分別打開

  • http://localhost:5000 - 模擬器視窗,可以看到隨機出現的汽車通過攝像頭的場景,同時調用以上業務服務,模擬交通流量。
  • http://localhost:4000 - 郵件模擬應用,可以持續收到郵件/超速罰單的過程

Dapr Development

至此,我們完成了整個 dapr-traffic-control 示例應用的調試。在這個過程中,開發者不必瞭解背後的 Docker,遠程SSH隧道,容器鏡像環境的各種配置;而且,無論開發者在自己的本地開發機,還是遠程主機,或是k8s集群中啟動這個環境,都可以使用統一的 smartide start 指令來完成。

SmartIDE 的設計初衷就是希望能夠最大程度的降低開發者上手一個應用的複雜度,無論這個應用是一個簡單的hello-world,還是一個複雜的微服務應用;也無論應用所需要的環境只是簡單的SDK,還是各種複雜中間件以及繁瑣的網路配置,都只需要一個指令:smartide start

SmartIDE支持跨平臺,全技術棧和多種IDE工具(VSCode/JetBrains全家通/OpenSumi);對於獨立開發者以及中小型企業用戶是完全免費並且開源的。如果你希望馬上嘗試一下這種全新的應用開發方式,請參考以下鏈接:

世界上不是所有的東西都是用直接經濟契約來維繫的,比如:陽光,空氣,愛情和開源軟體。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • du Linux du (英文全拼:disk usage)命令用於顯示目錄或文件的大小。 du 會顯示指定的目錄或文件所占用的磁碟空間。 du命令作用是估計文件系統的磁碟已使用量,常用於查看文件或目錄所占磁碟容量。 du命令與df命令不同,df命令是統計磁碟使用情況,詳見linux命令詳解之df命令 ...
  • 英文原文:https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/cgroups.html 1 控制組 1.1 什麼是控制組? 控制組(Control Group)提供一種機制,把一組任務(task)及其子任務整合/分割成具有特殊行為 ...
  • 一、存儲過程簡介 • 存儲過程(Stored Procedure)是一組為了完成特定功能的PL/SQL語句塊,經編譯後存儲在資料庫中。 • 存儲過程經編譯和SQL優化後存儲在資料庫伺服器中,使用時只要調用即可。 • 存儲過程是資料庫中的一個重要對象,任何一個設計良好的資料庫應用程式都應該用到存儲過程 ...
  • 一、概念 • REF游標和游標變數用於處理運行時動態執行的SQL查詢的結果集。 • 創建游標變數有兩個步驟: • 聲明REF游標類型 • 聲明REF游標類型的游標變數 • 聲明REF游標的語法: type 游標類型名 is ref cursor [return 返回值類型] 二、區別 • 靜態游標和 ...
  • 1、FastDFS 1.1、瞭解基礎概念 1.1.1、什麼是分散式文件系統? 全稱:Distributed File System,即簡稱的DFS 這個東西可以是一個軟體,也可以說是伺服器,和tomcat差不多,即相當於軟體也相當於是伺服器,這個軟體就是用來管理文件的 這個軟體所管理的文件通常不是在 ...
  • React兄弟組件之間的通信 Child2組件需要去更改Child1組件中的數據。 因為Child1和Child2是兄弟組件 所以數據和事件都放在最進的父級組件中去 兄弟組件通信的簡單使用 import React from 'react'; //這個是react這個包,我們是需要的 import ...
  • 組件中的props 在react中,props的特點是: 1.可以給組件傳遞任意類型的數據 2.props是只讀的對象,只能夠讀取屬性的值,無法修改對象 如過我們強行修改數據,會報錯,告訴我們該屬性是只讀屬性。 ps:在類組件中,如果寫了構造函數,應該將props傳遞給super(). 否則無法在構 ...
  • 本文目錄: 字體標簽 我是字體標簽 <font> 我是字體標簽 </font> 效果: 我是紅色 <font color="red"> 我是紅色 </font> 效果: 我是楷體 <font face="楷體"> 我是楷體 </font> 效果: 我是4號字體 <font size="4"> 我是4 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...