.NET下資料庫的負載均衡“經典方案”(大項目必備,建議收藏)

来源:https://www.cnblogs.com/digital-college/archive/2023/07/31/17593208.html
-Advertisement-
Play Games

【前言】 本文講述的“資料庫負載均衡”方案,為市面上最經典(沒有之一),由.NET界骨灰級大佬推出。採用該技術方案的大公司,一年省下了幾個億的支出。 【正文】 支持.Net Core(2.0及以上) 與 .Net Framework(4.5及以上) 可以部署在Docker, Windows, Lin ...


【前言】

本文講述的“資料庫負載均衡”方案,為市面上最經典(沒有之一),由.NET界骨灰級大佬推出。採用該技術方案的大公司,一年省下了幾個億的支出。

 

【正文】

支持.Net Core(2.0及以上)  與 .Net Framework(4.5及以上)

可以部署在Docker, Windows, Linux, Mac。

為了演示資料庫的負載均衡(Load Balance),我們先創建三個資料庫,它們的名字分別為YZZ、YZZ1、YZZ2。然後在這三個資料庫中分別創建表t_Student,這些表的結構一樣,內容稍有差異,見下圖:

YZZ中t_Student的內容

---------------------

Id  Name  Age

1   張安   25

2   王鑫   22

3   周雲   20

YZZ1中t_Student的內容

---------------------

Id  Name  Age

1   張安1  25

2   王鑫1  22

3   周雲1  20

YZZ2中t_Student的內容

---------------------

Id  Name  Age

1   張安2  25

2   王鑫2  22

3   周雲2  20

 

接下來,

若是在.Net Core環境下,我們需要創建一個名為DeveloperSharp.json的配置文件,併在其中設置如上三個數據源的負載均衡策略。文件內容如下:

{
  "DeveloperSharp":
  {
     "DatabaseClusterList":
     [
        {
           "Id":"StudentData",
           "DatabaseCluster":
           [
                 {
                     "Id":"A1",
                     "Enable":"true",
                     "Weight":"100",
                     "DatabaseType":"SqlServer",
                     "ConnectionString":"Server=localhost;Database=YZZ;Uid=sa;Pwd=123"
                 },
                 {
                     "Id":"A2",
                     "Enable":"true",
                     "Weight":"100",
                     "DatabaseType":"SqlServer",
                     "ConnectionString":"Server=localhost;Database=YZZ1;Uid=sa;Pwd=123"
                 },
                 {
                     "Id":"A3",
                     "Enable":"true",
                     "Weight":"100",
                     "DatabaseType":"SqlServer",
                     "ConnectionString":"Server=localhost;Database=YZZ2;Uid=sa;Pwd=123"
                 }
           ]
        }
     ]
  }
}

 

若是在.Net Framework環境下,我們需要創建一個名為DeveloperSharp.xml的配置文件,併在其中設置如上三個數據源的負載均衡策略。文件內容如下:

<?xml version="1.0" encoding="utf-8" ?>
<DeveloperSharp>
    <DatabaseClusterList>
        <DatabaseCluster Id="StudentData">
            <Database Id="A1" Enable="true" Weight="100" DatabaseType="SqlServer" ConnectionString="Server=localhost;Database=YZZ;Uid=sa;Pwd=123"/>
            <Database Id="A2" Enable="true" Weight="100" DatabaseType="SqlServer" ConnectionString="Server=localhost;Database=YZZ1;Uid=sa;Pwd=123"/>
            <Database Id="A3" Enable="true" Weight="100" DatabaseType="SqlServer" ConnectionString="Server=localhost;Database=YZZ2;Uid=sa;Pwd=123"/>
        </DatabaseCluster>
    </DatabaseClusterList> 
</DeveloperSharp>

 

對此json/xml配置文件說明如下:

(1)     每一個DatabaseCluster節點代表了一組資料庫,此節點的Id值(本文示例值是:StudentData)後續會在程式中使用。

(2)     Database節點中的Weight屬性代表了使用權重。本文示例的三個資料庫的Weight值分別是100、100、100,則這三個資料庫的負載均衡使用分配比例將會是1:1:1。若把這三個值分別設置為100、50、50,則這三個資料庫的使用分配比例將會變為2:1:1。設置成你想要的比例吧。

(3)     Database節點中的Enable屬性代表了是否可用。true代表可用,false代表不可用。

(4)     可通過把DatabaseType屬性的值設置為“MySql”、“SQLite”、“PostgreSql”、“Oracle”、其它等等,從而支持各種類資料庫。(本文講述的是“同種資料庫”的負載均衡。若是需要“異種資料庫”的負載均衡,請參看 資料庫的負載均衡(續) 這篇文章)

 

接下來,我們看看怎麼在程式中使用上述的這組資料庫及其配置文件,來實現負載均衡。

為了演示負載均衡效果,我們首先在Visual Studio中新建一個控制台工程,併為工程引用添加了Entity Framework組件作為訪問資料庫的工具(你也可以換成其它資料庫訪問工具,原理一樣,完全不受影響)。

然後,我們做如下四個操作。

【第一步】:從NuGet引用DeveloperSharp包(需要是最新版本)。

【第二步】:鏈接負載均衡配置文件:

若是在.Net Core環境下,我們只需要把DeveloperSharp.json文件放到程式執行目錄中(即bin目錄下與dll、exe等文件的同一目錄中)(放錯了位置會報錯)。

