.NET下資料庫的負載均衡(有趣實驗)

2022-09-26 18:01:47

相關下載:

資料庫的負載均衡-範例程式碼(dp1-DbBalance.rar)

資料庫的負載均衡-範例程式碼(dp1-DbBalance.rar)

支援.Net/.Net Core/.Net Framework

為了演示資料庫的負載均衡(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

 

然後,我們在ds.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>

 

對此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)     .Net6中可通過把DatabaseType屬性的值設定為「MySql」、「SQLite」、「PostgreSql」、「Oracle」、其它等等,從而支援各種類資料庫。

 

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

為了演示負載均衡效果,我們首先在Visual Studio中新建一個控制檯工程,併為工程參照新增了Entity Framework元件作為存取資料庫的工具(你也可以換成其它資料庫存取工具,原理一樣,完全不受影響)。

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

【第一步】:從NuGet參照DeveloperSharp包。

【第二步】:在工程組態檔App.config(.Net6/VS2022中亦可新增此組態檔)中新增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\ds.xml" />
  </appSettings>

其中,ConfigFile的設定是為了連結前述的ds.xml這個組態檔。ErrorLog則是設定一個錯誤紀錄檔檔案。它們均需要設定為檔案的「絕對路徑」(此處使用「絕對路徑」而不是「相對路徑」,一是有利於安全性,二是有利於分散式部署)

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

    //這個屬性就是用作對映負載均衡。
    //其「值」需設定為前述ds.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屬性的初始化值為ds.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

 

 

最後提示一點:若要把一組資料庫的負載均衡應用改為單資料庫應用,只需要把ds.xml組態檔中DatabaseCluster節點下的Database節點數量設定為一個即可實現。所以,聰明的你以後可以把你所有的資料庫存取程式碼改為本文樣式:)

 

總結

本文技術點思路梳理:

  1. 建立用來實施負載均衡的一組資料庫。
  2. 通過ds.xml來設定負載均衡策略。
  3. 在App.config/Web.config中新增連結ds.xml的appSettings節點。
  4. 建立基於DeveloperSharp包的「負載均衡器」類(本篇為:StudentLB類)。
  5. 通過「負載均衡器」產生的ConnectionString連結資料庫。

 

【附註】:文章開頭給出的下載範例,均已成功執行通過。但有些輔助內容需要自己建立/設定(比如:資料庫建立、連結字串設定、檔案設定、路徑設定、引數設定、等等...)。調式時若遇異常報錯,請仔細閱讀+理解本文。技術交流/支援,請微信掃描二維條碼,備註「進群」!