我们可以使用大众运输将 RabbitMQ 和 Mediatr 一起使用吗?

Mah*_*hdi 4 masstransit rabbitmq microservices mediatr

我创建了一个微服务应用程序,该应用程序使用MassTransitRabbitMQ进行微服务进行通信。
每个微服务都使用干净的架构开发,因此我们在每个微服务中都有MediatR
是否也可以使用 MassTransit 进行内部通信?因此我可以对所有服务使用相同的签名,并且当我想公开要在微服务间使用的服务时,这将很容易实现。所以MediatR用于内部通信,RabbitMQ用于内部通信,整个宇宙都在MassTransit系统上。
[更新]我的问题是我们如何配置消费者,以便一些可用于内部通信(通过 MediatR),一些可用于外部通信(通过 RabbitMQ),并轻松地将它们从内部更改为外部。
[Update2]例如这里是我的大众运输注册:

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); });
        });
Run Code Online (Sandbox Code Playgroud)

我如何区分内部沟通和外部沟通?换句话说,我如何将一些消费者注册到 MediatR 而一些消费者注册到 RabbitMQ?

Mah*_*hdi 6

我发现我应该为每个创建一个单独的总线。然后外部服务继承自 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();
Run Code Online (Sandbox Code Playgroud)


Chr*_*son 5

它们可以一起使用,而且 MassTransit 也有自己的 Mediator 实现,因此您可以编写一次处理程序,然后通过中介或持久传输(如 RabbitMQ)使用它们。

有一些视频可以带您了解这些功能,从调解器开始到 RabbitMQ。