使用 Redis 的 SignalR 向外延展 (SignalR 1.x)

作者: Patrick Fletcher

警告

本檔不適用於最新版的 SignalR。 請查看ASP.NET Core SignalR

在本教學課程中,您將使用 Redis 將訊息分散到部署在兩個個別 IIS 實例上的 SignalR 應用程式。

Redis 是記憶體內部索引鍵/值存放區。 它也支援具有發佈/訂閱模型的傳訊系統。 SignalR Redis 背板會使用 pub/sub 功能,將訊息轉送到其他伺服器。

此圖說明 Redis 伺服器之間的關聯性,其訂閱 V Ms、電腦,然後將 V Ms 發佈至 Redis 伺服器。

在本教學課程中,您將使用三部伺服器:

  • 執行 Windows 的兩部伺服器,您將用來部署 SignalR 應用程式。
  • 執行 Linux 的一部伺服器,您將用來執行 Redis。 在本教學課程中,我使用了 Ubuntu 12.04 TLS 的螢幕擷取畫面。

如果您沒有三部實體伺服器可供使用,您可以在 Hyper-V 上建立 VM。 另一個選項是在 Azure 上建立 VM。

雖然本教學課程使用官方 Redis 實作,但 MSOpenTech 也有 Redis 的 Windows 埠 。 設定和設定不同,但否則步驟相同。

注意

具有 Redis 的 SignalR 向外延展不支援 Redis 叢集。

概觀

在我們進入詳細的教學課程之前,以下是您將執行的快速概觀。

  1. 安裝 Redis 並啟動 Redis 伺服器。

  2. 將這些 NuGet 套件新增至您的應用程式:

  3. 建立 SignalR 應用程式。

  4. 將下列程式碼新增至 Global.asax 以設定背板:

    protected void Application_Start()
    {
        GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");
    
        RouteTable.Routes.MapHubs();
        // ...
    }
    

Hyper-V 上的 Ubuntu

使用 Windows Hyper-V,您可以輕鬆地在 Windows Server 上建立 Ubuntu VM。

http://www.ubuntu.com 下載 Ubuntu ISO。

在 Hyper-V 中,新增 VM。 在 [ 連線虛擬硬碟] 步驟中,選取 [建立虛擬硬碟]。

[新增虛擬機器精靈] 的螢幕擷取畫面,其中顯示已醒目提示 [連線虛擬硬碟] 窗格和 [名稱] 欄位。

在 [ 安裝選項] 步驟中,選取 [映射檔 (.iso) ],按一下 [ 流覽],然後流覽至 Ubuntu 安裝 ISO。

[新增虛擬機器精靈] 的螢幕擷取畫面,其中已醒目提示 [安裝選項] 窗格和 [映射檔] 選項。

安裝 Redis

請遵循 中的 http://redis.io/download 步驟下載並建置 Redis。

wget http://redis.googlecode.com/files/redis-2.6.12.tar.gz
tar xzf redis-2.6.12.tar.gz
cd redis-2.6.12
make

這會在 目錄中建置 Redis 二進位檔 src

根據預設,Redis 不需要密碼。 若要設定密碼,請編輯 redis.conf 位於原始程式碼根目錄中的 檔案。 (編輯檔案之前先建立檔案的備份複本!) 將下列指示詞新增至 redis.conf

requirepass YourStrongPassword1234

現在啟動 Redis 伺服器:

src/redis-server redis.conf

Azure User Redis 伺服器視窗的螢幕擷取畫面,其中顯示伺服器資訊,包括伺服器啟動時和記憶體狀態。

開啟埠 6379,這是 Redis 接聽的預設埠。 (您可以變更組態檔中的埠號碼。)

建立 SignalR 應用程式

遵循下列其中一個教學課程來建立 SignalR 應用程式:

接下來,我們將修改聊天應用程式以支援 Redis 的向外延展。 首先,將 SignalR.Redis NuGet 套件新增至您的專案。 在 Visual Studio 的 [ 工具 ] 功能表中,選取 [NuGet 套件管理員],然後選取 [ 套件管理員主控台]。 在 [Package Manager Console] 視窗中,輸入下列命令:

Install-Package Microsoft.AspNet.SignalR.Redis

接下來,開啟 Global.asax 檔案。 將下列程式碼新增至 Application_Start 方法:

protected void Application_Start()
{
    GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");

    RouteTable.Routes.MapHubs();
}
  • 「server」 是執行 Redis 的伺服器名稱。
  • 是埠號碼
  • 「password」 是您在 redis.conf 檔案中定義的密碼。
  • 「AppName」 是任何字串。 SignalR 會使用此名稱建立 Redis pub/sub 通道。

例如:

GlobalHost.DependencyResolver.UseRedis("redis-server.cloudapp.net", 6379,
    "MyStrongPassword1234", "ChatApp");

部署並執行應用程式

準備您的 Windows Server 實例以部署 SignalR 應用程式。

新增 IIS 角色。 包含「應用程式開發」功能,包括 WebSocket 通訊協定。

[新增角色及功能精靈] 的螢幕擷取畫面,其中已醒目提示 [伺服器角色] 和 [Web 通訊端通訊協定] 選項。

也包含 [管理工具] ) 底下所列的管理服務 (。

[新增角色及功能精靈] 的螢幕擷取畫面,其中已醒目提示 [伺服器角色] 和 [I S 管理腳本和工具] 選項。

安裝 Web Deploy 3.0。 當您執行 IIS 管理員時,它會提示您安裝Microsoft Web Platform,或者您可以下載安裝程式。 在 [平臺安裝程式] 中,搜尋 Web Deploy 並安裝 Web Deploy 3.0

Web Platform Installer 4 點 5 搜尋結果畫面的螢幕擷取畫面,其中已醒目提示 [Web Deploy 3 點 0] 選項。

檢查 Web 管理服務是否正在執行。 如果沒有,請啟動服務。 (如果您在 Windows 服務清單中看不到 Web 管理服務,請確定您在新增 IIS 角色時已安裝管理服務。)

根據預設,Web 管理服務會接聽 TCP 埠 8172。 在 Windows 防火牆中,建立新的輸入規則,以允許埠 8172 上的 TCP 流量。 如需詳細資訊,請參閱 設定防火牆規則。 (如果您要在 Azure 上裝載 VM,您可以在 Azure 入口網站中直接執行此動作。請參閱 如何設定虛擬機器的端點。)

現在您已準備好將 Visual Studio 專案從開發電腦部署到伺服器。 在 Solution Explorer中,以滑鼠右鍵按一下解決方案,然後按一下 [發佈]。

如需 Web 部署的詳細檔,請參閱 適用于 Visual Studio 和 ASP.NET 的 Web 部署內容對應

如果您將應用程式部署到兩部伺服器,您可以在個別的瀏覽器視窗中開啟每個實例,並查看它們各自接收來自另一部的 SignalR 訊息。 (當然,在生產環境中,這兩部伺服器會位於負載平衡器後方。)

顯示在 Internet Explorer 網頁瀏覽器中的 Signal R 訊息螢幕擷取畫面,其中顯示 [索引] 畫面。

如果您想要查看傳送至 Redis 的訊息,您可以使用 Redis-cli 用戶端,其會與 Redis 一起安裝。

redis-cli -a password
SUBSCRIBE ChatApp

Azure 使用者輸出畫面的螢幕擷取畫面,其中顯示所有已傳送訊息和隨附程式碼的資訊。