2023年再不會RabbitMQ,就要被淘汰了,手把手帶你飛

帶你聊技術發表於2023-04-04

來源:哪吒程式設計

大家好,我是哪吒。

Spring Cloud是一個開源框架,用於構建基於微服務架構的應用程式。它提供了多種工具和技術,用於實現各種微服務模式,並使它們易於管理和部署。

MQ(訊息佇列)則是一種重要的非同步通訊機制,用於在不同的應用程式之間進行通訊。

在本篇部落格中,我們將詳細講解如何使用Spring Cloud搭建MQ。

一、什麼是Spring Cloud?

Spring Cloud是一個基於Spring Framework的開源框架,用於構建基於微服務架構的應用程式。它為開發人員提供了一套工具和技術,可以輕鬆地實現和管理各種微服務模式。

Spring Cloud提供了各種解決方案,包括服務發現、配置管理、負載均衡、斷路器、API閘道器等,使得開發人員能夠輕鬆地建立和管理微服務。

2023年再不會RabbitMQ,就要被淘汰了,手把手帶你飛

上圖說明了以下過程:

  1. 客戶端(Client)向EurekaServer註冊微服務;
  2. 客戶端從ConfigServer獲取其配置;
  3. 客戶端向目標微服務(Service)傳送請求;
  4. 服務端在ZipkinServer生成跟蹤ID並將其返回給客戶端;
  5. 服務端處理請求,並將跟蹤ID傳送回客戶端;
  6. 客戶端接收到響應並完成請求。

二、什麼是MQ?

MQ(訊息佇列)是一種重要的非同步通訊機制,用於在不同的應用程式之間進行通訊。

它允許應用程式之間的非同步通訊,可以提高應用程式的可伸縮性和可靠性。

MQ通常由生產者、消費者和訊息佇列組成,其中生產者將訊息傳送到訊息佇列,消費者從訊息佇列中接收訊息並對其進行處理。

MQ還提供了一些高階功能,如訊息永續性、事務支援、訊息路由和過濾器等

生產者和消費者之間的互動過程:

2023年再不會RabbitMQ,就要被淘汰了,手把手帶你飛

生產者透過交換器將訊息傳送到RabbitMQ,RabbitMQ將訊息傳送到佇列,消費者從佇列中獲取訊息並處理它。

最後,RabbitMQ將訊息傳送給消費者。

三、使用Spring Cloud搭建MQ

1、準備工作

在開始搭建MQ之前,我們需要進行一些準備工作。

首先,我們需要安裝RabbitMQ伺服器,並確保其已啟動。

其次,我們需要確保已安裝Spring Boot和Spring Cloud,並已將它們新增到專案依賴中。

最後,我們需要建立一個Spring Boot專案,以便我們可以開始編寫程式碼。

2、新增依賴項

在開始編寫程式碼之前,我們需要新增一些必要的依賴項。在pom.xml檔案中新增以下依賴項:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

這將使我們能夠使用Spring Cloud Stream,它是Spring Cloud用於構建訊息驅動微服務的解決方案。

3、配置RabbitMQ

在我們可以開始使用RabbitMQ之前,我們需要配置它。我們可以在application.properties檔案中新增以下屬性:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

這些屬性指定了RabbitMQ伺服器的主機名、埠號、使用者名稱和密碼

4、建立生產者

現在我們已經準備好了,我們可以開始編寫程式碼了。

首先,我們將建立一個生產者,它將傳送訊息到RabbitMQ訊息佇列。

以下是一個簡單的生產者實現:

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class Producer implements CommandLineRunner {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Override
    public void run(String... args) throws Exception {
        String message = "Hello RabbitMQ!";
        rabbitTemplate.convertAndSend("myExchange""myRoutingKey", message.getBytes());
        System.out.println("Sent message: " + message);
    }
}

在這個例子中,我們使用了Spring Boot的CommandLineRunner介面來定義我們的生產者。

在run()方法中,我們使用RabbitTemplate來傳送訊息到名為"myExchange"的交換器,並使用myRoutingKey路由鍵。我們還列印了傳送的訊息以供參考。

5、建立消費者

接下來,我們將建立一個消費者,它將從RabbitMQ訊息佇列中接收訊息並對其進行處理。以下是一個簡單的消費者實現:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class Consumer {

    @RabbitListener(queues = "myQueue")
    public void processMessage(byte[] message) {
        String text = new String(message);
        System.out.println("Received message: " + text);
    }
}

在這個例子中,我們使用了Spring Boot的RabbitListener註解來定義我們的消費者。processMessage()方法將接收到的位元組陣列轉換為字串,並列印出接收到的訊息。

6、配置訊息佇列

在我們可以測試我們的生產者和消費者之前,我們需要配置訊息佇列。在Spring Boot中,我們可以使用註解來定義訊息佇列。以下是我們需要在應用程式中新增的註解:

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

    @Bean
    public Queue myQueue() {
        return new Queue("myQueue"false);
    }
}

在這個例子中,我們使用了@Configuration註解來定義我們的配置類。我們還使用@Bean註解來定義名為myQueue的訊息佇列。

