RabbitMQ & RabbitMQ集群

RabbitMQ

Erang开发
支持集群
支持内存节点和磁盘节点

RabbitMQ的模式

(1)单一模式
(2)普通模式(默认集群模式):只复制交换机和队列,不复制数据。
(3)镜像模式:复制交换机队列和数据

RabbitMQ 安装

配置yum源
yum install -y epel-release
安装RabbitMQ-Server
yum install -y rabbitmq-server
启动服务

/usr/lib/rabbitmq/bin/rabbitmq-plugins list //查看插件安装情况
/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management //启用rabbitmq_management服务
service rabbitmq-server start

打开后台管理
打开浏览器输入http://192.168.100.143:15672, 输入默认的Username:guest,输入默认的Password:guest ,登录后出现如图所示的界面。


后台管理界面

集群配置

1.环境

IP 主机名 用处
192.168.33.10 centos01 磁盘
192.168.33.11 centos02 内存
192.168.33.12 centos03 内存

配置本地域名,以centos01为例
vi /etc/hostname
修改为:
centos01.localdomain
vi /etc/hosts
添加hosts
192.168.33.10 centos01 192.168.33.11 centos02 192.168.33.12 centos03
centos02,centos03,做类似配置。
<font color='#A52A2A'>注意:一定要先配置域名和hosts,确保RabbitMQ Managerment中的Nodes 为 Rabbit@centos01</font>

2.安装软件

三台机器上安装RabbitMQ

yum install -y epel-release
yum install -y rabbitmq-server

3.复制erlang.cookie

# cat /var/lib/rabbitmq/.erlang.cookie 
XAHPZVPYUQDWWJIOHUPQ

复制XAHPZVPYUQDWWJIOHUPQ到centos02和centos03

