SignalR+MQ学习记录

本文介绍了如何在高并发场景中,通过配置SignalR实现WebSocket通信,结合MQ(如Redis和RabbitMQ)进行消息传递,并展示了如何在前后端通过EventBus触发和处理OrderAdd事件的过程。
摘要由CSDN通过智能技术生成

学习使用MQ+SignalR处理高并发下订单

SignalR:

创建Hubs目录

创建XXXXHub继承Hub类

// 配置即时通讯
builder.Services.AddSignalR();
// 配置允许跨域
builder.Services.AddCors(p =>
{
    p.AddPolicy("Travel.Client", p =>
    {
        p.AllowAnyHeader();
        // 这里需要改成WithOrigins()方法,填写你实际的客户端地址
        p.SetIsOriginAllowed(s => true); 
        p.AllowAnyMethod();
        p.AllowCredentials(); // 主要是为了允许signalR跨域通讯
    });
});
app.UseCors("Travel.Client"); 
app.MapHub<TravelHub>("/Hub"); // 映射signalR通讯中心

MQ:

"Redis": "xx:6379,password=xx",
  "RabbitMQ": {
    "HostName": "xx",
    "VirtualHost": "/",
    "UserName": "admin",
    "Password": "123456",
    "Port": "5672"
  }
var rabbitConfig = builder.Configuration.GetSection("RabbitMQ");
builder.Services.Configure<RabbitMQOptions>(rabbitConfig);
var rabbitOptions = rabbitConfig.Get<RabbitMQOptions>();

builder.Services.AddCap(p =>
{
    p.UseMySql(builder.Configuration.GetConnectionString("mysql") ?? string.Empty);
    p.UseEntityFramework<HappyTravelContext>();
    p.UseRabbitMQ(mq =>
    {
        mq.HostName = rabbitOptions.HostName;
        mq.VirtualHost = rabbitOptions.VirtualHost;
        mq.UserName = rabbitOptions.UserName;
        mq.Password = rabbitOptions.Password;
        mq.Port = rabbitOptions.Port;
    });
    p.UseDashboard(); // 注册仪表盘
});

然后是创建了一个类存放方法名

public class EventBus
{
    /// <summary>
    /// 下订单
    /// </summary>
    public const string OrderAdd = "order.add";
}

然后是SignalR发布到控制器层//服务层也可以

await   _capPublisher.PublishAsync(EventBus.OrderAdd,input);

 控制器层订阅事件

  [CapSubscribe(EventBus.OrderAdd,Group = EventBus.OrderAdd)]
    [HttpPost]
    [TravelAuthorize]
    public async Task OrderAdd([FromBody]OrderAddInput input)
    {
       
        var result = await _service.OrderAdd(input);

       await _Hub.Clients.Clients(input.ConnectionId).SendAsync(SignalMethod.ReceiveMessage, result);
        
    }

流程是:

启动后端
启动前端

前端链接SignalR

 // 创建连接对象
    var connection = new signalR.HubConnectionBuilder()
        .withUrl("http://localhost:5216/Hub",{
            accessTokenFactory:()=>token
        }).withAutomaticReconnect() // 自动重连(0秒,2秒,10秒,30秒) 尝试四次重连
        .build();
    

通过connection对象调用Hub里面的方法

connection.invoke("OrderAdd",addOrderBo).catch(function(err){
            console.log(err);
        });

 Hub里OrderAdd方法发布事件

  await   _capPublisher.PublishAsync(EventBus.OrderAdd,input);
        

控制器方法订阅事件,有事件?消息后自动消费

 [CapSubscribe(EventBus.OrderAdd,Group = EventBus.OrderAdd)]

 流程貌似就这样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值