7、測試應用程式

現在我們已經完成了所有的設定和配置,可以測試我們的應用程式了。執行應用程式並檢查控制檯輸出,確保生產者已成功傳送訊息並且消費者已成功接收並處理訊息。

四、高階配置

Spring Cloud還提供了一些高階配置選項,可以幫助我們更好地管理和控制訊息佇列。例如,我們可以使用以下註解來定義交換器和路由鍵:

1、交換器的定義和使用

在Spring Cloud中,交換器是用於將訊息路由到正確的佇列的元件。交換器將收到的訊息根據規則進行路由,並將其傳送到匹配的佇列。

下圖,展示了定義交換器的過程

2023年再不會RabbitMQ,就要被淘汰了,手把手帶你飛

在Spring Boot應用程式中,我們可以使用ExchangeBuilder來建立交換器。

下圖展示了交換器的使用過程

2023年再不會RabbitMQ,就要被淘汰了,手把手帶你飛

上圖說明了以下過程:

  1. 生產者向交換器傳送訊息。
  2. 交換器根據規則將訊息路由到佇列1和佇列2。
  3. 佇列1將確認訊息傳送給交換器。
  4. 交換器將確認訊息傳送給生產者,告訴它訊息已經成功路由到了佇列。

在這個例子中,我們將使用Spring Cloud的ExchangeBuilder來建立一個名為myExchange的直接交換器:

@Bean
public Exchange myExchange() {
    return ExchangeBuilder.directExchange("myExchange").durable(true).build();
}

在這個例子中,我們使用了@Bean註解來定義名為"myExchange"的直接交換器。我們還使用了durable(true)選項來使交換器持久化,這樣即使在RabbitMQ伺服器關閉後也能保留交換器。

2、定義佇列

以下是建立兩個佇列的示例程式碼,一個用於普通訊息,一個用於重要訊息:

2023年再不會RabbitMQ,就要被淘汰了,手把手帶你飛

在程式碼中,我們使用了 @Bean 註解來定義 myQueueimportantQueue 兩個佇列。我們將 durable 引數設定為 false,這表示佇列是非持久化的,當 RabbitMQ 伺服器關閉時,佇列中的訊息將會丟失。

@Bean
public Queue myQueue() {
    return new Queue("myQueue"false);
}

@Bean
public Queue importantQueue() {
    return new Queue("importantQueue"false);
}

透過使用這些佇列,我們可以將訊息傳送到相應的佇列並讓消費者從佇列中接收訊息。

3、定義繫結

在這個例子中,我們將定義繫結,將交換器和佇列連線起來。以下是我們需要在應用程式中新增的註解:

@Bean
public Binding myBinding() {
    return BindingBuilder.bind(myQueue()).to(myExchange()).with("myRoutingKey").noargs();
}

@Bean
public Binding importantBinding() {
    return BindingBuilder.bind(importantQueue()).to(myExchange()).with("importantRoutingKey").noargs();
}

在這個例子中,我們使用了@Bean註解來定義名為"myBinding"和"importantBinding"的兩個繫結。我們還使用了with()選項來指定路由鍵,以便將訊息傳送到正確的佇列。

2023年再不會RabbitMQ,就要被淘汰了,手把手帶你飛

應用程式首先新增了繫結的註解,然後繫結將佇列和交換器連線起來。繫結還指定了路由鍵,以便將訊息傳送到正確的佇列。

一旦繫結成功,應用程式就可以向交換器傳送訊息。交換器會根據路由鍵將訊息路由到正確的佇列中。佇列最後將訊息傳送回應用程式,應用程式收到訊息並處理。

4、配置RabbitMQ連線

在這個例子中,我們還需要配置RabbitMQ連線,以便我們的應用程式可以與RabbitMQ伺服器通訊。以下是我們需要在應用程式中新增的屬性:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

在這個例子中,我們使用了Spring Boot的屬性檔案來配置RabbitMQ連線。我們指定了RabbitMQ伺服器的主機名、埠號、使用者名稱和密碼。

5、測試應用程式

現在我們已經完成了所有的設定和配置,可以測試我們的應用程式了。執行應用程式並檢查控制檯輸出,確保生產者已成功傳送訊息並且消費者已成功接收並處理訊息。還要確保訊息已正確地路由到相應的佇列中。

五、總結

在本文中,我們介紹了RabbitMQ作為訊息代理的基本概念,包括交換器、佇列、繫結和路由鍵等。

我們還介紹了Spring Boot如何與RabbitMQ整合,並使用Spring Cloud Stream來簡化訊息傳輸和處理過程。

在程式碼示例中,我們展示瞭如何建立生產者和消費者,並使用註解來定義交換器、佇列和繫結。我們還演示瞭如何配置RabbitMQ連線,並測試了應用程式的正確性和可靠性。

總的來說,本文是一個入門級別的指南,希望能夠幫助讀者更好地理解和應用Spring Cloud和訊息佇列技術。如果您想深入學習和了解更多高階主題,可以參考官方文件和其他線上資源。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024922/viewspace-2943774/,如需轉載,請註明出處,否則將追究法律責任。

相關文章