Связь микросервисов в ASP.NET CORE Web API с RabbitMQ (AMPQ) - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь внедрить микросервис с помощью основного веб-API asp .net и занимаюсь исследованиями и разработками RabbitMQ для связи с каждым веб-сервисом.

о моем проекте, это система управления обучением. Когда учитель должен отправить массовое электронное письмо ученику. Служба обучения API отправит список адресов электронной почты на службу электронной почты и переписает результаты.

enter image description here

Я искал образец RabbitMQ и реализовал некоторый класс для создания соединения. Но для выполнения асинхронизации я думаю, что он должен инициализироваться в Startup.cs . Но я не смог найти сэмплов для этого, застрявшего в этой точке на 2 дня. Проверьте мой код ниже и помогите мне.

using Newtonsoft.Json;
using RabbitMQ.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RabbitMQSender.RabbitMQ
{
    public class RabbitMQConnection
    {
        private static ConnectionFactory _factory;
        private static IConnection _connection;
        private static IModel _channel;

        public void CreateConnection()
        {
            _factory = new ConnectionFactory { HostName = "localhost", UserName = "guest", Password = "guest" };
           // _factory = new ConnectionFactory(){HostName = "172.22.144.236",Port = 5672,UserName = "guest",Password = "guest"};
        }

        public void Close()
        {
            _connection.Close();
        }

        public void ProcessMessages()
        {           

            using (_connection = _factory.CreateConnection())
            {
                using (_channel = _connection.CreateModel())
                {
                    _channel.QueueDeclare(queue: "msgKey", durable: false, exclusive: false, autoDelete: false, arguments: null);

                        var command = new AddUser{
                            FirstName = "Isanka",
                            LastName = "Thalagala",
                            EmailAddress = "isanka.thalagala@gmail.com",
                            Password = "examplePassword"
                        };
                    string message = JsonConvert.SerializeObject(command);
                    var body = Encoding.UTF8.GetBytes(message);

                    _channel.BasicPublish(exchange: "",routingKey: "msgKey",basicProperties: null,body: body);
                   
                   
                   
                }
            }
        }
  
      
    }
    }

1 Ответ

0 голосов
/ 17 сентября 2018

Существует множество примеров RabbitMQ в c #. Но если вы собираетесь реализовать ядро ​​asp.net и если сервис должен запускаться автоматически при запуске api, все равно не можете найти простые примеры

Нужно сделать statup.cs вот так.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using RabbitMQ.Client;
using RabbitMQReiverCoreAPI.RebbitMQ;

namespace RabbitMQReiverCoreAPI
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);


            services.AddSingleton<RabbitMQPersistentConnection>(sp =>
            {
                var logger = sp.GetRequiredService<ILogger<RabbitMQPersistentConnection>>();

                var factory = new ConnectionFactory()
                {
                    HostName = Configuration["EventBusConnection"]
                };

                if (!string.IsNullOrEmpty(Configuration["EventBusUserName"]))
                {
                    factory.UserName = Configuration["EventBusUserName"];
                }

                if (!string.IsNullOrEmpty(Configuration["EventBusPassword"]))
                {
                    factory.Password = Configuration["EventBusPassword"];
                }

                return new RabbitMQPersistentConnection(factory);
            });

            services.AddOptions();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseMvc();

            //Initilize Rabbit Listener in ApplicationBuilderExtentions
            app.UseRabbitListener();
        }
    }
  
    public static class ApplicationBuilderExtentions
    {
        public static RabbitMQPersistentConnection Listener { get; set; }

        public static IApplicationBuilder UseRabbitListener(this IApplicationBuilder app)
        {
            Listener = app.ApplicationServices.GetService<RabbitMQPersistentConnection>();
            var life = app.ApplicationServices.GetService<IApplicationLifetime>();
            life.ApplicationStarted.Register(OnStarted);

            //press Ctrl+C to reproduce if your app runs in Kestrel as a console app
            life.ApplicationStopping.Register(OnStopping);
            return app;
        }

        private static void OnStarted()
        {
            Listener.CreateConsumerChannel();
        }

        private static void OnStopping()
        {
            Listener.Disconnect();
        }
    }
}
Это очень простой способ реализовать RabbitMQ с помощью основного веб-API asp .net. Распределенные сообщения обрабатываются встроенной реализацией RabbitMQ.

Этот исходный код в качестве примера, и вы можете улучшить его с помощью расширенных функциональных возможностей. Пример консоли отправителя и основного приемника API Asp.net полный проект здесь

...