消息總線
在微服務架構的系統中,我們通常會使用輕量級的消息代理來建構一個共用的消息主題讓系統中所有微服務執行個體都連接配接上來,由于該主題中産生的消息會被所有執行個體監聽和消費,是以我們稱它為消息總線。
在總線上的各個執行個體都可以友善地廣播一些需要讓其他連接配接在該主題上的執行個體都知道的消息,例如配置資訊的變更或者其他一些管理操作等。
由于消息總線在微服務架構系統中被廣泛使用,是以它同配置中心一樣,幾乎是微服務架構中的必備元件。
Spring Cloud
作為微服務架構綜合性解決方案,對此自然也有自己的實作,也就是
Spring Cloud Bus
。通過使用
Spring Cloud Bus
,可以非常容易地搭建起消息總線,同時實作了一些消息總線中的常用功能,比如,配合
Spring Cloud Config
實作微服務應用配置資訊的動态更新等。
消息代理
消息代理(
Message Broker
)是一種消息驗證、傳輸、路由的架構模式。它在應用程式之間起到通信排程并最小化應用之間的依賴的作用,使得應用程式可以高效地解耦通信過程。消息代理是一個中間件産品,它的核心是一個消息的路由程式,用來實作接收和分發消息,并根據設定好的消息處理流來轉發給正确的應用。它包括獨立的通信和資訊傳遞協定,能夠實作組織内部群組織間的網絡通信。設計代理的目的就是為了能夠從應用程式中傳入消息,并執行一些特别的操作。
目前版本的
Spring Cloud Bus
僅支援兩款中間件産品:
RabbitMQ
和
Kafka
。
RabbitMQ
RabbitMQ
是實作了進階消息隊列協定(
AMQP
)的開源消息代理軟體,也稱為面向消息的中間件。
AMQP
是
Advanced Message Queuing Protocol
的簡稱,它是一個面向消息中間件的開放式标準應用層協定,它定義了以下這些特性:
- 消息方向
- 消息隊列
- 消息路由(包括點到點和釋出-訂閱模式)
- 可靠性
- 安全性
AMQP
要求消息的提供者和用戶端接收者的行為要實作對不同供應商可以用相同的方式(比如
SMTP
、
HTTP
、
FTP
等)進行互相操作。在以往的中間件标準中,主要還是建立在
API
級别,比如
JMS
,集中于通過不同的中間件實作來建立标準化的程式間的互操作性,而不是在多個中間件産品間實作互操作性。
RabbitMQ
以
AMQP
協定實作,是以它可以支援多種作業系統、多種程式設計語言,幾乎可以覆寫所有主流的企業級技術平台。在微服務架構消息中間件的選型中,它是一個非常适合且優秀的選擇。是以,在
Spring Cloud Bus
中包含了對
Rabbit
的自動化預設配置。
基本概念
-
:可以了解為消息隊列伺服器的實體,它是一個中間件應用,負責接收消息生産者的消息,然後将消息發送至消息接收者或者其他的Broker
。Broker
-
:消息交換機,是消息第一個到達的地方,消息通過它指定的路由規則,分發到不同的消息隊列中去。Exchange
-
:消息隊列,消息通過發送和路由之後最終到達的地方,到達Queue
的消息即進入邏輯上等待消費的狀态。每個消息都會被發送到一個或多個隊列。Queue
-
:綁定,它的作用就是把Binding
和Exchange
按照路由規則綁定起來,也就是Queue
和Exchange
之間的虛拟連接配接。Queue
-
:路由關鍵字,Routing Key
根據這個關鍵字進行消息投遞。Exchange
-
:虛拟主機,它是對Virtual host
的虛拟劃分,将消費者、生産者和它們依賴的Broker
相關結構進行隔離,一般都是為了安全考慮。比如,我們可以在一個AMQP
中設定多個虛拟主機,對不同使用者進行權限的分離。Broker
-
:連接配接,代表生産者、消費者、Connection
之間進行通信的實體網絡。Broker
-
:消息通道,用于連接配接生産者和消費者的邏輯結構。在用戶端的每個連接配接裡,可建立多個Channel
,每個Channel
代表一個會話任務,通過Channel
可以隔離同一個連接配接中的不同互動内容。Channel
-
:消息生産者,制造消息并發送消息的程式。Producer
-
:消息消費者,接收消息并處理消息的程式。Consumer
Kafka
Kafka
是一個由
LinkedIn
開發的分布式消息系統,它于
2011
年年初開源,現在由著名的
Apache
基金會維護與開發。它是基于消息釋出-訂閱模式實作的消息系統。
基本概念
-
:Broker
叢集包含一個或多個伺服器,這些伺服器被稱為Kafka
。Broker
-
:邏輯上同Topic
的RabbitMQ
隊列相似,每條釋出到Queue
叢集的消息都必須有一個Kafka
。(實體上不同Topic
的消息分開存儲,邏輯上一個Topic
的消息雖然儲存于一個或多個Topic
上,但使用者隻需指定消息的Broker
即可生産或消費資料而不必關系資料存于何處。)Topic
-
:Partition
是實體概念上的分區,為了提供系統吞吐率,在實體上每個Partition
會分成一個或多個Topic
,每個Partition
對應一個檔案夾(存儲對應分區的消息内容和索引檔案)。Partition
-
:消息生産者,負責生産消息并發送到Producer
。Kafka Broker
-
:消息消費者,向Consumer
讀取消息并處理的用戶端。Kafka Broker
-
:每個Consumer Group
屬于一個特定的組(可為每個Consumer
指定屬于一個組,若不指定則屬于預設組),組可以用來實作一條消息被組内多個成員消費等功能。Consumer