我们可以使用 masstransit 一起使用 RabbitMQ 和 Mediatr 吗?
Can we use RabbitMQ and Mediatr together using masstransit?
我创建了一个微服务应用程序,它使用 MassTransit 和 RabbitMQ 进行微服务通信。
每个微服务都使用干净的架构开发,因此我们在每个微服务中都有 MediatR。
是否也可以使用 MassTransit 进行内部通信?因此我可以对所有服务使用相同的签名,并且当我想公开要在微服务间使用的服务时,这将很容易实现。
所以MediatR用于内部通信,RabbitMQ用于内部通信,整个宇宙都在MassTransit系统上。
[更新] 我的问题是我们如何配置消费者,以便一些可以用于内部通信(通过 MediatR),一些可以用于外部通信(通过 RabbitMQ),并轻松地从从内到外。
[Update2] 例如这是我的 MassTransit 注册:
services.AddMassTransit(x =>
{
x.AddConsumers(Assembly.GetExecutingAssembly());
x.AddBus(provider =>
Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.Host(new Uri(config.RabbitMQ.Address), h =>
{
h.Username(config.RabbitMQ.Username);
h.Password(config.RabbitMQ.Password);
});
cfg.ReceiveEndpoint("my-queue", ep => { ep.ConfigureConsumers(provider); });
}));
x.AddMediator((provider, cfg) => { cfg.ConfigureConsumers(provider); });
});
内部沟通和外部沟通有何不同?换句话说,我如何才能将一些消费者注册到 MediatR 而将一些消费者注册到 RabbitMQ?
它们可以一起使用,MassTransit 也有自己的中介器实现,因此您只需编写一次处理程序,然后通过中介器或持久传输(如 RabbitMQ)使用它们。
有 videos 可用的功能,可以带您了解这些功能,从中介开始,然后转移到 RabbitMQ。
我发现我应该为每个创建一个单独的总线。然后外部服务继承自 IExternalConsumer 等接口,因此我可以将它们与内部服务分开并将它们添加到相关总线:
版本 7 已更新
// find consumers
var types = AssemblyTypeCache.FindTypes(new[]{Assembly.GetExecutingAssembly()},TypeMetadataCache.IsConsumerOrDefinition).GetAwaiter().GetResult();
var consumers = types.FindTypes(TypeClassification.Concrete | TypeClassification.Closed).ToArray();
var internals = new List<Type>();
var externals = new List<Type>();
foreach (Type type in consumers)
{
if (type.HasInterface<IExternalConsumer>())
externals.Add(type);
else
internals.Add(type);
}
services.AddMediator(x =>
{
x.AddConsumers(internals.ToArray());
x.ConfigureMediator((provider, cfg) => cfg.UseFluentValidation());
});
services.AddMassTransit<IExternalBus>(x =>
{
x.AddConsumers(externals.ToArray());
x.AddBus(provider =>
Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.Host(new Uri(config.RabbitMQ.Address), h =>
{
h.Username(config.RabbitMQ.Username);
h.Password(config.RabbitMQ.Password);
});
cfg.ReceiveEndpoint(apiProviderName, ep => { ep.ConfigureConsumers(provider); });
}));
});
services.AddMassTransitHostedService();
我创建了一个微服务应用程序,它使用 MassTransit 和 RabbitMQ 进行微服务通信。
每个微服务都使用干净的架构开发,因此我们在每个微服务中都有 MediatR。
是否也可以使用 MassTransit 进行内部通信?因此我可以对所有服务使用相同的签名,并且当我想公开要在微服务间使用的服务时,这将很容易实现。
所以MediatR用于内部通信,RabbitMQ用于内部通信,整个宇宙都在MassTransit系统上。
[更新] 我的问题是我们如何配置消费者,以便一些可以用于内部通信(通过 MediatR),一些可以用于外部通信(通过 RabbitMQ),并轻松地从从内到外。
[Update2] 例如这是我的 MassTransit 注册:
services.AddMassTransit(x =>
{
x.AddConsumers(Assembly.GetExecutingAssembly());
x.AddBus(provider =>
Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.Host(new Uri(config.RabbitMQ.Address), h =>
{
h.Username(config.RabbitMQ.Username);
h.Password(config.RabbitMQ.Password);
});
cfg.ReceiveEndpoint("my-queue", ep => { ep.ConfigureConsumers(provider); });
}));
x.AddMediator((provider, cfg) => { cfg.ConfigureConsumers(provider); });
});
内部沟通和外部沟通有何不同?换句话说,我如何才能将一些消费者注册到 MediatR 而将一些消费者注册到 RabbitMQ?
它们可以一起使用,MassTransit 也有自己的中介器实现,因此您只需编写一次处理程序,然后通过中介器或持久传输(如 RabbitMQ)使用它们。
有 videos 可用的功能,可以带您了解这些功能,从中介开始,然后转移到 RabbitMQ。
我发现我应该为每个创建一个单独的总线。然后外部服务继承自 IExternalConsumer 等接口,因此我可以将它们与内部服务分开并将它们添加到相关总线: 版本 7 已更新
// find consumers
var types = AssemblyTypeCache.FindTypes(new[]{Assembly.GetExecutingAssembly()},TypeMetadataCache.IsConsumerOrDefinition).GetAwaiter().GetResult();
var consumers = types.FindTypes(TypeClassification.Concrete | TypeClassification.Closed).ToArray();
var internals = new List<Type>();
var externals = new List<Type>();
foreach (Type type in consumers)
{
if (type.HasInterface<IExternalConsumer>())
externals.Add(type);
else
internals.Add(type);
}
services.AddMediator(x =>
{
x.AddConsumers(internals.ToArray());
x.ConfigureMediator((provider, cfg) => cfg.UseFluentValidation());
});
services.AddMassTransit<IExternalBus>(x =>
{
x.AddConsumers(externals.ToArray());
x.AddBus(provider =>
Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.Host(new Uri(config.RabbitMQ.Address), h =>
{
h.Username(config.RabbitMQ.Username);
h.Password(config.RabbitMQ.Password);
});
cfg.ReceiveEndpoint(apiProviderName, ep => { ep.ConfigureConsumers(provider); });
}));
});
services.AddMassTransitHostedService();