RabbitMQ使用

今天学习了关于MQ的一些知识,把内容总结下,理解可能有些错误,以后逐步改进。

1.什么是MQ,为什么要使用MQ?

http://blog.sina.com.cn/s/blog_6166d8170100h0ty.html

简单点说:MQ即消息队列,那么提到消息就会提出一些:谁发出消息,谁接收消息?消息的发送方和接收方是怎么进行连接的,是怎么获取对应的消息的?对于这种模式应用在什么需求之上?等等这一系列的问题。

现在很多项目都是分布式的系统,这些系统是逻辑上集中维护整个系统,物理上分离。也就是说一个大的系统是有多个子系统来构成的,那么这些子系统直接如何进行通信呢?如何进行跨域互相访问呢?我们知道有HttpClient,有jsonp这些工具。那么MQ的作用是什么呢?其实MQ我们可以称之为一个中间件,也是为了提供应用程序与应用程序间的通信的。

对于前面说的谁发出消息:我们成为消息的生产者。谁接收消息:我们成为消息的消费者。生产者发送消息到队列,然后消费者从队列中获取消息。这就是MQ的主要模式。

使用MQ的好处有哪些呢?

它有效的降低了应用程序的之间的耦合度,有效解决分布式系统中的数据同步的难题。

关于数据同步:举个例子:比如我们信息缓存到了Redis中,但是我们这个信息在数据库进行了修改,那么,Redis中的数据如何进行更新呢。 对于这个问题的核心思想:就是将Redis中的key删除。重新将数据放入缓存。 

方案一:之前的一种解决方案:我们写一个同步数据的接口,然后供后台调用来实现数据的同步。

我们分析这个方案一的优缺点:优点:实现了数据的同步。缺点是:关于信息的增删改都需要调用接口,频繁调用该接口,一个是效率太低,第二是耦合度太高。

(关于耦合度的理解:个人理解就是关联性太强,一处修改,其他地方也要跟着修改)。

方案二:利用MQ来实现数据的同步。这个后面我们会细讲如何实现的。

所以MQ的作用:实现数据的同步,实现系统间的解耦,降低系统间的耦合度。

2、MQ的分类

上面说了MQ,那么MQ有哪些分类呢?

我们可以在开源中国看下:

上面就是MQ的分类,有很多。今天我们主要讲RabbitMQ.

3、什么是RabbitMQ?

RabbitMQ是MQ的一种,是开源的,我们称之为兔子MQ.用来处理应用程序与应用程序直接的通信。

RabbitMQ是用ErLang语言进行开发的,ErLang语言是一种面向并发的动态编程语言,即主要是处理高并发模式的编程。

4、RabbitMQ的安装(windows与linux)

不论是window是还是linux系统我们要使用RabbitMQ,首先我们要创建ErLang的环境才可以,否则是不支持RabbitMQ的。

接下来我们看下如何安装吧:

首先window下的安装:

安装注意事项:将这些注意事项避免了,我们才能顺利安装完成:

3.计算机名必须是英文:

满足了上面四个条件,我们进行下载安装:

下载地址:

下载地址:http://www.rabbitmq.com/download.html

(1)安装Erlang环境:

下载:http://www.erlang.org/download/otp_win64_17.3.exe

这个的安装,都是采用默认的方式,然后直接下一步即可。

(2)安装RabbitMQ

这个也是采用默认的方式,不要修改安装路径,直接下一步。

(3)安装完成后验证是否成功

如何都可以,则表示安装成功。

下面是centos6.5下安装RabbitMQ:

  Linux下安装

1.1. 安装Erlang

1.1.1.   添加yum支持

cd /usr/local/src/

mkdir rabbitmq

cd rabbitmq

wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm

rpm -Uvh erlang-solutions-1.0-1.noarch.rpm

rpm --import http://packages.erlang-solutions.com/rpm/erlang_solutions.asc

sudo yum install erlang

1.2. 安装RabbitMQ

上传rabbitmq-server-3.4.1-1.noarch.rpm文件到/usr/local/src/rabbitmq/

安装:

rpm -ivh rabbitmq-server-3.4.1-1.noarch.rpm

1.2.1.   启动、停止

service rabbitmq-server start

service rabbitmq-server stop

service rabbitmq-server restart

1.2.2.   设置开机启动

chkconfig rabbitmq-server on

1.2.3.   设置配置文件

cd /etc/rabbitmq

cp /usr/share/doc/rabbitmq-server-3.4.1/rabbitmq.config.example /etc/rabbitmq/

mv rabbitmq.config.example rabbitmq.config

