.NetCore集成Dapr踩坑經歷

来源:https://www.cnblogs.com/ShaoJianan/archive/2020/01/01/NetCore.html
-Advertisement-
Play Games

之前自己有個core2.2的項目一直是用的Surging作為微服務框架的,後來瞭解到了Dapr,發現比較輕量級,開發部署等也非常方便,故將自己的程式升級到了3.0同時框架改成了Dapr,網上查到的好多Dapr文章基本都是大差不同,大都是用的GIT上的示例或者是直接文章翻譯很少有提到實戰上的一些問題,... ...


該篇內容由個人博客點擊跳轉同步更新!轉載請註明出處

前言

之前自己有個core2.2的項目一直是用的Surging作為微服務框架的,後來瞭解到了Dapr,發現比較輕量級,而且像微服務的一些功能比如熔斷啥的也用不到,開發部署等也非常方便,故將自己的程式升級到了3.0同時框架改成了Dapr,網上查到的好多Dapr文章基本都是大差不同,大都是用的GIT上的示例或者是直接文章翻譯很少有提到實戰上的一些問題,下麵我把我自己遇到的一些問題和解決方法記錄一下同時大致講下安裝集成步驟。

前期準備

  1. 安裝 Docker(dapr安裝完後會在Docker中生成兩個容器Dapr_redis和Dapr_placement)
  2. 安裝 Dapr CLI(用於使用Dapr的一些命令)
  3. 安裝 .Net Core SDK 3.0(Dapr只能用於3.0的程式中)
  4. 下載dotnet-sdk(Nuget上暫時只有預覽版,所以直接用源碼集成方便源碼調試)

    註意:安裝dapr cli的時候他會讓你用 一段powershell腳本安裝,但由於國內牆的問題使用不了所以需要xxxxemmmm,另一個辦法就是直接去release下載文件https://github.com/dapr/cli/releases

具體安裝命令步驟啥的不說了,鏈接點擊過去都有介紹

大致集成步驟

具體的如何集成和配置網上都有大家可以看下這篇GIT上的集成步驟,我這裡直接給大家看下我示常式序的項目結構重要的內容會寫在括弧里
項目結構

  1. Clients目錄下都是用於調用服務的客戶端(這裡都是通過ActorProxy的RPC方式調用,有點像SF、akka.net和Orleans,都引用下麵的Service_Interfaces)
  2. Dapr目錄下就是上面下載的Dapr源代碼
  3. CSRedisCore我項目裡面用到了Redis所以把CSRedisCore的源代碼下載了下來
  4. Service_Infrastructure 服務的基礎設施存放一些通用的東西或者幫助類
  5. Service_Interfaces服務的介面都在這裡(引用Dapr.Actors)
  6. Service_Models服務和客戶端用到的模型都在這
  7. Service_Webapi為客戶端提供服務(引用Dapr.Actors和Dapr.Actors.AspNetCore)

具體項目依賴如下圖
依賴

錯誤內容和解決方法

由於目標電腦積極拒絕,無法連接。

ERROR: DaprHttpInteractor:  System.Net.Http.HttpRequestException: 由於目標電腦積極拒絕,無法連接。
 ---> System.Net.Sockets.SocketException (10061): 由於目標電腦積極拒絕,無法連接。

這是由於dotnet-sdk預設調用的埠是3500但你通過Darp運行的程式埠是隨機的所以運行的時候需要指定一個埠通過 -port xx,例如:

dapr run --port 3500 --app-id demo_actor --app-port 5000 dotnet run

或者通過指定程式調用的埠通過設置DAPR_HTTP_PORT的環境變數來指定程式調用埠

ERR_INVOKE_ACTOR

Error converting value "ERR_INVOKE_ACTOR" to type 'System.Nullable

這是由於作者在程式中少寫了這個狀態應該算個bug我提交了issue但還沒回我,具體的在DaprErrorCodes文件中最後加一下就行
錯誤

Actor服務中如何使用依賴註入

對於這個問題有兩個解決方法:

  1. 預設的服務實現中構造函數只能有兩個參數ActorServiceActorId,但是它在註冊的時候提供了另一個構造方法,比如我的一個redis服務構造函數是這樣的,裡面iredisprovider需要通過註入來獲取
    構造函數
    可以在註冊actor的時候提供你所需要的東西,如下
