概述跨过程事件总线容许公布和订阅跨服务传输的音讯, 服务的公布与订阅不在同一个过程中
在Masa Framework中, 跨过程总线事件提供了一个能够被开箱即用的程序
IntegrationEvents: 提供了发件箱模式
IntegrationEvents.Dapr: 借助Dapr实现了音讯的公布EventLogs.EFCore: 基于EFCore实现的集成事件日志的提供者, 提供音讯的记录与状态更新、失败日志重试、删除过期的日志记录等入门跨过程事件与Dapr并不是强绑定的, Masa Framework应用了Dapr提供的pub/sub的能力, 如果你不想应用它, 你也能够更换为其它实现, 但目前Masa Framwork中仅提供了Dapr的实现
装置 .NET 6.0装置 Dapr新建ASP.NET Core 空我的项目Assignment.IntegrationEventBus,并装置Masa.Contrib.Dispatcher.IntegrationEvents.Dapr、Masa.Contrib.Dispatcher.IntegrationEvents.EventLogs.EFCore、Masa.Contrib.Data.EFCore.Sqlite、Masa.Contrib.Data.UoW.EFCore、Masa.Contrib.Development.DaprStarter.AspNetCore、Microsoft.EntityFrameworkCore.Designdotnet new web -o Assignment.IntegrationEventBuscd Assignment.IntegrationEventBusdotnet add package Masa.Contrib.Dispatcher.IntegrationEvents.Dapr --version 0.7.0-preview.8 // 应用dapr提供的pubsub能力dotnet add package Masa.Contrib.Dispatcher.IntegrationEvents.EventLogs.EFCore --version 0.7.0-preview.8 //本地音讯表dotnet add package Masa.Contrib.Data.EFCore.Sqlite --version 0.7.0-preview.8 //应用EfCore.Sqlitedotnet add package Masa.Contrib.Data.UoW.EFCore --version 0.7.0-preview.8 //应用工作单元dotnet add package Masa.Contrib.Development.DaprStarter.AspNetCore --version 0.7.0-preview.8 //开发环境应用DaprStarter帮助治理Dapr Sidecardotnet add package Microsoft.EntityFrameworkCore.Design --version 6.0.6 //不便后续通过CodeFirst迁徙数据库新建用户上下文类UserDbContext,并继承MasaDbContextpublic class UserDbContext : MasaDbContext{ public UserDbContext(MasaDbContextOptions<UserDbContext> options) : base(options) { }}注册DaprStarter, 帮助治理Dapr Sidecar, 批改Program.csif (builder.Environment.IsDevelopment()){ builder.Services.AddDaprStarter();}通过Dapr公布集成事件须要运行Dapr, 线上环境可通过Kubernetes来运行, 开发环境可借助Dapr Starter运行Dapr, 因而仅须要在开发环境应用它注册跨过程事件总线,批改类Programbuilder.Services.AddIntegrationEventBus(option =>{ option.UseDapr() .UseEventLog<UserDbContext>() .UseUoW<UserDbContext>(optionBuilder => optionBuilder.UseSqlite($"Data Source=./Db/{Guid.NewGuid():N}.db;"));});var app = builder.Build();#region dapr 订阅集成事件应用app.UseRouting();app.UseCloudEvents();app.UseEndpoints(endpoints =>{ endpoints.MapSubscribeHandler();});#endregion新增用户注册事件的集成事件 RegisterUserEventpublic record RegisterUserEvent : IntegrationEvent{ public override string Topic { get; set; } = nameof(RegisterUserEvent); public string Account { get; set; } public string Mobile { get; set; }}关上Assignment.IntegrationEventBus所在文件夹,关上cmd或Powershell执行dotnet ef migrations add init //创立迁徙dotnet ef database update //更新数据库发送跨过程事件,批改Programapp.MapPost("/register", async (IIntegrationEventBus eventBus) =>{ //todo: 模仿注册用户并公布注册用户事件 await eventBus.PublishAsync(new RegisterUserEvent() { Account = "Tom", Mobile = "19999999999" });});订阅事件,批改Programapp.MapPost("/IntegrationEvent/RegisterUser", [Topic("pubsub", nameof(RegisterUserEvent))](RegisterUserEvent @event) =>{ Console.WriteLine($"注册用户胜利: {@event.Account}");});订阅事件临时未形象,目前应用的是Dapr原生的订阅形式,后续咱们会反对Bind,届时不会因为更换pubsub的实现而导致订阅形式的扭转只管跨过程事件目前仅反对了Dapr,但这不代表你与RabbitMq、Kafka等无缘,公布/订阅是Dapr形象出的能力,实现公布订阅的组件有很多种,RabbitMq、Kafka是其中一种实现,如果你想深刻理解他们之间的关系,能够参考:
...