最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

阿里云服務器部署RabbitMQ集群的詳細教程

 更新時間:2022年05月31日 08:50:41   作者:Bug?終結者  
本文是對?RabbitMQ?進階?阿里云服務器部署RabbitMQ集群簡單的概述,搭建集群達到消息的高可用,高可靠,可以提高吞吐量,集群部署是一個很不錯的選擇,鏡像隊列集群,這個我們可以根據配置來進行同步規(guī)則,根據需求來定制化我們的規(guī)則,感興趣的朋友一起看看吧

一、為什么要搭建RabbitMQ集群?

未部署集群的缺點

如果RabbitMQ集群只有一個broker節(jié)點,那么該節(jié)點的失效將導致整個服務臨時性的不可用,并且可能會導致message的丟失(尤其是在非持久化message存儲于非持久化queue中的時候)。可以將所有message都設置為持久化,并且使用持久化的queue,但是這樣仍然無法避免由于緩存導致的問題:因為message在發(fā)送之后和被寫入磁盤并執(zhí)行fsync之間存在一個雖然短暫但是會產生問題的時間窗。通過publisher的confirm機制能夠確??蛻舳酥滥男﹎essage已經存入磁盤,盡管如此,一般不希望遇到因單點故障導致服務不可用。

部署集群后

如果RabbitMQ集群是由多個broker節(jié)點構成的,那么從服務的整體可用性上來講,該集群對于單點失效是有彈性的,但是同時也需要注意:盡管exchange和binding能夠在單點失效問題上幸免于難,但是queue和其上持有的message卻不行,這是因為queue及其內容僅僅存儲于單個節(jié)點之上,所以一個節(jié)點的失效表現為其對應的queue不可用。

RabbitMQ本身是基于Erlang編寫,Erlang語言天生具備分布式特性(通過同步Erlang集群各節(jié)點的erlang.cookie來實現)。因此,RabbitMQ天然支持集群。集群是保證可靠性的一種方式,同時可以通過水平擴展以達到增加消息吞吐量能力的目的。

為了提高程序的吞吐量,保持消息的可靠性,一臺機器掛了后,RabbitMQ能夠正常生產,消費消息。

二、RabbitMQ集群的三種模式

rabbitmq有三種模式:單機模式,普通集群模式,鏡像集群模式

??單機模式

Demo級別的,一般只是本機測試玩玩而已,生產環(huán)境下不會用的。

?普通集群模式

多臺機器上啟動多個rabbitmq實例,每個機器啟動一個。
但是你創(chuàng)建的queue,只會放在一個rabbtimq實例上,但是每個實例都同步queue的元數據(存放含queue數據的真正實例位置)。消費的時候,實際上如果連接到了另外一個實例,那么那個實例會從queue所在實例上拉取數據過來。

示意圖

這種方式確實很麻煩,也不怎么好,沒做到所謂的分布式,就是個普通集群。

普通集群的方式,確實達到了消息的高可用,但沒辦法保證可靠性,沒做到分布式,簡而言之,只是一個普通的集群。

缺點:

  • 可能會在RabbitMQ集群內部產生大量數據傳輸
  • 可用性沒有達到保證,一臺機器掛了就是掛了,無法恢復,只能手動恢復

?鏡像隊列

這種模式,才是所謂的rabbitmq的高可用模式,跟普通集群模式不一樣的是,你創(chuàng)建的queue,無論元數據還是queue里的消息都會存在于多個實例上,然后每次你寫消息到queue的時候,都會自動把消息到多個實例的queue里進行消息同步。

上圖中每個節(jié)點有一個queue,生產者生產完畢數據后投遞到指定交換機的隊列,交換機的隊列進行消息同步。

每個節(jié)點queue都有一個完整的rabbitmq節(jié)點,所以這種方式叫做鏡像集群

鏡像集群模式的好處與壞處

好處: 任何一個節(jié)點宕機后,其它節(jié)點不受影響,正常使用

壞處:

  • 性能開銷大,消息同步所有機器,導致網絡帶寬壓力和消耗很重
  • 沒有擴展性,如果某個queue負載很重,加機器,新增的機器也包含了這個queue的所有數據,沒有辦法擴展

對于以上方式,我們的鏡像集群可以通過配置來解決這種擴展性的問題,配置同步的方式

三、阿里云服務器下Docker搭建RabbitMQ集群

??Docker安裝RabbitMQ集群

確保機器中安裝了Docker,若未安裝,可看:Docker安裝阿里云服務器和在虛擬機安裝遇到的坑(問題小結)

使用Docker安裝RabbitMQ鏡像

# 拉取鏡像,帶有管理界面的版本
docker pull rabbitmq:management

查看拉取的鏡像

docker images

運行Docker鏡像

# 開啟第一個RabbitMQ服務
docker run -d --hostname myRabbit1 --name rabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

