使用 Redis 的 SignalR 横向扩展 (SignalR 1.x)

作者 :Patrick Fletcher

警告

本文档不适用于最新版本的 SignalR。 查看 ASP.NET Core SignalR

在本教程中,你将使用 Redis 跨部署在两个单独的 IIS 实例上的 SignalR 应用程序分发消息。

Redis 是内存中键值存储。 它还支持具有发布/订阅模型的消息传送系统。 SignalR Redis 底板使用发布/订阅功能将消息转发到其他服务器。

此图说明了订阅 V Ms 的 Redis 服务器与计算机之间的关系,计算机随后将 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 用户 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 的服务器的名称。
  • port 是端口号
  • “password”是在 redis.conf 文件中定义的密码。
  • “AppName”是任意字符串。 SignalR 使用此名称创建 Redis 发布/订阅通道。

例如:

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

部署和运行应用程序

准备 Windows Server 实例以部署 SignalR 应用程序。

添加 IIS 角色。 包括“应用程序开发”功能,包括 WebSocket 协议。

“添加角色和功能向导”的屏幕截图,其中突出显示了“服务器角色”和“Web 套接字协议”选项。

还包括“管理工具”) 下列出的管理服务 (。

“添加角色和功能向导”的屏幕截图,其中突出显示了“服务器角色”和“I S 管理脚本和工具”选项。

安装 Web 部署 3.0。 运行 IIS 管理器时,它会提示安装Microsoft Web 平台,也可以下载安装程序。 在平台安装程序中,搜索“Web 部署”并安装 Web 部署 3.0

Web 平台安装程序 4 点 5 搜索结果屏幕的屏幕截图,其中突出显示了“Web 部署 3 点 0”选项。

检查 Web 管理服务是否正在运行。 如果没有,请启动服务。 (如果在 Windows 服务列表中看不到 Web 管理服务,请确保在添加 IIS 角色时安装了管理服务。)

默认情况下,Web 管理服务侦听 TCP 端口 8172。 在 Windows 防火墙中,创建新的入站规则以允许端口 8172 上的 TCP 流量。 有关详细信息,请参阅 配置防火墙规则。 (如果要在 Azure 上托管 VM,可以直接在Azure 门户中执行此操作。请参阅 How to Set Up Endpoints to a Virtual Machine.)

现在,你已准备好将 Visual Studio 项目从开发计算机部署到服务器。 在“解决方案资源管理器”中,右键单击解决方案,然后单击“发布”。

有关 Web 部署的更详细文档,请参阅 Visual Studio 的 Web 部署内容映射和 ASP.NET

如果将应用程序部署到两个服务器,则可以在单独的浏览器窗口中打开每个实例,并看到它们都从另一个服务器接收 SignalR 消息。 当然, (在生产环境中,这两台服务器将位于负载均衡器后面。)

Internet Explorer Web 浏览器中显示的 Signal R 消息的屏幕截图,其中显示了“索引”屏幕。

如果想要查看发送到 Redis 的消息,可以使用 redis-cli 客户端,该客户端随 Redis 一起安装。

redis-cli -a password
SUBSCRIBE ChatApp

Azure 用户输出屏幕的屏幕截图,其中显示了所有已发送消息和附带代码的信息。