前言:本系列文章適合有初/中級.NET知識的同學閱讀。
(1)本系列文章,旨在講述研發一個中大型項目所需要了解的一系列“基本構件”,並提供這些“基本構件”的【最簡單】、【最快速】使用方法!!(並不深究技術原理)
(2)通過閱讀本系列文章,能讓你在正規“項目研發”方面快速入門+進階,並能達成“小團隊構建大網站”的目的。
(3)本系列文章采用的技術,已成功應用到人工智能、產業互聯網、社區電商、游戲、金融風控、智慧醫療、等項目上。
限時下載:
數據庫的負載均衡-示例代碼(dp1-DbBalance.rar)
支持.Net/.Net Core/.Net Framework,可以部署在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 Core版本在Visual Studio“調試”時,不會在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
最后提示兩點:
(1)本文設置了一組數據庫的負載均衡。但其實可以在DeveloperSharp.json/xml配置文件及程序中設置多組數據庫的負載均衡。
(2)若要把一組數據庫的負載均衡應用改為單數據庫應用,只需要把DeveloperSharp.json/xml配置文件中DatabaseCluster節點下的Database節點數量設置為一個即可實現。所以,聰明的你以后可以把你所有的數據庫訪問代碼改為此負載均衡模式,以便日后隨時在單體/集群之間切換,以備不時之需:)
總結
本文技術點思路梳理:
- 創建用來實施負載均衡的一組數據庫。
- 通過DeveloperSharp.json/xml來配置負載均衡策略。
- 調整DeveloperSharp.json的位置,或者,在App.config/Web.config中添加鏈接DeveloperSharp.xml的appSettings節點。
- 創建基於DeveloperSharp包的“負載均衡器”類(本篇為:StudentLB類)。
- 通過“負載均衡器”產生的ConnectionString鏈接數據庫。
【附注】:下載示例均已成功運行通過。但有些輔助設置需要自己調整。技術支持+獲取更多寶貴資源:請微信掃描文末二維碼,備注“進群”!
推薦閱讀
- .NET中大型項目開發必備(1)–UUID全球通用唯一識別碼
- .NET中大型項目開發必備(2)–CORS跨域訪問
- .NET中大型項目開發必備(3)–數據庫的負載均衡
- .NET中大型項目開發必備(4)–數據庫的讀寫分離
- .NET中大型項目開發必備(5)–Web服務/WebApi的負載均衡
- .NET中大型項目開發必備(6)–IUtility工具介紹
- .NET中大型項目開發必備(7)–DataAccess數據庫訪問技術
- .NET中大型項目開發必備(8)–高效分頁
- .NET中大型項目開發必備(9)--http請求調用(Post與Get)
- .NET中大型項目開發必備(10)--圖片的裁剪、縮放、與加水印
- .NET中大型項目開發必備(11)--使用Redis緩存
- .NET中大型項目開發必備(12)--使用MQ消息隊列
- .NET中大型項目開發必備(13)--DataAccess數據庫訪問技術(續)
- .NET中大型項目開發必備(14)--數據庫的負載均衡(續)