public static IWebHostBuilder CreateHostBuilder(string[] args)=>
            WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseActors(actorRuntime =>
            {
                 //重點
                actorRuntime.RegisterActor<RedisCachesService>((type) => new ActorService(type, (actorService, actorId) => new RedisCachesService(new RedisProvider(),actorService, actorId)));
            })
            .UseUrls($"http://localhost:{5000}/");
  1. 第一個方法有局限性,和自己new對象沒啥區別。所以這裡推薦自己實現一個ServiceLocator用來獲取所需要的服務,簡單寫一下用法,定義一個ServiceLocator類
 public class ServiceLocator
    {
        public static IServiceProvider Current { get; set; }
    }

在startup > configure 中賦值

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            ServiceLocator.Current = app.ApplicationServices;

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseHsts();
        }

在Actor服務中使用

public RedisCachesService(ActorService actorService, ActorId actorId) : base(actorService, actorId)
        {
            using (var scoped=ServiceLocator.Current.CreateScope())
            {
                _cr = scoped.ServiceProvider.GetService<IRedisProvider>().GetInstance();
            }
        }

需要註意的點

1.Actor服務中的每個方法最多只能有一個參數,多個參數的話都變成寫成一個實體進行傳遞,不然會報錯
參數

  1. Dapr提供了一個可視化界面 dashboard 這個暫時有點問題,谷歌打不開,但edge可以,貌似是Angular的BUG,所以推薦大家暫時不要用,因為功能很少不如直接dapr cli方便

    結語

    大致的問題就如上面這些,但我記得還有幾個隔了一天年紀太大忘光了,後續有新問題我會繼續更新。不要問我dapr和其它微服務框架比效率性能哪個好,我也沒試過。這玩意兒既然是微軟開源的我想也不會太差,而且有專業的團隊維護,不出太大意外我想發展肯定是越來越好的。

微信關註我哦!(轉載註明出處)關註我哦


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 從何說起 這來自於我把項目遷移到Asp.Net Core的過程中碰到一個問題。在一個web程式中同時包含了MVC和WebAPI,現在需要給WebAPI部分單獨添加一個介面驗證過濾器 ,常規做法一般是寫好過濾器後給需要的控制器掛上這個標簽,高級點的做法是註冊一個全局過濾器,這樣可以避免每次手動添加同時 ...
  • 新建類庫,右鍵添加 "文本模板" 添加完成之後生成如下尾碼為 tt的文件: 雙擊文件:TextTemplate_Test.tt 文件打開,替換代碼如下 需要更換幾個配置的地方: 1,設置資料庫連接,找到該段代碼:string connectionString ="Data Source=127.0. ...
  • Spire.Cloud.PDF提供了介面PdfConvertApi可用於將PDF文檔轉換為其他格式文檔,如Word(docx/doc)、Html、XPS、SVG、PCL、PS、Png以及XPS轉成PDF。本文將選取其中幾種格式為例,介紹具體轉換方法。 必要步驟: 步驟一:dll文件獲取及導入。 方法 ...
  • 本筆記摘抄自:https://www.cnblogs.com/skylaugh/archive/2011/07/12/2103572.html,記錄一下學習過程以備後續查用。 數據加密技術是網路中最基本的安全技術,主要是通過對網路中傳輸的信息進行數據加密來保障其安全性,這是一種主動安全防禦策略,用很 ...
  • 原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/25/c-7-series-part-10-spant-and-universal-memory-management/ 譯註:這是本系列最後一篇文章 背景 .NET是一個托管平臺,這意味著記憶體訪問 ...
  • 對於C#的開發的網頁程式,一些企業或者工廠可能會運用這些程式去查詢一些資料,考慮到查詢的資料太多,假如一個月的資料就有上萬條數據,在對於查詢資料的SQL語句後時間欄位運用Between.....AND......對查詢時間範圍進行控制,以免撈取數據太多,查詢時間較長。 根據判斷輸入的時間範圍返回的結 ...
  • 1.前端頁面代碼: 前端頁面代碼主要顯示退出系統或者網站的可視化按鈕代碼,代碼如下:(請忽略項目關鍵字:CPU) <ul class="nav navbar-nav navbar-right"> <li class=""> <a href="javascript:;" class="user-pro ...
  • 前言 我們知道,目前大多數應用程式在正式發佈到生產環境之前都會經歷多個不同的測試環境,通過讓應用程式在多個不同的環境中運行來及時發現並解決問題,避免線上上發生不必要的損失。這是對於整個軟體的發佈流程來講。但是如果想讓我們的應用程式線上上環境中通過滿足一些動態條件(比如電商平臺在某一時間段的促銷活動) ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...