(精華2020年6月24日更新)asp.net core3.1實戰篇 RabbitMQ的使用二(環境搭建和初步使用)
上篇已經安裝完Erlang,繼續安裝RabbitMQ
1. RabbitMQ是啥
RabbitMQ是使用Erlang編寫的一個開源的訊息佇列,本身支援很多的協議:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量級,更適合於企業級的開發。同時實現了Broker構架,這意味著訊息在傳送給客戶端時先在中心佇列排隊。對路由,負載均衡或者資料持久化都有很好的支援。
它支援開放的高階訊息佇列協議 (AMQP,Advanced Message Queuing Protocol),從根本上避免了生產廠商的封閉,使用任何語言的各種客戶都可以從中受益。這種協議提供了相當複雜的訊息傳輸模式,所以基本上不需要MassTransit或NServiceBus的配合。它還具有“企業級”的適應性和穩定性。這些東西對我的客戶來說十分的有吸引力。
RabbitMQ的整體架構
2. 為什麼要用RabbitMQ訊息佇列
訊息佇列是啥:訊息佇列(Message Queue),一種先進先出的佇列結構,用於處理Message。
訊息佇列解決的問題:在處理大量併發請求時,同步處理往往會發生阻塞,特別是在更新資料庫或者呼叫其他元件時。訊息佇列能夠實現請求的非同步處理、應用解耦、流量削鋒和訊息通訊,同時能夠有效防止阻塞導致的訊息丟失。
訊息佇列系統,一般都包含3個角色:佇列服務端,佇列的生產者,佇列的消費者。這種架構與當下流行的分散式架構極為契合。
3. 如何安裝RabbitMQ
1:安裝RabbitMQ(下載地址:https://www.rabbitmq.com/install-windows.html)
2:安裝完RabbitMQ-------將安裝目錄sbin新增到環境目錄中的Path中
3:在Powershell中執行:rabbitmq-plugins list
4:安裝RabbitMQ視覺化管理端:rabbitmq-plugins enable rabbitmq_management
5:啟動服務後訪問http://localhost:15672預設的賬戶密碼都是guest
6:修改或者刪除該使用者(建議先修改密碼,然後新增使用者,新增之後再刪除guest使用者,或者直接改一個密碼嗎保留guest使用者)
7:新增一個Admin使用者,名稱隨便,密碼隨便,角色選擇Admin
8:新增完之後重新整理Users列表會看到該使用者,接下來配置hosts
9:新建一個testhost,然後點選testhost,進入host配置頁面,在Permissions選項中新增admin 的訪問許可權
10:回到Users頁面可以看到如上的列表,至此RabbitMQ配置完成
4:上述的操作可以通過以下命令完成
檢視所有使用者
rabbitmqctl list_users
配置許可權
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
檢視使用者許可權
rabbitmqctl list_user_permissions admin
設定tag
rabbitmqctl set_user_tags admin administrator
刪除使用者(安全起見,刪除預設使用者)
rabbitmqctl delete_user guest
5. RabbitMQ的佇列形式
在使用RabbitMQ之前,我們們先捋一捋RabbitMQ一共有幾種使用方式,常用的5中佇列
- 第一種:簡單佇列(一對一模式)耦合性高,生產消費一一對應。
- 第二種:WorkQueues(工作佇列),一個生產,多個消費者共同處理訊息。
- 第三種:訂閱模式,1一個生產者多個消費者,每一個消費者有自己的一個佇列,生產者直接將訊息傳送給交換機,交換機將訊息傳送給佇列,每一個佇列都需要繫結到交換機。這種模式可以滿足消費者釋出一個訊息,多個消費者消費同一資訊的需求,但C1、C2消費的都是相同的資料,有時我們需要C1和C2消費的資訊只有部分差異,比如我們需求:C1消費增加的資料,C2消費編輯、增加和刪除的資料。
- 第四種:路由模式,路由模式是在訂閱模式基礎上的完善,可以在生產訊息的時候,加入Key值,與key值匹配的消費者消費資訊。但路由模式中,就如三中提到的C1、C2、如果C2對應的型別更多,就需要寫很多key值。但其實它只與C1有一點差別。
- 第五種:萬用字元模式是在路由模式的升級,他允許key模糊匹配。*代表一個詞,#代表一個或多個詞。通過萬用字元模式我們就可以將C1對應的一個key準確定為item.add。而C2我們就不需要一一寫出key值,而是用item.#代替即可。
6. .net Core3.1使用RabbitMQ
建立生產者
using RabbitMQ.Client;
using System;
using System.Text;
namespace RabbitMQTest
{
/// <summary>
/// 生產者
/// </summary>
class Program
{
static void Main(string[] args)
{
//建立連線工廠
ConnectionFactory factory = new ConnectionFactory
{
UserName = "admin",//使用者名稱
Password = "lmt456123",//密碼
HostName = "localhost"//rabbitmq ip
};
//建立連線
var connection = factory.CreateConnection();
//建立通道
var channel = connection.CreateModel();
//宣告一個佇列
channel.QueueDeclare("hello", false, false, false, null);
Console.WriteLine("\nRabbitMQ連線成功,請輸入訊息,輸入exit退出!");
string input;
do
{
input = Console.ReadLine();
var sendBytes = Encoding.UTF8.GetBytes(input);
//釋出訊息
channel.BasicPublish("", "hello", null, sendBytes);
}
while (input.Trim().ToLower() != "exit");
channel.Close();
connection.Close();
}
}
}
建立一對一消費者
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;
namespace RabbitMQConsumer
{
/// <summary>
/// 消費者
/// </summary>
class Program
{
static void Main(string[] args)
{
//建立連線工廠
ConnectionFactory factory = new ConnectionFactory
{
UserName = "admin",//使用者名稱
Password = "lmt456123",//密碼
HostName = "localhost"//rabbitmq ip
};
//建立連線
var connection = factory.CreateConnection();
//建立通道
var channel = connection.CreateModel();
//事件基本消費者
EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
//接收到訊息事件
consumer.Received += (ch, ea) =>
{
string message = Encoding.Default.GetString(ea.Body.ToArray());
Console.WriteLine($"收到訊息: {message}");
// Console.WriteLine($"收到該訊息[{ea.DeliveryTag}] 延遲10s傳送回執");
// Thread.Sleep(10000);
//確認該訊息已被消費
channel.BasicAck(ea.DeliveryTag, false);
// Console.WriteLine($"已傳送回執[{ea.DeliveryTag}]");
};
//啟動消費者 設定為手動應答訊息
channel.BasicConsume("hello", false, consumer);
Console.WriteLine("消費者已啟動");
Console.ReadKey();
channel.Dispose();
connection.Close();
}
}
}
一對一的消費佇列我們們就此建立完成,下一節開始RabbitMQ的高階用法
相關文章
- (精華2020年6月24日更新)asp.net core3.1實戰篇 RabbitMQ的使用一(安裝Erlang)ASP.NETMQ
- androidNDK環境的搭建和使用Android
- Android systrace環境的搭建和使用Android
- (精華2020年5月21日更新) vue實戰篇 實時通訊websocket的封裝結合vue的使用VueWeb封裝
- (精華2020年5月22日更新) react基礎篇 元件的使用React元件
- Mac下git的環境搭建和基本使用MacGit
- (精華2020年5月8日更新) vue教程篇 vue-router路由的使用Vue路由
- asp.net core3.1 實戰開發(驗證碼的封裝和使用)ASP.NET封裝
- (精華2020年5月17日更新) vue實戰篇 手寫vue底層原始碼Vue原始碼
- (精華2020年5月4日更新) vue教程篇 計算屬性computed的使用Vue
- (精華2020年5月4日更新) vue教程篇 v-show和v-if的使用Vue
- docker環境下的RabbitMQ部署,Spring AMQP使用DockerMQSpring
- RabbitMQ學習系列二:.net 環境下 C#程式碼使用 RabbitMQ 訊息佇列MQC#佇列
- ASP.NET Core知識之RabbitMQ元件使用(二)ASP.NETMQ元件
- RabbitMQ學習之(一)_初步瞭解RabbitMQ、RabbitMQ的使用流程、為什麼要使用RabbitMQ、RabbitMQ的應用場景MQ
- (精華2020年5月4日更新) vue教程篇 簡單小結(1)-使用者管理Vue
- RabbitMQ使用教程(一)RabbitMQ環境安裝配置及Hello World示例MQ
- RocketMQ 視覺化環境搭建和基礎程式碼使用MQ視覺化
- laravel 佇列之Homestead(ubuntu)下laravel使用RabbitMQ——實戰篇Laravel佇列UbuntuMQ
- 生產環境sql語句調優實戰第二篇SQL
- node環境搭建和vue-cli腳手架使用詳解Vue
- 【機器學習】在生產環境使用Kafka構建和部署大規模機器學習機器學習Kafka
- asp.net core3.1 實戰開發(中介軟體的詳解)ASP.NET
- (精華)2020年7月1日 ASP.NET Core Swagger的使用(Swashbuckle工具版)ASP.NETSwagger
- (精華)2020年7月20日 ASP.NET Core serilog日誌框架的使用ASP.NET框架
- Maven環境搭建和介紹Maven
- (精華)2020年7月1日 ASP.NET Core 使用Enablebuffering多次讀取bodyASP.NET
- Flutter 基礎(二)Flutter 開發環境搭建和 Hello WorldFlutter開發環境
- (精華)2020年7月22日 ASP.NET Core Swagger的使用(NSwag工具版)ASP.NETSwagger
- (精華)2020年7月20日 ASP.NET Core log4.net日誌框架的使用ASP.NET框架
- golang開發:環境篇(五)實時載入工具gin的使用Golang
- ASP.NET Core初步使用Quartz.NETASP.NETquartz
- 【SSH專案實戰】國稅協同平臺-2.環境搭建和整合
- RabbitMQ環境搭建教程收集(待實踐)MQ
- (精華)2020年7月17日 vue mixins的使用Vue
- (精華2020年5月20日更新) vue教程篇 父子元件相互傳參Vue元件
- Go 之基礎速學 (一) 最簡環境搭建和 goland 的安裝使用GoLand
- 使用 Docker 搭建簡易的 Java Web 環境 (二)DockerJavaWeb