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

作者:徐磊

文章首發地址:https://smartide.cn/zh/blog/2022-0601-dapr/

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

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

Dapr官網?https://dapr.io

4e50ed13df925a1b68f5440f510524eb.png

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

7b396e4cce5e36cf93e3faff9b6ef5d3.png

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

參考:

  • https://github.com/dapr/dapr/issues/3169

  • https://github.com/dapr/community/blob/master/ADOPTERS.md

3aa7ff78b9b1ac1b4385d60785dd20cb.png

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

92f5e48436809060dd78ab78c3f68a7d.png

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

  • 全棧多語言支持:這一點上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 以及背后的各種考量

  • https://blog.dapr.io/posts/2021/03/19/how-alibaba-is-using-dapr/

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

dc4428b4efba472c725fb84ae4a7d27a.png

搭建Dapr開發環境的痛點

74690a7406078bd18befa0538fa47f06.png

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

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

代碼庫

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

6feb0b8a4c0ca6b66d0aa15c085760ca.png

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

  • 作為?MQTT Broker?的?Mosquitto

  • 常用的緩存中間件?Redis

  • 消息隊列?RabbitMQ

  • 電子郵件發送中間件?SMTP?服務

  • 密鑰服務?Secrets

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

4cca28653cdf935bf2e42423f5270ce0.png

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

  • TrafficControlService?是交通控制服務,也是主服務,其業務邏輯是根據公路上的2個固定位置攝像頭反饋的數據,計算車輛通過攝像頭的車速,以便判斷是否存在超速行為。

  • FineCollectionService?是罰單處理服務,根據?TrafficControlService?發送過來的車牌數據,查詢車輛注冊數據庫(VehicleRegistrationService)獲取聯系人信息,并發送郵件

  • VehicleRegistrationService?是車輛注冊數據庫,提供車輛信息查詢,可以通過車牌號碼獲取車主信息,比如郵件地址。

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

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

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

開發者不使用容器??

b61ac359a463d26bac62a0ad0715a3e5.png

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

要解決這個問題,我們必須降低容器的使用門檻,讓開發者在?不了解/不學習?容器技術的前提下使用容器進行開發。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?的 環境進行開發調試了,效果如下

438d69df9db4d0c3b38cbc22f4f0d90f.gif

Dapr-traffic-control 開發調試過程

57ab5f3cffa8f79fd7af0db34b17df91.png

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

6ff723feb4c625cf71b63857f9846aec.png

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

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

da1dcdd0f0263ee641977d6d5f47c22f.png

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

cd src/Infrastructure/
pwsh?start-all.ps1

155abbf93a0a2f8d95da3db559e43c74.png

你會注意到我們實際上在容器內執行了一系列的 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/TrafficControlService,?src/VehicleRegistrationService,?src/FineCollectionService,并運行啟動指令

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

b401ea65c6e8e867ae39671c66d18875.png

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

dotnet?run

2ba8c91caafbef2df69b167a3bc87523.png

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

  • http://localhost:5000?- 模擬器窗口,可以看到隨機出現的汽車通過攝像頭的場景,同時調用以上業務服務,模擬交通流量。

  • http://localhost:4000?- 郵件模擬應用,可以持續收到郵件/超速罰單的過程

8a96859d6e83459cec15abc5a4cfbbe3.png

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

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

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

  • 官網:

    https://SmartIDE.cn

  • B 站頻道:

    https://space.bilibili.com/1001970523

  • GitHub 開源地址:

    https://github.com/smartide

  • Gitee 開源地址:

    https://gitee.com/smartide

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286513.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286513.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286513.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android之模擬網絡請求返回http 502、400、401、402錯誤碼

1 問題 app 網絡框架協程沒有做網絡異常捕獲處理&#xff0c;想本地測試網絡接口&#xff0c;希望網絡接口返回Http的錯誤碼 比如502、400、401、402 2 解決辦法 1、pc安裝Fiddler Everywhere 2、讓Fiddler Everywhere支持抓http和https的包 3、保持手機和電腦同一個局域網&am…

