.net core 3.0 Signalr - 04 使用Redis做底板来支持横向扩展

在实际的系统中,可能需要多台机器部署;然而,Signalr的连接信息是跟站点走的,举个例子
推送系统部署了A、B两个服务器,张三访问A服务器,李四访问B服务器,当张三通过A服务器向李四推送的时候,A服务器上是找不到李四的连接信息的,自然也就推送不过了,这个时候就需要有一个统一协调的玩意,signalr支持多种,Azure、Redis等,本节以Redis作为底板,介绍如何在Signalr中使用Redis作为底板来支持横向扩展。

引入Redis

  • 先引入NuGet包
    Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • 修改Startup中的ConfigureServices方法
  var appSection = Configuration.GetSection("App");
  services.Configure<AppSetting>(option => appSection.Bind(option));
  var appSetting = appSection.Get<AppSetting>();

  // 添加Signalr
  services.AddSignalR(config =>
  {
      if (_webEnv.IsDevelopment())
      {
          config.EnableDetailedErrors = true;
      }
  })
  // 支持MessagePack
  .AddMessagePackProtocol()
  // 使用redis做底板 支持横向扩展 Scale-out
  .AddStackExchangeRedis(o =>
    {
        o.ConnectionFactory = async writer =>
        {
            var config = new ConfigurationOptions
            {
                AbortOnConnectFail = false,
                ChannelPrefix = "__signalr_",
            };
            config.DefaultDatabase = appSetting.SignalrRedisCache.DatabaseId;
            var connection = await ConnectionMultiplexer.ConnectAsync(appSetting.SignalrRedisCache.ConnectionString, writer);
            connection.ConnectionFailed  = (_, e) =>
            {
                Console.WriteLine("Connection to Redis failed.");
            };

            if (connection.IsConnected)
            {
                Console.WriteLine("connected to Redis.");
            }
            else
            {
                Console.WriteLine("Did not connect to Redis");
            }

            return connection;
        };
    });

可以自定义Redis相关配置,此处的appSetting为已经定义好的配置实体,包括了,主要配置、CROS配置、Jwt配置、redis配置等详情如下

  /// <summary>
  /// 对应appsettings中的App节点的配置信息
  /// </summary>
  public class AppSetting
  {
      public JwtSetting JwtSetting { set;get;}
      public RedisCache RedisCache { set;get;}
      public RedisCache SignalrRedisCache { set; get; }
      public string CORS { set;get;}
      /// <summary>
      /// 是否主站点(用于运行清理任务等)
      /// </summary>
      public bool MainSite { set;get;}
  }

  /// <summary>
  /// JWT设置
  /// </summary>
  public class JwtSetting
  {
      /// <summary>
      /// 发行者 表示token是谁颁发的
      /// </summary>
      public string Issuer { set; get; }
      /// <summary>
      /// 表示哪些客户端可以使用这个token
      /// </summary>
      public string Audience { set; get; }
      /// <summary>
      /// 加密的Key 必须大于16位
      /// </summary>
      public string SecretKey { set; get; }
  }

  public class RedisCache
  {
      public string ConnectionString { set;get;}
      public int DatabaseId { set; get; }
  }

对应的配置文件如下

  {
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information",
      "Microsoft.AspNetCore.SignalR": "Trace",
      "Microsoft.AspNetCore.Http.Connections": "Trace"
    }
  },
  "App": {
    "RedisCache": {
      "ConnectionString": "127.0.0.1:6379,password=#####,ssl=false,abortConnect=true,connectTimeout=5000",
      "DatabaseId": 10
    },
    "SignalrRedisCache": {
      "ConnectionString": "127.0.0.1:6379,password=#####,ssl=false,abortConnect=true,connectTimeout=5000",
      "DatabaseId": 10
    },
    "CORS": "https://localhost:60000,http://localhost:60001",
    "MainSite": true,
    "JwtSetting": {
      "Issuer": "http://localhost:50000", //颁发者
      "Audience": "http://localhost:50000", //使用者
      "SecretKey": "Wetrial20196666666" // key 大于16位
    }
  }
}

首先,将配置文件跟实体对象映射,下次在其他地方使用的时候可以直接通过DI注入,然后通过AddStackExchangeRedis配置使用redis作为底板

更多内容请通过快速导航查看下一篇

快速导航

标题
内容
索引
.net core 3.0 Signalr - 实现一个业务推送系统
上一篇
.net core 3.0 Signalr - 03 使用MessagePack压缩传输内容
下一篇
.net core 3.0 Signalr - 05 使用jwt将用户跟signalr关联
源码地址
源码
官方文档
官方文档

二维码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值