1.2.4.   开启用户远程访问

vi /etc/rabbitmq/rabbitmq.config

注意要去掉后面的逗号。

1.2.5.   开启web界面管理工具

rabbitmq-plugins enable rabbitmq_management

service rabbitmq-server restart

1.2.6.   防火墙开放15672端口

/sbin/iptables -I INPUT -p tcp --dport 15672 -j ACCEPT

/etc/rc.d/init.d/iptables save

2.   添加用户

2.1. 用户角色

1、超级管理员(administrator)

可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。

2、监控者(monitoring)

可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

3、策略制定者(policymaker)

可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。

4、普通管理者(management)

仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。

5、其他

无法登陆管理控制台,通常就是普通的生产者和消费者。

2.2. 创建Virtual Hosts

设置权限:

 

5、RabbitMQ的模式分类?

说分类之前,我们先说下MQ的端口:

总共有三种:AMOP:这个是一种协议,类似于http协议,而RabbitMQ则是对这种协议的一种实现形式。端口是5672

        RabbitMQ:端口是15672(这个仅限于登录RabbitMQ的端口使用)

      ClusterMQ:端口是25672(集群中的端口)

在于java项目进行相互的时候我们使用的基于AMOP协议的5672端口。

前三种模式:1、2是不能实现数据同步的。

 

5、什么是springRabbit?

即springRabbit,有了对底层的封装,我们用起来更方便。下面我们看下具体如何使用。

6、spingRabbit的应用?

首先添加依赖:

(1)生产者:

配置文件+发送消息代码

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit"
	xsi:schemaLocation="http://www.springframework.org/schema/rabbit
	http://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd
	http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">

	<!-- 定义RabbitMQ的连接工厂 -->
	<rabbit:connection-factory id="connectionFactory"
		host="${rabbitmq.host}" port="${rabbitmq.port}" username="${rabbitmq.username}" password="${rabbitmq.password}"
		virtual-host="${rabbitmq.vhost}" />
		<!-- 管理-->
		<rabbit:admin connection-factory="connectionFactory"/>
	<!-- 定义交换机 ,auto-declare指定交换机自动声明,自动创建 -->
	<rabbit:topic-exchange name="TAOTAO-ITEM-EXCHANGE"
		auto-declare="true" durable="true">
		</rabbit:topic-exchange>
		<!-- 定义一个模板 -->
		<rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" exchange="TAOTAO-ITEM-EXCHANGE"></rabbit:template>
	

</beans>

发送消息的代码: 

 

(2)消费者配置+代码

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit"
	xsi:schemaLocation="http://www.springframework.org/schema/rabbit
	http://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd
	http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">

	<!-- 定义RabbitMQ的连接工厂 -->
	<rabbit:connection-factory id="connectionFactory"
		host="${rabbitmq.host}" port="${rabbitmq.port}" username="${rabbitmq.username}" password="${rabbitmq.password}"
		virtual-host="${rabbitmq.vhost}" />
		<!-- 管理-->
		<rabbit:admin connection-factory="connectionFactory"/>
	<!-- 这是消费者,消费者需要监听消息队列 -->
	   <rabbit:queue name="TAOTAO-ITEM-EXCHANGE" auto-declare="true" durable="true"></rabbit:queue>
     <!-- 将定义的消费者加入到bean中 ,即消费者对象,即谁来消费-->
     <bean id="contentMQHandler" class="com.taotao.mq.handler.ConentMQHandler"></bean>
     <!-- 监听队列,消费者监听队列 -->
     <rabbit:listener-container connection-factory="connectionFactory">
        <rabbit:listener ref="contentMQHandler" method="execute" queue-names="TAOTAO-ITEM-EXCHANGE"/>
     </rabbit:listener-container>

</beans>

  代码:

(3)生产者和消费都写完了,是不是两者就可以互相通信呢?答案是否定的。

生产者将消息发送到交换机,消费者绑定消息队列。那么交换机和消息队列还没绑定呢。

对于这个的绑定,有两种方式:一种是java代码绑定,一种是在RabbitMQ的网页上进行操作绑定。

我们推荐使用第二种:方便快捷。

至此,这就是整个队Rabbit的应用。

最后我们讲讲消息的确认:

这个跟我们平时的购物券很像:

有两种模式:第一:自动模式。即领了券就表示确认了,不论你有没有消费

      第二:手动模式。即领了券,你必须用了券之后才表示确认。

而在这里,我们可以利用监听队列的设置:true表示自动模式。false表示手动模式。

原文地址:https://www.cnblogs.com/fengli9998/p/6783113.html