【SpringBoot MQ系列教程】RabbitMq 初體驗

【SpringBoot MQ系列教程】RabbitMq 初體驗

mq 在異步解耦削峯的優點很是突出,如今不少的項目都會用到,掌握 mq 的知識點,瞭解如何順暢的使用 mq,能夠說是一個必備的職業技能點了java

接下來咱們進入 rabbitmq 的學習過程git

<!-- more -->github

I. 環境準備

在測試以前,須要安裝 rabbitmq,下面分別給出 mac + centos 的安裝教程web

1. mac 安裝

安裝命令spring

brew install rabbitmq

## 進入安裝目錄
cd /usr/local/Cellar/rabbitmq/3.7.5

# 啓動
brew services start rabbitmq
# 當前窗口啓動
rabbitmq-server

啓動控制檯以前須要先開啓插件centos

./rabbitmq-plugins enable rabbitmq_management

進入控制檯: http://localhost:15672/springboot

用戶名和密碼:guest,guestbash

2. centos 安裝

安裝命令app

yum install erlang
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.15/rabbitmq-server-3.6.15-1.el6.noarch.rpm
yum install rabbitmq-server-3.6.15-1.el6.noarch.rpm

插件開啓異步

rabbitmq-plugins enable rabbitmq_management
# 啓動
rabbitmq-server -detached

3. 配置

添加帳號,設置權限

## 添加帳號
./rabbitmqctl add_user admin admin
## 添加訪問權限
./rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
## 設置超級權限
./rabbitmqctl set_user_tags admin administrator

4. 項目環境

接下咱們建立一個 SpringBoot 項目,用於簡單的體驗一下 rabbitmq 的發佈和消費消息

  • springboot 版本爲2.2.1.RELEASE
  • rabbitmq 版本爲 3.7.5

依賴配置文件 pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </pluginManagement>
</build>
<repositories>
    <repository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>https://repo.spring.io/libs-snapshot-local</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/libs-milestone-local</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
    <repository>
        <id>spring-releases</id>
        <name>Spring Releases</name>
        <url>https://repo.spring.io/libs-release-local</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

application.yml配置文件中,添加 rabbitmq 的相關屬性

spring:
  rabbitmq:
    virtual-host: /
    username: admin
    password: admin
    port: 5672

II. 實例演示

接下來咱們看一個hello world版本的 rabbitmq 的使用姿式,一個簡單發佈消息、消費消息

1. 發佈消息

消息發佈,咱們主要藉助AmqpTemplate來實現

@Component
public class PublishDemo {
    @Autowired
    private AmqpTemplate amqpTemplate;

    public String publish2mq(String ans) {
        String msg = "hello world = " + ans;
        System.out.println("publish: " + msg);
        amqpTemplate.convertAndSend(Pkg.exchange, Pkg.routing, msg);
        return msg;
    }
}

上面的 case 中,主要方法在於amqpTemplate#convertAndSend,第一個參數爲 exchangeName, 第二個爲 routingKey

常量配置以下

class Pkg {
    final static String exchange = "topic.e";
    final static String routing = "r";
    final static String queue = "topic.a";
}

2. 消費消息

消費消息,須要指定 Queue,經過 routingKey 綁定 exchange,以下

@Service
public class ConsumerDemo {

    @RabbitListener(bindings = @QueueBinding(value = @Queue(value = Pkg.queue, durable = "false", autoDelete = "true"),
            exchange = @Exchange(value = Pkg.exchange, ignoreDeclarationExceptions = "true",
                    type = ExchangeTypes.TOPIC), key = Pkg.routing))
    public void consumer(String msg) {
        System.out.println("consumer msg: " + msg);
    }
}

3. 測試 demo

寫一個簡單的 rest 接口,用於接收參數,發佈消息到 mq,並被ConsumerDemo消費

@RestController
public class PubRest {
    @Autowired
    private PublishDemo publishDemo;

    @GetMapping(path = {"", "/", "/publish"})
    public String publish(String name) {
        return publishDemo.publish2mq(name);
    }
}

II. 其餘

0. 項目

1. 一灰灰 Blog

盡信書則不如,以上內容,純屬一家之言,因我的能力有限,不免有疏漏和錯誤之處,如發現 bug 或者有更好的建議,歡迎批評指正,不吝感激

下面一灰灰的我的博客,記錄全部學習和工做中的博文,歡迎你們前去逛逛

一灰灰blog

相關文章
相關標籤/搜索