使用 Redis 的 SignalR 横向扩展
警告
本文档不适用于最新版本的 SignalR。 查看 ASP.NET Core SignalR。
本主题中使用的软件版本
- Visual Studio 2013
- .NET 4.5
- SignalR 版本 2.4
本主题的早期版本
有关 SignalR 早期版本的信息,请参阅 SignalR 旧版本。
问题和评论
请留下反馈,说明你对本教程的喜爱程度,以及我们可以在页面底部的评论中改进的内容。 如果你有与本教程不直接相关的问题,可以将其发布到 ASP.NET SignalR 论坛 或 StackOverflow.com。
在本教程中,你将使用 Redis 跨部署在两个单独的 IIS 实例上的 SignalR 应用程序分发消息。
Redis 是内存中键值存储。 它还支持具有发布/订阅模型的消息传送系统。 SignalR Redis 底板使用发布/订阅功能将消息转发到其他服务器。
在本教程中,你将使用三个服务器:
- 两台运行 Windows 的服务器,你将使用它来部署 SignalR 应用程序。
- 一台运行 Linux 的服务器,用于运行 Redis。 对于本教程中的屏幕截图,我使用了 Ubuntu 12.04 TLS。
如果没有三个物理服务器可以使用,可以在 Hyper-V 上创建 VM。 另一个选项是在 Azure 上创建 VM。
尽管本教程使用官方 Redis 实现,但 MSOpenTech 中还有 一个 Redis 的 Windows 端口 。 设置和配置是不同的,但步骤是相同的。
注意
使用 Redis 的 SignalR 横向扩展不支持 Redis 群集。
概述
在开始详细教程之前,下面简要概述了你将执行的操作。
安装 Redis 并启动 Redis 服务器。
将这些 NuGet 包添加到应用程序:
创建 SignalR 应用程序。
将以下代码添加到 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。
安装 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
打开端口 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 协议。
还包括“管理工具”) 下列出的管理服务 (。
安装 Web 部署 3.0。 运行 IIS 管理器时,它会提示安装Microsoft Web 平台,也可以下载安装程序。 在平台安装程序中,搜索“Web 部署”并安装 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