使用 Redis 的 SignalR 横向扩展

警告

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

本主题中使用的软件版本

本主题的早期版本

有关 SignalR 早期版本的信息,请参阅 SignalR 旧版本

问题和评论

请留下反馈,说明你对本教程的喜爱程度,以及我们可以在页面底部的评论中改进的内容。 如果你有与本教程不直接相关的问题,可以将其发布到 ASP.NET SignalR 论坛StackOverflow.com

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

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

显示从 Redis 服务器到 V M,然后到计算机的箭头的关系图。一个标记为“发布”的箭头从 V M 转到 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. 将以下代码添加到 Startup.cs 以配置底板:

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            GlobalHost.DependencyResolver.UseStackExchangeRedis("server", port, "password", "AppName");
            app.MapSignalR();
        }
    }
    

Hyper-V 上的 Ubuntu

使用 Windows Hyper-V,可以轻松地在 Windows Server 上创建 Ubuntu VM。

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

在 Hyper-V 中,添加新的 VM。 在 “连接虚拟硬盘 ”步骤中,选择“ 创建虚拟硬盘”。

显示“新建虚拟机向导”对话框的屏幕截图。已选择“连接虚拟硬盘”和“创建虚拟硬盘”。

“安装选项” 步骤中,选择“ 映像文件 (.iso) ”,单击“ 浏览”,然后浏览到 Ubuntu 安装 ISO。

显示“安装选项”页上的“新建虚拟机向导”的屏幕截图。从启动 C D D V D D ROM 安装 O S,并选择了映像文件 dot i s o。

安装 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

显示 Redis 服务器的“main”页的屏幕截图。

打开端口 6379,这是 Redis 侦听的默认端口。 (可以在配置文件中更改端口号。)

创建 SignalR 应用程序

按照以下任一教程创建 SignalR 应用程序:

接下来,我们将修改聊天应用程序以支持使用 Redis 进行横向扩展。 首先,将 Microsoft.AspNet.SignalR.StackExchangeRedis NuGet 包添加到项目。 在 Visual Studio 的“ 工具 ”菜单中,选择“ NuGet 包管理器”,然后选择“ 包管理器控制台”。 在“Package Manager Console”窗口中,输入以下命令:

Install-Package Microsoft.AspNet.SignalR.StackExchangeRedis

接下来,打开 Startup.cs 文件。 将以下代码添加到 Configuration 方法:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // Any connection or hub wire up and configuration should go here
        GlobalHost.DependencyResolver.UseStackExchangeRedis("server", port, "password", "AppName");
        app.MapSignalR();
    }
}
  • “server”是运行 Redis 的服务器的名称。
  • port 是端口号
  • “password”是在 redis.conf 文件中定义的密码。
  • “AppName”是任意字符串。 SignalR 使用此名称创建 Redis 发布/订阅通道。

例如:

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

部署和运行应用程序

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

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

显示“添加角色和功能向导”的屏幕截图。已选择服务器角色和 WebSocket 协议。

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

显示“添加角色和功能向导”的屏幕截图。已选择“管理服务”。

安装 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 消息。 当然, (在生产环境中,这两台服务器将位于负载均衡器后面。)

打开的两个浏览器窗口的屏幕截图,其中显示了部署到两个服务器的应用程序。

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

redis-cli -a password
SUBSCRIBE ChatApp

显示 Redis 窗口中的编号列表的屏幕截图。