# 開啟第二個
docker run -d --hostname myRabbit2 --name rabbit2 -p 15673:15672 -p 5673:5672 --link rabbit1:myRabbit1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

# 開啟第三個
docker run -d --hostname myRabbit3 --name rabbit3 -p 15674:15672 -p 5674:5672 --link rabbit1:myRabbit1 --link rabbit2:myRabbit2 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

查看正在運行的鏡像

docker ps

成功運行

配置RabbitMQ節(jié)點之間的關系

設置節(jié)點1

[root@wanghuichen /]# docker exec -it rabbit1 bash
root@myRabbit1:/# rabbitmqctl stop_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Stopping rabbit application on node rabbit@myRabbit1 ...
root@myRabbit1:/# rabbitmqctl reset
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Resetting node rabbit@myRabbit1 ...
root@myRabbit1:/# rabbitmqctl

設置節(jié)點2

[root@wanghuichen /]# docker exec -it rabbit2 bash
root@myRabbit2:/# rabbitmqctl stop_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Stopping rabbit application on node rabbit@myRabbit2 ...
root@myRabbit2:/# rabbitmqctl reset
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Resetting node rabbit@myRabbit2 ...
root@myRabbit2:/# rabbitmqctl join_cluster --ram rabbit@myRabbit1
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Clustering node rabbit@myRabbit2 with rabbit@myRabbit1
root@myRabbit2:/# rabbitmqctl join_cluster --ram rabbit@myRabbit1

配置節(jié)點3

[root@wanghuichen /]# docker exec -it rabbit3 bash
root@myRabbit3:/# rabbitmqctl stop_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Stopping rabbit application on node rabbit@myRabbit3 ...
root@myRabbit3:/# rabbitmqctl reset
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Resetting node rabbit@myRabbit3 ...
root@myRabbit3:/# rabbitmqctl join_cluster --ram rabbit@myRabbit1
root@myRabbit3:/# rabbitmqctl start_app

進入每個集群依次設置用戶密碼

rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

配置鏡像隊列

[root@wanghuichen /]# docker exec -it rabbit1 bash
root@myRabbit1:/# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
root@myRabbit1:/# rabbitmqctl cluster_status
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Cluster status of node rabbit@myRabbit1 ...

查看集群狀態(tài)

rabbitmqctl cluster_status

常用命令

# 查看已經運行過但停止了的鏡像
docker ps -a
# 停止鏡像
docker stop 鏡像id/鏡像名稱
# 開啟鏡像,恢復運行狀態(tài)
dockers start 鏡像id/鏡像名稱
# 刪除鏡像
docker rm 鏡像id/鏡像名稱
# 刪除所有鏡像
docker rmi $(docker ps -a)

??測試RabbitMQ集群

瀏覽器輸入 您的ip地址:15673

部署RabbitMQ鏡像集群成功~

如果出現無法訪問的情況,可在阿里云服務器開啟安全組,因為阿里云默認全部開啟了安全組,配置允許訪問的端口即可

再次測試即可成功~

四、SpringBoot整合RabbitMQ集群

?創(chuàng)建Maven聚合工程

File —> New —> Project —> Maven —> 直接Next 進入下一步創(chuàng)建普通的Maven工程即可

創(chuàng)建一個默認的Maven聚合工程,將src文件夾刪除,該工程就是一個Maven聚合工程

??引入共有依賴

引入依賴如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wanshi</groupId>
    <artifactId>springboot-rabbitmq</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>rabbitmq-order-producer</module>
        <module>rabbitmq-order-consumer</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.5</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <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>
    </dependencyManagement>

</project>

?創(chuàng)建生產者

在項目內,新建一個Moudle,rabbitmq-order-producer 默認Maven工程,下一步即可

引入依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.5</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>rabbitmq-order-producer</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <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>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

?創(chuàng)建消費者

在項目內,新建一個Moudle,rabbitmq-order-cousumer 默認Maven工程,下一步即可

引入依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-rabbitmq</artifactId>
        <groupId>com.wanshi</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>rabbitmq-order-consumer</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <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>

</project>

Maven聚合工程創(chuàng)建完成圖

Maven依賴圖

自行手寫MainApplication即可

創(chuàng)建完成!

??核心源碼

生產者服務配置

# 服務端口
server:
  port: 8080
# 配置rabbitmq服務
spring:
  rabbitmq:
    username: admin
    password: admin
    virtual-host: /
    connection-timeout: 16000
    addresses: 8.130.28.198:5672, 8.130.28.198:5673, 8.130.28.198:5674,
    # 啟用消息確認模式
    publisher-confirm-type: correlated

    # 啟用 return 消息模式
    publisher-returns: true
    template:
      mandatory: true

消費者服務配置

# 服務端口
server:
  port: 8081
