您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何搭建分布式ASP.NET Core Web”,在日常操作中,相信很多人在如何搭建分布式ASP.NET Core Web問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何搭建分布式ASP.NET Core Web”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
單臺Web處理用戶請求的能力是有限的,因此我們可能會需要搭建分布式的Web服務(wù)器。
當(dāng)前市面上,可能用的比較多的是會話保持,這種模式下,開發(fā)者只需將先前開發(fā)好的、不支持會話共享的程序部署在多臺服務(wù)器上,負載均衡提供商會要求開發(fā)者設(shè)置保持時間,就可以完成部署。但其缺點是僅僅將用戶分配到不同節(jié)點,不是將請求分配到不同節(jié)點,粒度過大,會導(dǎo)致負載不夠均衡。
下面我們從各個角度介紹一下如何讓你的ASP.NET Core網(wǎng)站系統(tǒng)擺脫會話保持
分布式Web的第一大棘手問題就是登錄狀態(tài)。ASP.NET Core中默認是將Session ID進行保護的,因此這些數(shù)據(jù)是被加密過的,并以xml文件形式存在保護區(qū),因此我們要將這個文件共享出來。
因此我們需要實現(xiàn)Session Sharing,對于不同平臺,我們有不同的做法(在ASP.NET Core 1.1.0發(fā)布前,我們只能通過文件系統(tǒng)進行共享):
在Windows中,我們使用UNC路徑來實現(xiàn)共享。首先建立一個文件夾,在共享中賦予Guest用戶讀寫權(quán)限。
Linux中我們需要安裝nfs來實現(xiàn)共享,首先選擇一個節(jié)點,作為nfs服務(wù)器(假設(shè)IP為10.0.0.254)
apt-get install nfs-kernel-serve
接下來創(chuàng)建一個文件夾:
mkdir /share
下面編輯nfs配置文件,以配置欲共享的路徑
vi /etc/exports
在這個配置文件里,我們配置三個參數(shù):路徑、IP或IP段、讀寫權(quán)限。每行表示一條記錄,可以重復(fù)。
/share 10.0.0.1/24(rw,sync,no_subtree_check) /share 10.0.1.1/24(rw,sync,no_subtree_check)
保存后,重啟nfs服務(wù)
service nfs-kernel-server restart
至此NFS服務(wù)器就部署完畢了,下面在各個節(jié)點中掛在nfs共享的文件夾。
安裝portmap:
apt-get install portmap nfs-common
在每臺節(jié)點中創(chuàng)建文件夾,作為掛載路徑:
mkdir /share-remote mount -t nfs 10.0.0.254:/share /share-remote
至此即完成了共享
我們需要為我們的ASP.NET Core程序配置DataProtect,讓其將xml文件保存至共享路徑中,進入Startup.cs
,添加AddDataProtection,并指定路徑:
public void ConfigureServices(IServiceCollection services)
{
#if WINDOWS services.AddDataProtection() .PersistKeysToFileSystem(
new DirectoryInfo(@"\\10.0.0.254\share"));
#elif LINUX services.AddDataProtection() .PersistKeysToFileSystem(
new DirectoryInfo(@"/share-remote"));
#elif REDIS_ON_NET_CORE_1_1_0
// ASP.NET Core 1.1.0 新增將Session ID存儲至Redis中 var redis = ConnectionMultiplexer.Connect("10.0.0.254"); serviceCollection.AddDataProtection() .PersistKeysToRedis(redis, "DATA_PROTECTION_KEYS_");
#endif}
DataProtect配置過后,需要配置分布式緩存:
services.AddDistributedRedisCache(x =>
{
x.InstanceName = "SESSION_INSTANCE_";
x.Configuration = "10.0.0.254";
// StackExchange.Redis Connection String});
services.AddSession(x =>
{
x.IdleTimeout = new TimeSpan(1, 0, 0);
});
配置好分布式緩存后,session就已經(jīng)可以share了,包括使用了Identity的網(wǎng)站也同時受益,擺脫了對會話保持的依賴。
如果網(wǎng)站使用了SignalR,那么需要將SignalR消息推送到各個節(jié)點,就需要使用Redis來Scale out SignalR:
進入project.json
來添加Pomelo.AspNetCore.SignalR.Redis
包,版本為0.1.0
在ConfigureServices
中添加下面的代碼
services.AddRedis(x =>
{
x.ConnectionString = "10.0.0.254";
// StackExchange.Redis Connection String
x.Database = 0;
x.EventKey = "SIGNALR_INSTANCE";
})
.AddSignalR(options =>
{
options.Hubs.EnableDetailedErrors = true;
});
現(xiàn)在SignalR的消息就在各個節(jié)點中互通了。
到此,關(guān)于“如何搭建分布式ASP.NET Core Web”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。