介绍一款自己实现的rabbit轻量级组件和使用方法
DotNetCore.RabbitMQ.Extensions介绍
- 这是一个 基于.NETStandard 2.0的Rabbit轻量级框架,可以让开发人员无需关注底层变动,专注编写业务代码,从而达到便捷开发。
特性
- DotNetCore.RabbitMQ.Extensions,非常的小巧,下面将介绍 DotNetCore.RabbitMQ.Extensions 的项目框架。
- 开发设计思路是将Rabbit的连接池,生产者,消费者三种业务类型分层分离,从而实现解耦轻量化。
- 连接池,生产者,消费者的设计实现逻辑采用适配器设计,实现各自之间单一职责与开闭原则,是非常有利于业务的扩展和维护。
- 连接池:内置连接池管理,无需重复创建连接和信道,并采用安全线程控制。在这里用户只需要关心配置连接池相关参数。
- 生产者和消费者:底层已经全部抽象实现,无须关注底层逻辑,在这里用户只需要关心配置生产者/消费者相关参数,并且消费者支持单例多重消费者。
- 开发人员只需要在Rabbit管控台新建相关的VHost,其他参数(Exchange,Queue,ExchangeType,RoutingKey)全部代码自动帮你建立完好,无须手动新建,解决繁琐操作。
- 项目 gitbhub 地址:https://github.com/heyehang/DotNetCore.RabbitMQ.Extensions
参数说明
- HostName,Rabbit所在服务器地址
- port,端口号
- username,登录账号名称
- password,登录密码
- VHost,虚拟主机
- Exchange,交换机
- ExchangeType,交换机类型
- Queue,队列名称
- RoutingKey,队列与交换机绑定的key
- ServiceKey,当前服务的key,推荐:nameof(当前类名)
- ConnectionKey,当前连接池服务的key,推荐:nameof(当前连接池类名)
- ConsumerTotal,当前消费队列所对应的消费者数量(默认为1,支持单例多重消费者,继承ConsumerService并重写ConsumerTotal即可)
如何开始?
下载安装 DotNetCore.RabbitMQ.Extensions
安装命令:Install-Package DotNetCore.RabbitMQ.Extensions
连接池
- 继承ConnectionChannelPool类,并实现相关连接池参数和连接池的唯一标识ConnectionKey。
示例代码
namespace TestCommon
{
    public class TestDConnection : ConnectionChannelPool
    {
        public TestDConnection(ILogger<TestDConnection> logger) : base(logger)
        {
        }
        public override RabbitMQOptions opt => new RabbitMQOptions
        {
            HostName = "localhost",
            Port = 5672,
            VHost = "testd.host",
            UserName = "guest",
            PassWord = "guest"
        };
        public override string ConnectionKey => nameof(TestDConnection);
    }
}
生产者
- 继承PublishService类,并实现相关参数,并且绑定所需要使用的连接池ConnectionKey,发送队列消息:TestDPublish.Publish(objmsg);/await TestDPublish.PublishAsync(objmsg);
示例代码
namespace TestCommon
{
    public class TestDPublish : PublishService
    {
        public TestDPublish(ILogger<TestDPublish> logger, IEnumerable<IConnectionChannelPool> connectionList) : base(logger, connectionList)
        {
        }
        public override string ExchangeType => "direct";
        public override string Exchange => "testd.ex";
        public override string Queue => "testd.query";
        public override string RoutingKey => "testd.key";
        public override string ConnectionKey => nameof(TestDConnection);
        public override string ServiceKey => nameof(TestDPublish);
    }
}
消费者
- 继承ConsumerService类,并实现相关参数,并且绑定所需要使用的连接池ConnectionKey,与具体业务消费逻辑。
示例代码
namespace TestCommon
{
    public class TestDConsumer : ConsumerService
    {
        ILogger logger;
        public TestDConsumer(ILogger<TestDConsumer> logger, IEnumerable<IConnectionChannelPool> connectionList) : base(logger, connectionList)
        {
             this.logger = logger;
        }
        public override string Queue => "testd.query";
        public override bool AutoAck => true;
        public override string ServiceKey => nameof(TestDConsumer);
        public override string ConnectionKey => nameof(TestDConnection);
        public override void Received(object sender, BasicDeliverEventArgs e)
        {
            RemoveEnvironmentModel model = new RemoveEnvironmentModel();
            try
            {
                model = JsonConvert.DeserializeObject<RemoveEnvironmentModel>(Encoding.UTF8.GetString(e.Body));
            }
            catch (Exception)
            {
                logger.LogError($"{ServiceKey}服务消费解析model错误");
                throw;
            }
            Console.WriteLine($"消费者{ServiceKey}:收到消息");
        }
    }
}
服务注册
示例代码
IServiceCollection services = new ServiceCollection();
            services.AddLogging();
            //连接池
            services.AddSingleton<IConnectionChannelPool, TestDConnection>();
            //消费者
            services.AddSingleton<IConsumerService, TestDConsumer>();
            //生产者
            services.AddSingleton<TestDPublish>();
            //启动消费监听
            IServiceProvider serviceProvider = services.BuildServiceProvider();
            var consumerList = serviceProvider.GetService<IEnumerable<IConsumerService>>();
            Task.Run(() =>
            {
                foreach (var e in consumerList)
                {
                    e.Start();
                }
            });
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号