windows平台的分布式微服務解決方案(3)--數據庫的負載均衡


本文技術點思路梳理:

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

 

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

 

然后,我們在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>

 

對此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代表不可用。

 

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

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

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

【第一步】:為工程引用添加DeveloperSharp.dll這個核心組件。

【第二步】:在工程配置文件App.config(或Web.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.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.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

 

 

最后提示一點:若要把一組數據庫的負載均衡應用改為單數據庫應用,只需要把DeveloperSharp.xml配置文件中DatabaseCluster節點下的Database節點數量設置為一個即可實現。

【本文采用.NET/C#語言撰寫,如需其它語言版本,請聯系作者索取。】
【本文采用Sql Server數據庫撰寫,如需其它數據庫版本,請聯系作者索取。】

 

相關下載:

數據庫的負載均衡-示例代碼(dp1-DbBalance.rar)

數據庫的負載均衡-示例代碼(dp1-DbBalance.rar)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM