首页 > 其他分享 >(七).NET6.0部署RabbitMQ

(七).NET6.0部署RabbitMQ

时间:2024-12-27 11:34:35浏览次数:5  
标签:consumeId string 部署 RabbitMQ public static mqConfigs NET6.0

1.下载erlang语言包OTP。官网地址:
https://www.erlang.org/downloads

2.Rabbitmq官网下载地址:
https://www.rabbitmq.com/download.html

需要先安装Erlang语言包,然后再安装RabbitMQ,安装RabbitMQ的服务器名称(电脑名称),以及用户名称,不要带中文,有可能会导致服务无法识别服务器,导致一些bug。

3.安装成功以后Rabbitmq服务是启动状态,就代表成功
●Win+R打开运行
●输入services.msc点击确定
●查看服务是否正在运行

4.配置环境变量
●设置Erlang语言包的环境变量,新建系统变量ERLANG_HOME,变量值是对应的安装目录

●添加Path环境变量

●设置MQ的环境变量,新建系统变量RABBITMQ_SERVER值是MQ的安装目录

●添加Path环境变量

注:
这里还未确定是系统变量里的Path要设置还是用户变量要设置,我全部都设置了
Erlang 会生成两个 cookie 文件:C:\Windows\System32\config\systemprofile.erlang.cookie 及 C:\用户\你的用户名.erlang.cookie。

5.安装RabbitMQ-Plugins插件
打开cmd命令提示符,并且输入
rabbitmq-plugins enable rabbitmq_management
即可自动安装MQ插件。
6.在菜单(开始)里找到这个程序(没有的话,可以直接以管理员运行cmd然后打开到rabbitmq的sbin目录下),然后右键管理员运行

rabbitmq-server.bat ---启动rabbitmq服务(这个如果启动了,那么服务中的就没有启动)

rabbitmqctl status命令

7.出现上面的结果说明rabbitmq服务已经正常启动,建议访问http://localhost:15672/,默认用户名密码都是guest
8.设置自己的用户名密码

添加完成以后,页面如下:

页面提示没有权限访问虚拟主机,我们需要点击刚刚创建的名称,就可以进去设置虚拟主机的访问权限。我们使用默认的设置即可:

设置完成以后,刚才的页面就会提示一个默认的 / 了,代表默认虚拟主机权限设置完成:

注意:由此,MQ环境配置以及完成。如果安装以后,服务还没启动的,可以先看下服务里面的MQ配置是不是自动,如果不是自动,就先手动启动并且设置自动。如果手动起不来,就重启一下计算机。如果还是不行,可以考虑是否计算机的用户名、计算机名称有特殊符号或中文。

9.接下来开始.net core操作Rabbitmq有关的内容。我使用direct直连模式首先,我在我的package包项目上面,添加对RabbitMQ.Client的引用

10.在启动项目下的appsettings配置文件里面,新增访问RabbitMQ的配置连接字符串

11.然后,在实体类项目下,新建实体类MqConfigInfo,用于把读取的配置信息赋值到该实体类下

12.在刚刚新建的RabbitMQ类库项目下面,引用该实体类库项目,以及APppSettings项目。然后新建一个类,叫做ReadMqConfigHelper,以及它的interface接口,并且提供一个方法,叫ReadMqConfig,用来进行读取配置信息使用

13.新建类MqConnectionHelper以及接口IMqConnectionHelper,用于做MQ连接、创建生产者和消费者等有关操作

点击查看代码
public class MqConnectionHelper:IMqConnectionHelper
{
    private readonly ILogger<MqConnectionHelper> _logger;

    public MqConnectionHelper(ILogger<MqConnectionHelper> logger)
    {
        _logger = logger;
        _connectionReceiveFactory = new IConnectionFactory[_costomerCount];
        _connectionReceive = new IConnection[_costomerCount];
        _modelReceive = new IModel[_costomerCount];
        _basicConsumer = new EventingBasicConsumer[_costomerCount];
    }



    //使用数组的部分,是给消费端用的,目前生产者只设置了一个,消费者可能存在多个。

    /// <summary>
    /// RabbitMQ工厂发送端
    /// </summary>
    private static IConnectionFactory _connectionSendFactory;
    /// <summary>
    /// RabbitMQ工厂接收端
    /// </summary>
    private static IConnectionFactory[] _connectionReceiveFactory;

    /// <summary>
    /// 连接 发送端
    /// </summary>
    private static IConnection _connectionSend;
    /// <summary>
    /// 连接 消费端
    /// </summary>
    private static IConnection[] _connectionReceive;

