283  
查询码:00000138
DotnetCore.CAP+SignalR打通消息传输全过程
作者: 潘帅 于 2020年04月28日 发布在分类 / 人防组 / 人防后端 下,并于 2020年04月28日 编辑
DotNetCore.CAP SignalR

DotnetCore.CAP是一款用于实现数据最终一致性的开源方案,SignalR是微软ASP.NET/ASP.NET Core体系下的实时数据传输解决方案,两种技术看起来没什么交集,但具体的业务让两者能够相互联系在一起。

DotnetCore.CAP的基础实现是将数据库和消息队列连接起来,通过数据的发布/订阅实现不同数据源之间的最终一致性,其优势是数据的可靠传输(利用了消息队列的优势,但也不敢说100%可靠)和应用环境的多样性(消息队列支持kafka\rabbitmq\azure等,数据库支持sqlserver\mysql\mongodb等)。不过DotnetCore.CAP的使用场景一般都是重量级的客户端,貌似不能直接将数据推送到Web页面。

SignalR的基础实现是根据网络环境自动切换长连接、轮询或WebSocket来实现数据的实时传输,基本使用方法也是发布/订阅模式,其优势是数据的实时传输和对Web应用的友好支持,最重要是微软亲儿子,跟ASP.NET Core的融合度高。但SignalR对数据的可靠性并没有太高的保障,而且高并发的能力跟消息队列相比还是有差距的。

可以说DotnetCore.CAP和SignalR是连通数据的不同通道,正如同铁路和公路,各有优势。将两者结合到一起的目的是将消息队列作为数据传输的主干道,SignalR解决数据传输的”最后一公里“,DotnetCore.CAP负责将消息队列和SignalR 连接到一起。


0.准备

创建ASP.NET Core项目,消息队列使用kafka,数据库使用MySql。

1.DotnetCore.CAP

1.1.安装配置

使用Nuget管理器为ASP.NET Core项目安装DotNetCore.CAP.Kafka和DotNetCore.CAP.MySql,已包含核心库DotNetCore.CAP。

打开Startup.cs文件进行配置。在ConfigureServices方法中添加代码配置数据库及消息队列连接字符串。


            services.AddCap(x =>
            {
                x.UseMySql(_appConfiguration["ConnectionStrings:Default"]);
                x.UseKafka(_appConfiguration["MQ:Host"]);
                x.UseDashboard();
            });

在Configure方法中添加代码启用数据面板。

app.UseCapDashboard();

1.2.订阅/发布数据

新建ASP.NET Core MVC控制器MessageController,注入DotNetCore.CAP的发布服务,此外以Attribute属性的形式定义订阅数据的方法。

    public class MessageController : Controller
    {
        private readonly ICapPublisher _publisher;
        public MessageController(ICapPublisher publisher)
        {
            _publisher = publisher;
        }

        [NonAction]
        [CapSubscribe(”TopicName“,Group =”GroupName“)]
        public void DataSubscribe(string message)
        {
            try
            {
                Logger.Info(message);
                //你的业务逻辑代码
            }
            catch (Exception ex)
            {
                Logger.Error(ex.Message);
            }

        }
}


2.SignalR

2.1.安装配置

使用NuGet管理器为ASP.NET Core项目安装Microsoft.AspNetCore.SignalR。

打开Startup.cs文件进行配置。

在ConfigureServices方法中添加代码设置SignalR基本配置。

services.AddSignalR();
在Configure方法中配置集线器路由。

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
        //SignalR路由
                endpoints.MapHub<MessageHub>("/messagebus");
            });


2.2.订阅/发布数据

新增集线器类MessageHub,继承自Microsoft.AspNetCore.SignalR.Hub。

    public class MessageHub : Hub
    {
        public MessageHub()
        {
        }
}
回到MessageController,注入SignalR服务。

        private readonly ICapPublisher _publisher;
        private readonly IHubContext<MessageHub> _hubContext;
        public MessageController(ICapPublisher publisher,IHubContext<MessageHub> hubContext)
        {
            _publisher = publisher;
            _hubContext = hubContext;
        }
修改订阅数据的方法。

    [NonAction]
        [CapSubscribe(”TopicName“,Group =”GroupName“)]
        public void DataSubscribe(string message)
        {
            try
            {
                Logger.Info(message);
                //你的业务逻辑代码
        _hubContext.Clients.All.SendAsync("ReceiveData", message)
            }
            catch (Exception ex)
            {
                Logger.Error(ex.Message);
            }
        }
同样的也可以将DotNetCore.CAP的数据发布服务注入到SignalR集线器类中,实现数据发布。

        private readonly ICapPublisher _publisher;
             
        public MessageHub(ICapPublisher publisher)
        {
            _publisher = publisher;
        }

        public void PublishData(string message)
        {
            _publisher.Publish("TopicName", message);
        }

此外DotNetCore.CAP和SignalR的订阅/发布功能都能以服务的形式单独使用,与更复杂的业务相融合更具优势。

这样数据的订阅和发布就形成了闭环,数据的传输通道打通了。






 推荐知识

 历史版本

修改日期 修改人 备注
2020-04-28 17:10:07[当前版本] 潘帅 1.0

  目录
    知识分享平台 -V 4.8.7 -wcp