溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何搭建分布式ASP.NET Core Web

發(fā)布時間:2021-12-06 14:32:02 來源:億速云 閱讀:201 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“如何搭建分布式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)擺脫會話保持

Session Sharing

分布式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

在Windows中,我們使用UNC路徑來實現(xiàn)共享。首先建立一個文件夾,在共享中賦予Guest用戶讀寫權(quán)限。

如何搭建分布式ASP.NET Core Web

Linux

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)站也同時受益,擺脫了對會話保持的依賴。

SignalR Scale Out

如果網(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>

向AI問一下細節(jié)

免責(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)容。

AI