【前言】
本文講述的“數(shù)據(jù)庫負(fù)載均衡”方案,為市面上最經(jīng)典(沒有之一),由.NET界骨灰級(jí)大佬推出。采用該技術(shù)方案的大公司,一年省下了幾個(gè)億的支出。
?
【正文】
支持.Net Core(2.0及以上)? 與 .Net Framework(4.5及以上)
可以部署在Docker, Windows, Linux, Mac。
為了演示數(shù)據(jù)庫的負(fù)載均衡(Load Balance),我們先創(chuàng)建三個(gè)數(shù)據(jù)庫,它們的名字分別為YZZ、YZZ1、YZZ2。然后在這三個(gè)數(shù)據(jù)庫中分別創(chuàng)建表t_Student,這些表的結(jié)構(gòu)一樣,內(nèi)容稍有差異,見下圖:
YZZ中t_Student的內(nèi)容 --------------------- Id? Name? Age 1?? 張安 ??25 2?? 王鑫 ??22 3?? 周云 ??20 |
YZZ1中t_Student的內(nèi)容 --------------------- Id? Name? Age 1?? 張安1 ?25 2?? 王鑫1 ?22 3?? 周云1 ?20 |
YZZ2中t_Student的內(nèi)容 --------------------- Id? Name? Age 1?? 張安2 ?25 2?? 王鑫2 ?22 3?? 周云2 ?20 |
?
接下來,
若是在.Net Core環(huán)境下,我們需要?jiǎng)?chuàng)建一個(gè)名為DeveloperSharp.json的配置文件,并在其中設(shè)置如上三個(gè)數(shù)據(jù)源的負(fù)載均衡策略。文件內(nèi)容如下:
{ "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環(huán)境下,我們需要?jiǎng)?chuàng)建一個(gè)名為DeveloperSharp.xml的配置文件,并在其中設(shè)置如上三個(gè)數(shù)據(jù)源的負(fù)載均衡策略。文件內(nèi)容如下:
<?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>
?
對(duì)此json/xml配置文件說明如下:
(1)???? 每一個(gè)DatabaseCluster節(jié)點(diǎn)代表了一組數(shù)據(jù)庫,此節(jié)點(diǎn)的Id值(本文示例值是:StudentData)后續(xù)會(huì)在程序中使用。
(2)???? Database節(jié)點(diǎn)中的Weight屬性代表了使用權(quán)重。本文示例的三個(gè)數(shù)據(jù)庫的Weight值分別是100、100、100,則這三個(gè)數(shù)據(jù)庫的負(fù)載均衡使用分配比例將會(huì)是1:1:1。若把這三個(gè)值分別設(shè)置為100、50、50,則這三個(gè)數(shù)據(jù)庫的使用分配比例將會(huì)變?yōu)?:1:1。設(shè)置成你想要的比例吧。
(3)???? Database節(jié)點(diǎn)中的Enable屬性代表了是否可用。true代表可用,false代表不可用。
(4)? ? ?可通過把DatabaseType屬性的值設(shè)置為“MySql”、“SQLite”、“PostgreSql”、“Oracle”、其它等等,從而支持各種類數(shù)據(jù)庫。(本文講述的是“同種數(shù)據(jù)庫”的負(fù)載均衡。若是需要“異種數(shù)據(jù)庫”的負(fù)載均衡,請(qǐng)參看?數(shù)據(jù)庫的負(fù)載均衡(續(xù))?這篇文章)
?
接下來,我們看看怎么在程序中使用上述的這組數(shù)據(jù)庫及其配置文件,來實(shí)現(xiàn)負(fù)載均衡。
為了演示負(fù)載均衡效果,我們首先在Visual Studio中新建一個(gè)控制臺(tái)工程,并為工程引用添加了Entity Framework組件作為訪問數(shù)據(jù)庫的工具(你也可以換成其它數(shù)據(jù)庫訪問工具,原理一樣,完全不受影響)。
然后,我們做如下四個(gè)操作。
【第一步】:從NuGet引用DeveloperSharp包(需要是最新版本)。
【第二步】:鏈接負(fù)載均衡配置文件:
若是在.Net Core環(huán)境下,我們只需要把DeveloperSharp.json文件放到程序執(zhí)行目錄中(即bin目錄下與dll、exe等文件的同一目錄中)(放錯(cuò)了位置會(huì)報(bào)錯(cuò))。
若是在.Net Framework環(huán)境下,我們需要在工程配置文件App.config中添加appSettings節(jié)點(diǎn),節(jié)點(diǎn)內(nèi)容如下:
<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的設(shè)置是為了鏈接前述的DeveloperSharp.xml這個(gè)配置文件。ErrorLog則是設(shè)置一個(gè)錯(cuò)誤日志文件。它們均需要設(shè)置為文件的“絕對(duì)路徑”(此處使用“絕對(duì)路徑”而不是“相對(duì)路徑”,一是有利于安全性,二是有利于分布式部署)
【第三步】:創(chuàng)建一個(gè)StudentLB.cs類文件,它就是數(shù)據(jù)庫負(fù)載均衡的核心器件,內(nèi)容如下:
//這個(gè)屬性就是用作映射負(fù)載均衡。 //其“值”需設(shè)置為前述DeveloperSharp.json/xml配置文件中某個(gè)DatabaseCluster節(jié)點(diǎn)的Id值。 [DeveloperSharp.Structure.Model.LoadBalance.DataSourceCluster("StudentData")] public class StudentLB : DeveloperSharp.Structure.Model.DataLayer { //類中沒有任何代碼 }
說明:“負(fù)載均衡器”類(本篇為:StudentLB類)必須繼承自DeveloperSharp.Structure.Model.DataLayer類,并且在其上設(shè)置DeveloperSharp.Structure.Model.LoadBalance.DataSourceCluster屬性的初始化值為DeveloperSharp.json/xml配置文件中某個(gè)DatabaseCluster節(jié)點(diǎn)的Id值。
?
【第四步】:為控制臺(tái)應(yīng)用類,添加通過負(fù)載均衡器(StudentLB類)訪問數(shù)據(jù)庫的代碼,注意:核心代碼就一行而已?。〈耸纠B續(xù)3次訪問數(shù)據(jù)庫做同一操作,看會(huì)顯示什么結(jié)果。如下:
class Program { static void Main(string[] args) { string NameList = ""; //第一次訪問數(shù)據(jù)庫 var SLB = (new StudentLB()) as DeveloperSharp.Structure.Model.DataLayer; var db = new Entities(SLB.IDA.ConnectionString);//每次會(huì)根據(jù)配置的負(fù)載均衡策略輸出對(duì)應(yīng)的ConnectionString t_Student Stu = db.t_Student.Where(t => t.Id == 3).FirstOrDefault(); NameList += Stu.Name; //第二次訪問數(shù)據(jù)庫 SLB = (new StudentLB()) as DeveloperSharp.Structure.Model.DataLayer; db = new Entities(SLB.IDA.ConnectionString);//每次會(huì)根據(jù)配置的負(fù)載均衡策略輸出對(duì)應(yīng)的ConnectionString Stu = db.t_Student.Where(t => t.Id == 3).FirstOrDefault(); NameList += Stu.Name; //第三次訪問數(shù)據(jù)庫 SLB = (new StudentLB()) as DeveloperSharp.Structure.Model.DataLayer; db = new Entities(SLB.IDA.ConnectionString);//每次會(huì)根據(jù)配置的負(fù)載均衡策略輸出對(duì)應(yīng)的ConnectionString Stu = db.t_Student.Where(t => t.Id == 3).FirstOrDefault(); NameList += Stu.Name; //輸出 Console.WriteLine(NameList); Console.ReadLine(); } }
從以上示例代碼我們可以清晰的得知:其實(shí)數(shù)據(jù)庫鏈接字符串ConnectionString就是實(shí)現(xiàn)負(fù)載均衡的關(guān)鍵所在。而SLB.IDA.ConnectionString則每次會(huì)根據(jù)配置的負(fù)載均衡策略輸出對(duì)應(yīng)的鏈接字符串。
?
示例程序輸出顯示結(jié)果如下:
周云周云1周云2
?
運(yùn)行有問題,需要技術(shù)支持?以及bug提交通道,請(qǐng)?zhí)砑游⑿牛?94988403
運(yùn)行有問題,需要技術(shù)支持?以及bug提交通道,請(qǐng)?zhí)砑游⑿牛?94988403
?
最后提示兩點(diǎn):
(1)本文設(shè)置了一組數(shù)據(jù)庫的負(fù)載均衡。但其實(shí)可以在DeveloperSharp.json/xml配置文件及程序中設(shè)置多組數(shù)據(jù)庫的負(fù)載均衡。
(2)若要把一組數(shù)據(jù)庫的負(fù)載均衡應(yīng)用改為單數(shù)據(jù)庫應(yīng)用,只需要把DeveloperSharp.json/xml配置文件中DatabaseCluster節(jié)點(diǎn)下的Database節(jié)點(diǎn)數(shù)量設(shè)置為一個(gè)即可實(shí)現(xiàn)。所以,聰明的你以后可以把你所有的數(shù)據(jù)庫訪問代碼改為此負(fù)載均衡模式,以便日后隨時(shí)在單體/集群之間切換,以備不時(shí)之需:)
?
總結(jié)
本文技術(shù)點(diǎn)思路梳理:
- 創(chuàng)建用來實(shí)施負(fù)載均衡的一組數(shù)據(jù)庫。
- 通過DeveloperSharp.json/xml來配置負(fù)載均衡策略。
- 調(diào)整DeveloperSharp.json的位置,或者,在App.config/Web.config中添加鏈接DeveloperSharp.xml的appSettings節(jié)點(diǎn)。
- 創(chuàng)建基于DeveloperSharp包的“負(fù)載均衡器”類(本篇為:StudentLB類)。
- 通過“負(fù)載均衡器”產(chǎn)生的ConnectionString鏈接數(shù)據(jù)庫。
?
運(yùn)行有問題,需要技術(shù)支持?以及bug提交通道,請(qǐng)?zhí)砑游⑿牛?94988403
運(yùn)行有問題,需要技術(shù)支持?以及bug提交通道,請(qǐng)?zhí)砑游⑿牛?94988403
?
原文鏈接:http://www.developersharp.cc/content1.html
服務(wù)條款:http://www.developersharp.cc/buy.html
??
文章首發(fā)于公眾號(hào)【.Net數(shù)字智慧化基地】,歡迎大家關(guān)注。
文章來源:http://www.zghlxwxcb.cn/news/detail-617795.html
【.Net數(shù)字智慧化基地】:本號(hào)長(zhǎng)期專注于.Net技術(shù)、軟件架構(gòu)、人工智能、工業(yè)互聯(lián)網(wǎng)、智能制造、等領(lǐng)域。作者早年畢業(yè)于一流大學(xué)并已是IT科技領(lǐng)域成功人士。本號(hào)致力于提高圈內(nèi)整體技術(shù)素養(yǎng),為各類初、中、高級(jí)技術(shù)人員提供量身定制的個(gè)人成長(zhǎng)服務(wù),助力升職加薪。本號(hào)同時(shí)也為有數(shù)字化轉(zhuǎn)型需求的各類企業(yè)提供深度咨詢、指導(dǎo)服務(wù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-617795.html
到了這里,關(guān)于.NET下數(shù)據(jù)庫的負(fù)載均衡“經(jīng)典方案”(大項(xiàng)目必備,建議收藏)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!