12c分頁查詢特性FETCH FIRST ROWS,OFFSET ROWS FETCH NEXT ROW LIMIT Clause子句

Database 12c的FETCH FIRST ROWS特性可以簡化老版本中ROW_NUM()或ROWNUM的分頁排序寫法&#xff0c; 大幅節約開發花在分頁查詢語句上的時間。 row-limiting子句用以限制某個查詢返回的行數 可以通過FETCH FIRST/NEXT關鍵字指定返回結果的行數可以通過PERCENT關鍵字指定返回結果…

tomcat結合nginx使用小結

tomcat結合nginx部署 相信很多人都聽過nginx&#xff0c;這個小巧的東西慢慢地在吞食apache和IIS的份額。那究竟它有什么作用呢&#xff1f;可能很多人未必了解。 說到反向代理&#xff0c;可能很多人都聽說&#xff0c;但具體什么是反向代理&#xff0c;很多人估計就不清楚了。…

如何學好GIS,徹底領悟這幾句話就夠了!!!

目 錄前言1. GIS起源于地圖學2. GISer心中要有地圖3. 空間數據是GIS的血液4. 空間分析是GIS的靈魂5. GIS是智慧城市的操作系統前言 地理信息系統 &#xff08;GIS&#xff09;是以可視化和分析地理配準信息為目的&#xff0c;用于描述和表征地球及其他地理現象的一種系統。 地…

【iVX 初級工程師培訓教程 10篇文拿證】07 08 新聞頁制作

目錄 【iVX 初級工程師培訓教程 10篇文拿證】01 了解 iVX 完成新年賀卡 【iVX 初級工程師培訓教程 10篇文拿證】02 數值綁定及自適應網站制作 【iVX 初級工程師培訓教程 10篇文拿證】03 事件及猜數字小游戲 【iVX 初級工程師培訓教程 10篇文拿證】04 畫布及我和 iVX 合照 【iV…

【WEB API項目實戰干貨系列】- WEB API入門(一)

這篇做為這個系列的第一篇&#xff0c;做基本的介紹&#xff0c;有經驗的人可以直接跳到第二部分創建 ProductController。創建 Web API 項目 在這里我們使用VS2013, .NET 4.5.1創建一個Web API 2的項目選擇項目WEB API模板, 在最下方的MVC主要是默認會自帶微軟的API Helper, 使…

父元素 高度固定,如何使其中的文字垂直居中?

方法一&#xff1a; 設置父元素高度&#xff0c;設置子元素行高垂直居中 <style> *{padding: 0;margin:0;font-size: 12px;} div{float: left;width: 200px;height:200px;margin: 10px;border:1px solid blue; line-height: 200px;} span{display: inline-block;verti…

Android之打開繼承DialogFragment對話框里面EditText獲取光標并且彈出鍵盤把底部布局頂上去

1 需求 打開繼承DialogFragment對話框里面EditText獲取光標并且彈出鍵盤把底部布局頂上去 2 效果爆照如下 打開這個DialogFragment 3 關鍵代碼實現 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)…

驅動介紹

關于驅動驅動&#xff08;也稱連接器&#xff09;是對傳統的數據采集程序的標準化&#xff0c;驅動可以作為你的資產進行管理系統為每個設備創建一個驅動實例通過反射創建驅動實例驅動不可以是靜態的驅動要繼承IDriver接口驅動內需要通過web配置的屬性(支持枚舉等基本類型),上要…

【iVX 初級工程師培訓教程 10篇文拿證】06 數據庫及服務

目錄 【iVX 初級工程師培訓教程 10篇文拿證】01 了解 iVX 完成新年賀卡 【iVX 初級工程師培訓教程 10篇文拿證】02 數值綁定及自適應網站制作 【iVX 初級工程師培訓教程 10篇文拿證】03 事件及猜數字小游戲 【iVX 初級工程師培訓教程 10篇文拿證】04 畫布及我和 iVX 合照 【iV…

memcached安裝和php擴展memcache安裝

