欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-02 12:52:27
在实际的系统中,可能需要多台机器部署;然而,Signalr的连接信息是跟站点走的,举个例子 推送系统部署了A、B两个服务器,张三访问A服务器,李四访问B服务器,当张三通过A服务器向李四推送的时候,A服务器上是找不到李四的连接信息的,自然也就推送不过了,这个时候就需要有一个统一协调的玩意,signal ......

在实际的系统中,可能需要多台机器部署;然而,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关联
源码地址 源码
官方文档 官方文档

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