搭建分布式 ASP.NET Core Web
單臺Web處理用戶請求的能力是有限的,因此我們可能會需要搭建分布式的Web服務器。
當前市面上,可能用的比較多的是會話保持,這種模式下,開發者只需將先前開發好的、不支持會話共享的程序部署在多臺服務器上,負載均衡提供商會要求開發者設置保持時間,就可以完成部署。但其缺點是僅僅將用戶分配到不同節點,不是將請求分配到不同節點,粒度過大,會導致負載不夠均衡。
下面我們從各個角度介紹一下如何讓你的ASP.NET Core網站系統擺脫會話保持
Session Sharing
分布式Web的第一大棘手問題就是登錄狀態。ASP.NET Core中默認是將Session ID進行保護的,因此這些數據是被加密過的,并以xml文件形式存在保護區,因此我們要將這個文件共享出來。
因此我們需要實現Session Sharing,對于不同平臺,我們有不同的做法(在ASP.NET Core 1.1.0發布前,我們只能通過文件系統進行共享):
Windows
在Windows中,我們使用UNC路徑來實現共享。首先建立一個文件夾,在共享中賦予Guest用戶讀寫權限。
Linux
Linux中我們需要安裝nfs來實現共享,首先選擇一個節點,作為nfs服務器(假設IP為10.0.0.254)
apt-get install nfs-kernel-serve接下來創建一個文件夾:
mkdir /share下面編輯nfs配置文件,以配置欲共享的路徑
vi /etc/exports在這個配置文件里,我們配置三個參數:路徑、IP或IP段、讀寫權限。每行表示一條記錄,可以重復。
/share ? ? 10.0.0.1/24(rw,sync,no_subtree_check) /share ? ? 10.0.1.1/24(rw,sync,no_subtree_check)保存后,重啟nfs服務
service nfs-kernel-server restart至此NFS服務器就部署完畢了,下面在各個節點中掛在nfs共享的文件夾。
安裝portmap:
apt-get install portmap nfs-common在每臺節點中創建文件夾,作為掛載路徑:
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就已經可以share了,包括使用了Identity的網站也同時受益,擺脫了對會話保持的依賴。
SignalR Scale Out
如果網站使用了SignalR,那么需要將SignalR消息推送到各個節點,就需要使用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 Stringx.Database = 0;x.EventKey = "SIGNALR_INSTANCE"; }) .AddSignalR(options => {options.Hubs.EnableDetailedErrors = true; });
現在SignalR的消息就在各個節點中互通了。
原文鏈接:http://www.1234.sh/post/asp-net-core-distributed-web-server
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的搭建分布式 ASP.NET Core Web的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows Server 2016提
- 下一篇: .Net开源微型ORM框架测评