1.準備安裝包: libevent-2.1.8-stable.tar.gz memcached-1.5.0.tar.gz memcache-2.2.7.tgz 2.安裝libevent tar xf /opt/libevent-2.1.8-stable.tar.gz cd libevent-2.1.8-stable mkdir /usr/local/libevent ./configure --prefix/usr/local/libevent make && make …

J2EE開發技術點4:ajax技術

前言 AJAX 是在不重新加載整個頁面的情況下&#xff0c;與服務器交換數據并更新部分網頁的技術。需要知道的是&#xff0c;Ajax技術并不是一項新的技術&#xff0c;而是使用現有技術解決問題的新方法。Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;也叫異步Jav…

【WEB API項目實戰干貨系列】- 接口文檔與在線測試(二)

這一篇我們主要介紹如何做API幫助文檔&#xff0c;給API的調用人員介紹各個 API的功能, 輸入參數&#xff0c;輸出參數, 以及在線測試 API功能(這個也是方便我們自己開發調試) 我們先來看看我們的API最終幫助文檔及在線測試最終達到的效果: 概要圖GET API添加產品API:刪除產品 …

IOS多線程

http://www.jianshu.com/p/0b0d9b1f1f19 首頁專題下載手機應用顯示模式登錄注冊登錄添加關注作者 伯恩的遺產 2015.07.29 00:37* 寫了35249字&#xff0c;被2296人關注&#xff0c;獲得了1668個喜歡關于iOS多線程&#xff0c;你看我就夠了 字數8596 閱讀92152 評論153 喜歡905在…

Android之提示Failed to load WebView provider: No WebView installed

1 問題 Fatal Exception: android.util.AndroidRuntimeException: android.webkit.WebViewFactory$MissingWebViewPackageException: Failed to load WebView provider: No WebView installedat android.webkit.WebViewFactory.getProviderClass(WebViewFactory.java:435)at a…

地理(GIS)教學神器:氣象地球生成器

地理教學中&#xff0c;不管是高中還是初中&#xff0c;都會涉及到大氣運動的相關教學&#xff0c;并且&#xff0c;高中階段的大氣運動知識對很多學生來說相對比較復雜&#xff0c;如&#xff1a; &#xff08;三圈環流&#xff09; &#xff08;青藏高原對西風帶的影響&#…

使用 Yarp 做網關

資料GitHub: https://github.com/microsoft/reverse-proxyYARP 文檔&#xff1a;https://microsoft.github.io/reverse-proxy/articles/getting-started.html主動和被動健康檢查 &#xff1a; https://microsoft.github.io/reverse-proxy/articles/dests-health-checks.html#ac…

Android之OkDownload里面的OKHttp提示java.lang.IllegalArgumentException: Invalid URL port: “image“

1 、問題 release版本線上奔潰如下 Fatal Exception: java.lang.IllegalArgumentException: Invalid URL port: "image"at okhttp3.t$a.a(HttpUrl.kt:63)at okhttp3.t$b.b(HttpUrl.kt:8)at okhttp3.y$a.b(Request.kt:5)at com.liulishuo.okdownload.j.e.b.<init…

【iVX 初級工程師培訓教程 10篇文拿證】05 畫布及飛機大戰游戲制作

目錄 【iVX 初級工程師培訓教程 10篇文拿證】01 了解 iVX 完成新年賀卡 【iVX 初級工程師培訓教程 10篇文拿證】02 數值綁定及自適應網站制作 【iVX 初級工程師培訓教程 10篇文拿證】03 事件及猜數字小游戲 【iVX 初級工程師培訓教程 10篇文拿證】04 畫布及我和 iVX 合照 【iV…

【WEB API項目實戰干貨系列】- API登錄與身份驗證(三)

這篇我們主要來介紹我們如何在API項目中完成API的登錄及身份認證. 所以這篇會分為兩部分, 登錄API&#xff0c; API身份驗證. 這一篇的主要原理是&#xff1a; API會提供一個單獨的登錄API, 通過用戶名&#xff0c;密碼來產生一個SessionKey, SessionKey具有過期時間的特點, 系…