# 配置rabbitmq服務
spring:
  rabbitmq:
    username: admin
    password: admin
    virtual-host: /
    addresses: 8.130.28.198:5672, 8.130.28.198:5673, 8.130.28.198:5674,

生產者

package com.wanshi.service;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.UUID;

/**
 * @author whc
 * @date 2022/5/23 18:50
 */

@Service
public class OrderService {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void makeOrder() {
        String orderId = UUID.randomUUID().toString();
        System.out.println("訂單生成成功:" + orderId);
        String exchange_name = "fanout_order_exchange";
        String routeingKey = "";
        rabbitTemplate.convertAndSend(exchange_name, routeingKey, orderId);
    }
}

消費者

交換機的聲明與隊列我們放在消費者端,因為消費者是先開啟的,如果沒有交換機和隊列,則會報錯!

RabbitMQConfiguration

package com.wanshi.config;

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

/**
 * @author whc
 * @date 2022/5/23 10:18
 */
@Configuration
public class RabbitMQConfiguration {

    //1.聲明注冊fanout模式的交換機
    @Bean
    public FanoutExchange fanoutExchange() {
        return new FanoutExchange("fanout_order_exchange", true, false);
    }

    //2.聲明隊列,sms.fanout.queue email.fanout.queue msg.fanout.queue
    @Bean
    public Queue smsQueue() {
        return new Queue("sms.fanout.queue", true);
    }

    @Bean
    public Queue emailQueue() {
        return new Queue("email.fanout.queue", true);
    }

    @Bean
    public Queue msgQueue() {
        return new Queue("msg.fanout.queue", true);
    }

    //3.完成綁定關系(隊列與交換機完成綁定關系)
    @Bean
    public Binding smsBind() {
        return BindingBuilder.bind(smsQueue()).to(fanoutExchange());
    }

    @Bean
    public Binding emailBind() {
        return BindingBuilder.bind(emailQueue()).to(fanoutExchange());
    }

    @Bean
    public Binding msgBind() {
        return BindingBuilder.bind(msgQueue()).to(fanoutExchange());
    }
}

編寫具體業(yè)務消費類

FanoutEmailConsumer

package com.wanshi.service;

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

/**
 * @author whc
 * @date 2022/5/23 18:53
 */
@RabbitListener(queues = "email.fanout.queue")
@Component
public class FanoutEmailConsumer {

    @RabbitHandler
    public void messageService(String message) {
        System.out.println("fanout email ==>" + message);
    }
}

FanoutMsgConsumer

package com.wanshi.service;

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

/**
 * @author whc
 * @date 2022/5/23 18:55
 */
@RabbitListener(queues = "msg.fanout.queue")
@Component
public class FanoutMsgConsumer {

    @RabbitHandler
    public void messageService(String message) {
        System.out.println("fanout msg ==>" + message);
    }
}

FanoutSmsConsumer

package com.wanshi.service;

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

/**
 * @author whc
 * @date 2022/5/23 18:54
 */
@RabbitListener(queues = "sms.fanout.queue")
@Component
public class FanoutSmsConsumer {

    @RabbitHandler
    public void messageService(String message) {
        System.out.println("fanout sms ==> " + message);
    }
}

編寫完成!

五、測試消息的生產與消費

啟動消費者,查看RabbitMQ隊列的情況

啟動消費者

查看RabbitMQweb管理界面綁定信息

交換機

查看隊列Queue

查看其它兩臺機器是否同步了數據

15674

15675

生產者投遞消息,查看消費者消費情況

成功消費數據!

只生產消息,關閉消費者,查看消息同步情況

已成功同步消息~

?小結

以上就是【Bug 終結者】對 RabbitMQ 進階 – 阿里云服務器部署RabbitMQ集群簡單的概述,搭建集群達到消息的高可用,高可靠,可以提高吞吐量,集群部署是一個很不錯的選擇,鏡像隊列集群,這個我們可以根據配置來進行同步規(guī)則,根據需求來定制化我們的規(guī)則!

到此這篇關于阿里云服務器部署RabbitMQ集群的文章就介紹到這了,更多相關阿里云服務器部署RabbitMQ集群內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

突泉县| 尚义县| 剑河县| 潮州市| 巴林右旗| 林西县| 定南县| 凤庆县| 房产| 永泰县| 乌兰浩特市| 安远县| 福建省| 六安市| 万荣县| 宜兰市| 松桃| 长泰县| 绥棱县| 福鼎市| 华池县| 南雄市| 庆元县| 万山特区| 合阳县| 绩溪县| 湖南省| 依兰县| 兴山县| 峨山| 泌阳县| 平塘县| 石屏县| 扎兰屯市| 崇礼县| 英吉沙县| 曲阜市| 宁河县| 涡阳县| 丰镇市| 玛沁县|