Можем ли мы использовать RabbitMQ и Mediatr вместе с помощью masstransit? - PullRequest
0 голосов
/ 29 мая 2020

Я создал приложение микросервиса, которое использует микросервисы с использованием 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?

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Их можно использовать вместе, и MassTransit также имеет свою собственную реализацию посредника, поэтому вы можете один раз написать свои обработчики и использовать их либо через посредник, либо через надежный транспорт, такой как RabbitMQ.

Есть * Доступно 1003 * видеороликов , которые познакомят вас с возможностями, начиная с посредника и заканчивая RabbitMQ.

1 голос
/ 04 июня 2020

Я обнаружил, что мне нужно создать отдельную шину для каждого. тогда внешние службы наследуются от интерфейса, такого как 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...