三台服务器上启动
service rabbitmq-server start
如果过程如果报错:
{{shutdown,{failed_to_start_child,net_sup,{shutdown,{failed_to_start_child,auth,{"Cookie file /var/lib/rabbitmq/.erl
则修改:

chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie 
chmod 600 /var/lib/rabbitmq/.erlang.cookie

4.将centos02、centos03作为内存节点加入centos01节点集群中

rabbitmqctl stop_app    //停掉rabbit应用
rabbitmqctl join_cluster --ram rabbit@centos01 //加入到磁盘节点
rabbitmqctl start_app  //启动rabbit应用

如果执行:rabbitmqctl join_cluster --ram rabbit@centos01 失败。要确保rabbitmq management的nodes中显示的名字为:rabbit@centos01。如果不是,
则要修改 /etc/hostname 为:centos01.localdomain,并重启

5.rabbitmq management

打开http://localhost:15672/#/,nodes中显示为三个,则代表成功

集群节点

从图中可以看出,centos01 为磁盘节点(Disk),centos02,centos03 为内存节点(RAM)

6.启动trace功能

rabbitmq-plugins enable rabbitmq_tracing
rabbitmq trace_on

7.负载均衡

Rabbitmq集群配置好之后,需要使用负载均衡技术来将所有的机器进行串联起来,可以使用HaProxy来进行负载均衡。

RabbitMQ基本概念

Broker:可以理解为消息队列服务器实体,负责接收消息生产者的消息,然后将消息发送至消息接收者或者其他的Broker。
Exchange:消息交换机,是消息第一个到达的地方,消息通过它指定的路由规则,分发到不同的消息队列中去。
Queue:消息队列,消息通过发送和路由之后最终到达的地方。
Binding:绑定,作用是把Exchange和Queue按照路由规则绑定起来。
Routing Key:路由关键字,Exchange根据这个关键字进行消息投递。
Virtual host:虚拟主机,他是对Broker的虚拟划分,将消费者、生产这和他们依赖的AMQP相关结构进行隔离,一般是为了安全考虑。
Connection:连接,代表生产者、消费者、Broker之间惊喜通信的物理网络。
Channel:消息通道,用于连接生产者和消费者的逻辑结构。
Producer:消息生产者
Consumer:消息消费者

RabbitMQ Sprint Boot集成

1.项目配置

pom.xml依赖

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

application.properties rabbitmq 配置

spring.application.name=spirng-boot-rabbitmq-sender
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

.direct

队列配置

@Configuration
public class MQConfig {
    @Bean
    public Queue queue(){
        return new Queue("direct.queue");
    }
}

消息体Bean

public class User implements Serializable{
    private long id;
    private String name;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

生产者

@Component
public class MQProducer {
    @Autowired
    AmqpTemplate amqpTemplate;
    public void direct(User msg){
        amqpTemplate.convertAndSend("direct.queue",msg);
    }
}

消费者
@Component
public class MQReceiver {
@RabbitListener(queues = "direct.queue")
public void direct(User msg){
System.out.println(msg.getName());
}
}

2.topic

队列配置

@Component
@Configuration
public class MQTopicProducer {
    @Autowired
    AmqpTemplate amqpTemplate;

    @Bean(name = "queueA")
    public Queue queueA(){
        return new Queue("topic.queue.a");
    }

    @Bean(name = "queueB")
    public Queue queueB(){
        return new Queue("topic.queue.b");
    }

    @Bean(name = "topicExchange")
    public TopicExchange exchange(){
        return new TopicExchange("topic.exchange");
    }

    @Bean
    Binding bindingExchangeQueueA(@Qualifier("queueA") Queue queue, TopicExchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("topic.#");
    }

    @Bean
    Binding bindingExchangeQueueB(@Qualifier("queueB") Queue queue, TopicExchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("topic.queue.b");
    }


  
}

生产者

  public void topic(String routingKey,User user){
        amqpTemplate.convertAndSend("topic.exchange",routingKey,user);
    }

消费者

@Component
public class MQTopicConsumer {
    @RabbitListener(queues = "topic.queue.a")
    public void queueA(User user){
        System.out.println("queueA:"+user.getName());
    }

    @RabbitListener(queues = "topic.queue.b")
    public void queueB(User user){
        System.out.println("queueB:"+user.getName());
    }
}

3.fanout

队列配置

@Configuration
public class MQFanoutProducer {
    @Bean(name = "fanoutQueueA")
    Queue queueA(){
        return new Queue("fanout.queue.a");
    }
    @Bean(name = "fanoutQueueB")
    Queue queueB(){
        return new Queue("fanout.queue.b");
    }
    @Bean(name = "fanoutQueueC")
    Queue queueC(){
        return new Queue("fanout.queue.c");
    }

    @Bean
    FanoutExchange fanoutExchange(){
        return new FanoutExchange("fanout.exchange");
    }

    @Bean
    Binding bindingQueueA(@Qualifier("fanoutQueueA") Queue queue,FanoutExchange fanoutExchange){
        return BindingBuilder.bind(queue).to(fanoutExchange);
    }

    @Bean
    Binding bindingQueueB(@Qualifier("fanoutQueueB") Queue queue,FanoutExchange fanoutExchange){
        return BindingBuilder.bind(queue).to(fanoutExchange);
    }
    @Bean
    Binding bindingQueueC(@Qualifier("fanoutQueueC") Queue queue,FanoutExchange fanoutExchange){
        return BindingBuilder.bind(queue).to(fanoutExchange);
    }
}

生产者

@Autowired
    AmqpTemplate amqpTemplate;
    public void fanout(User user){
        amqpTemplate.convertAndSend("fanout.exchange","",user);
    }

消费者

@Component
public class MQFanoutConsumer {
    @RabbitListener(queues = "fanout.queue.a")
    public void queueA(User user){
        System.out.println("QueueA:"+user.getName());
    }
    @RabbitListener(queues = "fanout.queue.b")
    public void queueB(User user){
        System.out.println("QueueB:"+user.getName());
    }

    @RabbitListener(queues = "fanout.queue.c")
    public void queueC(User user){
        System.out.println("QueueC:"+user.getName());
    }

}

参考地址:http://blog.51cto.com/11134648/2155934

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容

  • 在此特此声明:一下所有链接均来自互联网,在此记录下我的查阅学习历程,感谢各位原创作者的无私奉献 ! 技术一点一点积...
    远航的移动开发历程阅读 11,114评论 12 197
  • 俗语说得好:"祸从口出。"这话一点也不假。我知道自己不怎么会说话,所以,我尽可能的在人前少说话,这样不仅仅是避免一...
    漫苏阅读 926评论 0 4
  • 酒牢粉 狂暴的醉鬼常常“入驻”粉红牢房,所以亮粉色有了别名——“酒牢粉”。 很多小女孩和一...
    新葵阅读 267评论 6 4
  • “窗子外面,一对情侣。男的在诘责,女的在哭,很大声。” “他们一定是想要年尾吵架,年初和。” “新年快乐。” “新...
    癫岛阅读 258评论 0 0