    /// <summary>
    /// 配置信息
    /// </summary>
    public static List<MqConfigInfo> _mqConfigs;

    /// <summary>
    /// 通道 发送端
    /// </summary>
    private static IModel _modelSend;
    /// <summary>
    /// 通道 消费端
    /// </summary>
    private static IModel[] _modelReceive;

    private static EventingBasicConsumer[] _basicConsumer;//事件

    //设置两个routingKey和队列名称,用来做测试使用
    public static int _costomerCount = 2;
    public static string[] _routingKey = new string[] { "YsqNet001", "YsqNet002" };
    public static string[] _queueName = new string[] { "Queue001", "Queue002" };

    /// <summary>
    /// 生产者初始化连接配置
    /// </summary>
    public void SendFactoryConnectionInit()
    {
        _connectionSendFactory = new ConnectionFactory
        {
            HostName = _mqConfigs.FirstOrDefault().Host,
            Port = _mqConfigs.FirstOrDefault().Port,
            UserName = _mqConfigs.FirstOrDefault().User,
            Password = _mqConfigs.FirstOrDefault().Password
        };
    }

    /// <summary>
    /// 生产者连接
    /// </summary>
    public void SendFactoryConnection()
    {
        if (_connectionSend != null && _connectionSend.IsOpen)
        {
            return;//已有连接
        }

        _connectionSend = _connectionSendFactory.CreateConnection();//创建生产者连接

        if (_modelSend != null && _modelSend.IsOpen)
        {
            return;//已有通道
        }

        _modelSend = _connectionSend.CreateModel();//创建生产者通道

        _modelSend.ExchangeDeclare(_mqConfigs.FirstOrDefault().ExchangeName, ExchangeType.Direct);
    }

    /// <summary>
    /// 消费者初始化连接配置
    /// </summary>
    public void ReceiveFactoryConnectionInit()
    {
        var factories = new ConnectionFactory
        {
            HostName = _mqConfigs.FirstOrDefault().Host,
            Port = _mqConfigs.FirstOrDefault().Port,
            UserName = _mqConfigs.FirstOrDefault().User,
            Password = _mqConfigs.FirstOrDefault().Password
        };

        for (int i = 0; i < _costomerCount; i++)
        {
            _connectionReceiveFactory[i] = factories;//给每个消费者绑定一个连接工厂
        }
    }

    /// <summary>
    /// 消费者连接
    /// </summary>
    /// <param name="consumeId"></param>
    /// <param name="exchangeName"></param>
    /// <param name="routeKey"></param>
    /// <param name="queueName"></param>
    public void ConncetionReceive(int consumeId, string exchangeName, string routeKey, string queueName)
    {
        _logger.LogInformation($"开始连接RabbitMQ消费者:{routeKey}");

        if (_connectionReceive[consumeId] != null && _connectionReceive[consumeId].IsOpen)
        {
            return;
        }

        _connectionReceive[consumeId] = _connectionReceiveFactory[consumeId].CreateConnection();//创建消费者连接

        _modelReceive[consumeId] = _connectionReceive[consumeId].CreateModel();//创建消费者通道

        _basicConsumer[consumeId] = new EventingBasicConsumer(_modelReceive[consumeId]);

        _modelReceive[consumeId].ExchangeDeclare(exchangeName, ExchangeType.Direct);//定义交换机名称和类型 与生产者保持一致

        _modelReceive[consumeId].QueueDeclare(
            queue:queueName,//消息队列名称
            durable:_mqConfigs.FirstOrDefault().Durable,//是否可持久化,此处配置在文件中,默认全局持久化(true)
            exclusive:false,
            autoDelete:false,
            arguments:null
            );//定义消费者队列

        _modelReceive[consumeId].QueueBind(queueName,exchangeName,routeKey);//队列绑定给指定的交换机

        _modelReceive[consumeId].BasicQos(0, 1, false);//设置消费者每次只接收一条消息

        StartListener((model, ea) =>
        {
            byte[] message = ea.Body.ToArray();//接收到的消息
            string msg = Encoding.UTF8.GetString(message);

            _logger.LogInformation($"队列{queueName}接收到消息:{msg}");
            Thread.Sleep(2000);
            _modelReceive[consumeId].BasicAck(ea.DeliveryTag, true);
        }, queueName, consumeId);
    }

    /// <summary>
    /// 消费者接收消息的确认机制
    /// </summary>
    /// <param name="basicDeliverEventArgs"></param>
    /// <param name="queueName"></param>
    /// <param name="consumeId"></param>
    private static void StartListener(EventHandler<BasicDeliverEventArgs> basicDeliverEventArgs,string queueName,int consumeId)
    {
        _basicConsumer[consumeId].Received += basicDeliverEventArgs;
        _modelReceive[consumeId].BasicConsume(queue: queueName, autoAck: false, consumer: _basicConsumer[consumeId]);//设置手动确认
    }

