(七).NET6.0部署RabbitMQ
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.结果展示


(七).NET6.0部署RabbitMQ的更多相关文章
- .NET微服务系统迁移至.NET6.0的故事
本次迁移涉及的是公司内部一个业务子系统,该系统是一个多样化的应用,支撑着公司的多个业务方向.目前,该系统由40多个基于.NET的微服务应用构成,使用数千个CPU核心和数TB内存,在数百个Linux容器 ...
- zabbix Server 4.0 部署及之内置item使用案例
zabbix Server 4.0 部署及之内置item使用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.zabbix组件架构概述(图片摘自网络) 1>.zabbi ...
- prometheus + grafana部署RabbitMQ监控
prometheus + grafana部署RabbitMQ监控 1.grafana导入dashboards https://grafana.com/dashboards/2121 2.expor ...
- Docker swarm结合Openresty部署rabbitmq集群
Docker swarm结合Openresty部署rabbitmq集群 大家好,年底了,年味儿越来越浓了.2019年的寒冬被定义为未来10年中最好的一年,对于这一说法悲观的人和乐观的人的理解是不一样的 ...
- Linux下安装部署RabbitMQ
在写正文之前先啰嗦几句,RabbitMQ(消息队列)的安装让我费了半天劲啊!足足折腾了2天,最后写下这篇文章总结下,其实很简单,但是你找不到错在哪个环节就会费很多无用功,如果你也遇到了安装erl后 怎 ...
- centos7部署rabbitMq
目录 一.消息中间件相关知识... 1 1.概述... 1 2.消息中间件的组成... 1 3 消息中间件模式分类... 2 4 消息中间件的优势... 3 5 消息中间件应用场景... 4 6 消息 ...
- 部署rabbitMQ镜像集群实战测试
部署rabbitMQ镜像集群 版本信息 rabbit MQ: 3.8.5 Erlang: 官方建议最低21.3 推荐22.x 这里用的是23 环境准备 主机规划 主机 节点 172.16.14.3 磁 ...
- k8s集群部署rabbitmq集群
1.构建rabbitmq镜像 RabbitMQ提供了一个Autocluster插件,可以自动创建RabbitMQ集群.下面我们将基于RabbitMQ的官方docker镜像,添加这个autocluste ...
- 一、Windows部署RabbitMQ
RabbitMQ官方网站非常详细,以下只是本人学习过程的整理 一.Windows部署RabbitMQ:https://www.cnblogs.com/yangleiyu/p/15539618.html ...
- 微服务探索之路01篇.net6.0项目本地win10系统docker到服务器liunx系统docker的贯通
本文介绍从创建 net6.0 项目运行在 windows 开发环境的 docker 然后正式部署至 liunx 服务器. 1 windows10 安装 docker 下载docker-desktop ...
随机推荐
- Rsync远程同步知识点总结
Rsync: 简介:是一个开源的快速备份工具.可以在不同主机之间镜像同步整个目录,支持增量备份,保持链接(硬链接.软连接)和权限,且采用优化同步算法,传输前执行压缩(传输过程中效率加快了,但是会增加c ...
- LeetCode128 最长连续序列
最长连续序列 题目链接:LeetCode128 描述 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度. 请你设计并实现时间复杂度为 O(n) 的算法 ...
- 卡特兰数 Catalan 数列
卡特兰数 Catalan 数列 引入 有一个无限大的栈,进栈的顺序为 \(1,2,\cdots,n\),求有多少种不同的出栈序列. 设 \(h[n]\) 为 \(n\) 个数的出栈序列方案数. 可以这 ...
- 零基础入门gRPC:从 0 实现一个Hello World
在之前讲解 Nacos 注册中心的过程中,我曾简要提到过 gRPC,主要是因为 Nacos 的最新版已经采用了 gRPC 作为其核心通信协议.这一变化带来了显著的性能优化,尤其在心跳检测.健康检查等接 ...
- 解读Graph+AI白皮书:LLM浪潮下,Graph尚有何为?
历时半年,由蚂蚁集团和之江实验室牵头,联合北京邮电大学.浙江大学.西湖大学.东北大学.杭州悦数科技.浙江创邻科技.北京大学.北京交通大学.复旦大学.北京海致星图科技.腾讯.信雅达科技.北京枫清科技等单 ...
- 在不同形式的for循环中使用break、continue、return的效果
我们在循环中,经常会有跳出循环,跳出本次循环继续下次循环等的场景,今天我们简单分享下.主要使用到的关键字是,break.continue.return.先将结果总结: ①在foreach中不能使用br ...
- uni-app下webview支付宝支付调起问题
前情 uni-app是我很喜欢的跨平台框架,它能开发小程序,H5,APP(安卓/iOS),对前端开发很友好,自带的IDE让开发体验也很棒,公司项目就是主推uni-app. 因疫情影响,公司不能组织聚餐 ...
- uni-app下载文件在ios下失败
标签: js uni-app 前情 uni-app是我很喜欢的跨平台框架,它能开发小程序,H5,APP(安卓/iOS),对前端开发很友好,自带的IDE让开发体验也很棒,公司项目就是主推uni-app. ...
- OS之《内存管理》
程序装入方式 绝对装入:程序逻辑地址和物理地址是完全对应的.不现实 可重定位装入:装入的时候重新 计算内存地址.程序中的实际地址加上程序载入的起始地址:但是解决不了进程挂起 后重新唤醒的问题.唤醒的后 ...
- django admin 后台管理 新手学习步骤记录 (2)
学习使用django admin后台管理. 参考.Django基础之Admin后台数据管理_django admin_马航行的博客-CSDN博客