若是在.Net Framework環境下,我們需要在工程配置文件App.config中添加appSettings節點,節點內容如下:

  <appSettings>
    <add key="DatabaseType" value="" />
    <add key="ConnectionString" value="" />
    <add key="ErrorPage" value="" />
    <add key="ErrorLog" value="D:\Test\Assist\log.txt" />
    <add key="ConfigFile" value="D:\Test\Assist\DeveloperSharp.xml" />
  </appSettings>

其中,ConfigFile的設置是為了鏈接前述的DeveloperSharp.xml這個配置文件。ErrorLog則是設置一個錯誤日誌文件。它們均需要設置為文件的“絕對路徑”(此處使用“絕對路徑”而不是“相對路徑”,一是有利於安全性,二是有利於分散式部署)

【第三步】:創建一個StudentLB.cs類文件,它就是資料庫負載均衡的核心器件,內容如下:

    //這個屬性就是用作映射負載均衡。
    //其“值”需設置為前述DeveloperSharp.json/xml配置文件中某個DatabaseCluster節點的Id值。
    [DeveloperSharp.Structure.Model.LoadBalance.DataSourceCluster("StudentData")]
    public class StudentLB : DeveloperSharp.Structure.Model.DataLayer
    {
        //類中沒有任何代碼
    }

說明:“負載均衡器”類(本篇為:StudentLB類)必須繼承自DeveloperSharp.Structure.Model.DataLayer類,並且在其上設置DeveloperSharp.Structure.Model.LoadBalance.DataSourceCluster屬性的初始化值為DeveloperSharp.json/xml配置文件中某個DatabaseCluster節點的Id值。

 

【第四步】:為控制台應用類,添加通過負載均衡器(StudentLB類)訪問資料庫的代碼,註意:核心代碼就一行而已!!此示例連續3次訪問資料庫做同一操作,看會顯示什麼結果。如下:

    class Program
    {
        static void Main(string[] args)
        {
            string NameList = "";

            //第一次訪問資料庫
            var SLB = (new StudentLB()) as DeveloperSharp.Structure.Model.DataLayer;
            var db = new Entities(SLB.IDA.ConnectionString);//每次會根據配置的負載均衡策略輸出對應的ConnectionString
            t_Student Stu = db.t_Student.Where(t => t.Id == 3).FirstOrDefault();
            NameList += Stu.Name;

            //第二次訪問資料庫
            SLB = (new StudentLB()) as DeveloperSharp.Structure.Model.DataLayer;
            db = new Entities(SLB.IDA.ConnectionString);//每次會根據配置的負載均衡策略輸出對應的ConnectionString
            Stu = db.t_Student.Where(t => t.Id == 3).FirstOrDefault();
            NameList += Stu.Name;

            //第三次訪問資料庫
            SLB = (new StudentLB()) as DeveloperSharp.Structure.Model.DataLayer;
            db = new Entities(SLB.IDA.ConnectionString);//每次會根據配置的負載均衡策略輸出對應的ConnectionString
            Stu = db.t_Student.Where(t => t.Id == 3).FirstOrDefault();
            NameList += Stu.Name;

            //輸出
            Console.WriteLine(NameList);
            Console.ReadLine();

        }
    }

從以上示例代碼我們可以清晰的得知:其實資料庫鏈接字元串ConnectionString就是實現負載均衡的關鍵所在。而SLB.IDA.ConnectionString則每次會根據配置的負載均衡策略輸出對應的鏈接字元串。

 

示常式序輸出顯示結果如下:

周雲周雲1周雲2

 

運行有問題,需要技術支持?以及bug提交通道,請添加微信:894988403

運行有問題,需要技術支持?以及bug提交通道,請添加微信:894988403

 

最後提示兩點:

(1)本文設置了一組資料庫的負載均衡。但其實可以在DeveloperSharp.json/xml配置文件及程式中設置多組資料庫的負載均衡。

(2)若要把一組資料庫的負載均衡應用改為單資料庫應用,只需要把DeveloperSharp.json/xml配置文件中DatabaseCluster節點下的Database節點數量設置為一個即可實現。所以,聰明的你以後可以把你所有的資料庫訪問代碼改為此負載均衡模式,以便日後隨時在單體/集群之間切換,以備不時之需:)

 

總結

本文技術點思路梳理:

  1. 創建用來實施負載均衡的一組資料庫。
  2. 通過DeveloperSharp.json/xml來配置負載均衡策略。
  3. 調整DeveloperSharp.json的位置,或者,在App.config/Web.config中添加鏈接DeveloperSharp.xml的appSettings節點。
  4. 創建基於DeveloperSharp包的“負載均衡器”類(本篇為:StudentLB類)。
  5. 通過“負載均衡器”產生的ConnectionString鏈接資料庫。

 

運行有問題,需要技術支持?以及bug提交通道,請添加微信:894988403

運行有問題,需要技術支持?以及bug提交通道,請添加微信:894988403

 

原文鏈接:http://www.developersharp.cc/content1.html

服務條款:http://www.developersharp.cc/buy.html

  

文章首發於公眾號【.Net數字智慧化基地】,歡迎大家關註。

.Net數字智慧化基地

【.Net數字智慧化基地】:本號長期專註於.Net技術、軟體架構、人工智慧、工業互聯網、智能製造、等領域。作者早年畢業於一流大學並已是IT科技領域成功人士。本號致力於提高圈內整體技術素養,為各類初、中、高級技術人員提供量身定製的個人成長服務,助力升職加薪。本號同時也為有數字化轉型需求的各類企業提供深度咨詢、指導服務。


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

-Advertisement-
Play Games
更多相關文章
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...