    /// <summary>
    /// 消息发布
    /// </summary>
    /// <param name="message"></param>
    /// <param name="exchangeName"></param>
    /// <param name="routeKey"></param>
    public static void PublishExchange(string message,string exchangeName,string routeKey="")
    {
        byte[] body = Encoding.UTF8.GetBytes(message);
        _modelSend.BasicPublish(exchangeName,routeKey,null,body);
    }
}

14.通过Autofac实现依赖注入

15.在webapi进行测试

16.结果展示

标签:consumeId,string,部署,RabbitMQ,public,static,mqConfigs,NET6.0
From: https://www.cnblogs.com/sq1201/p/18635209

相关文章

  • 【linux合集】单机部署clickhouse--ubuntu环境
    clickhouse单机部署--ubuntu部署导入clickhouse密钥操作(ClickHouse(大数据分析DBMS)的软件包由其开发人员使用公钥进行签名,我们需要在我们的系统上使用它。这是因为只有我们的系统才能验证我们得到的软件包,它们来自源代码,因为它们是由其开发人员发布的。并且没有被中间的任何人修......
  • (八).NET6.0添加通用的Redis功能
    1.添加包:StackExchange.Redis2.在配置文件里面,新建Redis的有关配置信息Name是别名,可以任意起。Ip是Redis的服务端地址,例如安装本地,就是127.0.0.1,端口号Port默认是6379,密码可以通过Redis安装的根目录下的配置文件进行设置,Timeout是连接的超时时间,Db是使用Redis的DB区,一般Redis......
  • (六).NET6.0通用读取配置文件功能
    1.新增Microsoft.Extensions.Configuration包在启动项目下,设置appsettings.json属性为始终复制2.新建一个文件夹Common,用于存放工具类项目。并且新建项目:Ysq.Core.AppSettings,引用package包项目,然后新建一个读取配置文件的通用类,叫AppHelper。目录结构如图3.AppHelper代码如......
  • 使用docker部署sshd服务器
    dockersshd服务器使用docker运行包含完整sshd服务的Alpine容器,提供ssh、scp、sftp、rsync等服务。初始化脚本创建setup-user.sh,设置用户名密码,内容如下:#设置root密码root_pwd="123456"echo"root:$root_pwd"|chpasswd#设置其他用户username=useruser_pwd="123456"......
  • (五).NET6.0使用Serilog进行配置和实现日志记录
    1.首先安装Serilog六件套神装包也可以对个别相应的包进行删除等,例如:1是读取配置文件的,如果不需要通过配置文件进行操作,就可以不使用这个包。2是打印到控制台的,如果不需要打印到控制台,也可以不引用。3是写入到文件的,如果不需要写入到文件,也是可以不提供的。我在此处全部引入,方便......
  • 部署SSL证书后,部分页面未能自动跳转至HTTPS,如何强制全站启用HTTPS?
    在现代网站建设中,启用SSL/TLS加密通信已成为标准做法,它不仅增强了数据传输的安全性,还提升了搜索引擎排名。然而,许多网站在部署SSL证书后,会遇到一个问题:并非所有页面都能自动从HTTP跳转到HTTPS。这不仅影响用户体验,也可能导致SEO评分下降。为了确保整个站点始终使用HTTPS协议,您可以......
  • 解决 Dify 部署中 Podman WSL 容器文件权限问题
    解决Dify部署中PodmanWSL容器文件权限问题在使用Podman进行Dify部署时,遇到了一个关键问题:启动服务时出现initdb:error:couldnotchangepermissionsofdirectory"/var/lib/postgresql/data/pgdata":Operationnotpermitted的报错,这严重影响了Dify在WSL环境......
  • ssm社区人员疫情信息管理系统2f52z(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义新冠疫情的爆发对全球公共卫生体系造成了巨大冲击,社区作为疫情防控的前沿阵地,其管理效率和精准度直接关系到疫情防控的整体成效......
  • ssm趣测评二手数码产品交易平台q5t2r--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景随着科技的不断发展,数码产品的普及程度日益提高,但价格昂贵且使用寿命有限,导致二手数码产品市场迅速崛起。然而,二手市场存在信息不对称......
  • ssm企业信息管理系统fc7n8程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景随着企业规模的扩大和业务范围的拓展,传统的人工管理模式已难以满足现代企业对高效、精确管理的需求。因此,开发一套功能全面的企业信息......