.net core 3.0 Signalr - 04 使用Redis做底板来支持横向扩展
程序员文章站
2022-04-14 23:05:26
在实际的系统中,可能需要多台机器部署;然而,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关联 |
源码地址 | 源码 |
官方文档 | 官方文档 |