Docker 部署RabbitMq,Asp.Net Core使用RabbitMQ示例。
一、Docker安装RabbitMq
1、查询镜像:
docker search rabbitmq
2、拉取镜像:docker pull rabbitmq
docker pull rabbitmq
docker images 查看结果
3、运行镜像为容器
docker run -d --name rabbit -p 15672:15672 -p 5672:5672 <imageName>
-d 后台运行,
---name 容器的名称
-p web管理器端口
-p 队列服务器端口
也可以传递命令同时设定账号密码以及权限,也可以在web管理器中设置。
4、进入容器,并且启动Rabbitmq
dockers exec -it <容器id> bash
-it 交互进入,bash命令行
rabbitmq-plugins enable rabbitmq_management
5、访问web管理界面
http://1.15.78.132:15672
如果第三步没有设置账号密码,则默认账号密码:guest
Asp.net Core 使用Rabbitmq
1、生产消息
Console.WriteLine("生产端");
IConnectionFactory factory = RabbitMqConnectionFactory.CreateConnectionFactory(Configuration["你的服务器"],Configuration["端口"],Configuration["用户名"],Configuration["密码"]);
IConnection con = factory.CreateConnection();//创建连接对象
IModel channel = con.CreateModel();//创建连接会话对象
string queueName = "QueueName";
//声明一个队列.
channel.QueueDeclare(
queue: queueName,//消息队列名称
durable: false,//是否持久化,true持久化,队列会保存磁盘,服务器重启时可以保证不丢失相关信息。
exclusive: false,//是否排他,true排他的,如果一个队列声明为排他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除.
autoDelete: false,//是否自动删除。true是自动删除。自动删除的前提是:致少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除.
arguments: null //设置队列的一些其它参数
);
string message = string.Empty;
do
{
message = Console.ReadLine() ?? "";
//消息内容
byte[] body = Encoding.UTF8.GetBytes(message);
//发送消息
channel.BasicPublish("", queueName, null, body);
}
while (message.Trim().ToLower() != "exit");
con.Close();
channel.Close();
2、消费者
Console.WriteLine("接收端");
IConnectionFactory factory = RabbitMqConnectionFactory.CreateConnectionFactory(Configuration["你的服务器"],Configuration["端口"],Configuration["用户名"],Configuration["密码"]);
IConnection conn = factory.CreateConnection();
IModel channel = conn.CreateModel();
string queueName = "QueueName";
//声明一个队列
channel.QueueDeclare(
queue: queueName,//消息队列名称
durable: false,//是否持久化,true持久化,队列会保存磁盘,服务器重启时可以保证不丢失相关信息。
exclusive: false,//是否排他,true排他的,如果一个队列声明为排他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除.
autoDelete: false,//是否自动删除。true是自动删除。自动删除的前提是:致少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除.
arguments: null 设置队列的一些其它参数
);
//创建消费者对象
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
byte[] message = ea.Body.ToArray();//接收到的消息
Console.WriteLine("接收消息:" + Encoding.UTF8.GetString(message));
};
//消费者开启监听
channel.BasicConsume("QueueName", true, consumer);
Console.ReadKey();
channel.Dispose();
conn.Close();
3、复用部分
public class RabbitMqConnectionFactory
{
/// <summary>
/// 创建链接工厂对象
/// </summary>
/// <param name="hostName">服务器地址</param>
/// <param name="port">端口号</param>
/// <param name="userName">用户名</param>
/// <param name="password">密码</param>
/// <returns></returns>
public static IConnectionFactory CreateConnectionFactory(string hostName,int port,string userName,string password)
{
IConnectionFactory factory = new ConnectionFactory()//创建连接工厂对象
{
HostName = hostName,
Port = port,
UserName = userName,
Password = password
};
return factory;
}
}
4、测试
生产消息不消费,通过管理器查看队列消息
生产端、消费端同时运行,查看结果。