SpringCloud之RabbitMQ

  • 安装 erlang
    Erlang(['ə:læŋ])是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab 开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境.
========安装epel============
//安装GCC GCC-C++ Openssl等模块,安装过就不需要安装了
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel

============安装ncurses============
yum -y install ncurses-devel

===============安装erlang环境============
wget http://erlang.org/download/otp_src_18.2.1.tar.gz
tar xvfz otp_src_18.2.1.tar.gz 
./configure 
make install

========查看是否安装成功==========
erl -version

==========下载 RabbitMQ Server=============
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.9/rabbitmq-server-generic-unix-3.6.9.tar.xz   

==============对于下载xz包进行解压,首先先下载xz压缩工具:======
yum install xz

=========对rabbitmq包进行解压:===============
xz -d xz -d rabbitmq-server-generic-unix-3.6.9.tar.xz
tar -xvf rabbitmq-server-generic-unix-3.6.9.tar

===============随后移动至/usr/local/下 改名rabbitmq:=====
cp -r rabbitmq_server-3.6.9 /usr/local/rabbitmq

==========这种下载的方式解压后直接可以使用,无需再编译安装;======
进入到rabbit文件内,其命令文件存在于sbin文件夹下,因此需要将sbin文件夹的路径添加到PATH中:修改/etc/profile
export PATH=/usr/local/rabbitmq/sbin:$PATH   
执行source /etc/profile使得PATH路径更新,rabbitMQ安装成功。

=============随后启用MQ管理方式:========
rabbitmq-plugins enable rabbitmq_management   #启动后台管理
rabbitmq-server -detached   #后台运行rabbitmq

=============设置端口号,可供外部访问:=========
iptables -I INPUT -p tcp --dport 15672 -j ACCEPT

=============)添加用户和权限=========
默认网页guest用户是不允许访问的,需要增加一个用户修改一下权限,代码如下:
添加用户:rabbitmqctl add_user admin admin

添加权限:rabbitmqctl set_permissions -p "/" admin "." "." ".*"

修改用户角色:rabbitmqctl set_user_tags admin administrator

然后就可以远程访问了,然后可直接配置用户权限等信息。

安装 Web 管理界面插件
rabbitmq-plugins enable rabbitmq_management
SpringCloud之RabbitMQ_第1张图片


设置 RabbitMQ 远程 ip 登录
创建个 123456 帐号,密码 123456 为例

//创建账号
rabbitmqctl add_user 123456 123456

//设置用户角色
rabbitmqctl set_user_tags 123456 administrator

//设置用户权限
rabbitmqctl set_permissions -p "/" 123456 ".*" ".*" ".*"

//设置完成后可以查看当前用户和角色( 需要开启服务)
rabbitmqctl list_users

serverip:15672 。 其中 serverip 是 是 RabbitMQ-Server  所
在主机的 ip


SpringCloud之RabbitMQ_第2张图片

  • == 消息队列基础知识==
    1. Provider
    消息生产者,就是投递消息的程序。
    2. Consumer
    消息消费者,就是接受消息的程序。
    3. 没有使用消息队列时消息传递方式
    SpringCloud之RabbitMQ_第3张图片
    4. 使用消息队列后消息传递方式
    SpringCloud之RabbitMQ_第4张图片
    5.队列里存储了什么?
    在 rabbitMQ 中,信息流从你的应用程序出发,来到 Rabbitmq 的队列,所有信息可以只存储在一个队列中。队列可以存储很多信息,因为它基本上是一个无限制的缓冲区,前提是你的机器有足够的存储空间。
    6. 队列和应用程序的关系?
    多个生产者可以将消息发送到同一个队列中,多个消息者也可以只从同一个队列接收数据。

  • 实战编码
===========POM.XML==========
<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

==========application.properties============
spring.application.name=springcloud-mq

spring.rabbitmq.host=192.168.203.138
spring.rabbitmq.port=5672
spring.rabbitmq.username=123456
spring.rabbitmq.password=123456

===========配置类===========================
@Configuration
public class QueueConfig {

	/**
	 * 创建队列
	 * @return
	 */
	@Bean
	public Queue createQueue(){
		return new Queue("hello-queue");
	}
}

===================消息接受者===========
/**
 * 消息接收者
 */
@Component
public class Receiver {

	/**
	 * 接收消息的方法。采用消息队列监听机制
	 * @param msg
	 */
	@RabbitListener(queues="hello-queue")
	public void process(String msg){
		System.out.println("receiver: "+msg);
	}
}

==========消息发送者==================
/**
 * 消息发送者
 */
@Component
public class Sender {

	@Autowired
	private AmqpTemplate rabbitAmqpTemplate;
	/*
	 * 发送消息的方法
	 */
	public void send(String msg){
		//向消息队列发送消息
		//参数一:队列的名称。
		//参数二:消息
this.rabbitAmqpTemplate.convertAndSend("hello-queue", msg);
	}
}

  • 原理图
    SpringCloud之RabbitMQ_第5张图片
    SpringCloud之RabbitMQ_第6张图片
    SpringCloud之RabbitMQ_第7张图片
    SpringCloud之RabbitMQ_第8张图片
  • Rabbit 交换器
    Direct 交换器(阅 发布与订阅 完全匹配)
    SpringCloud之RabbitMQ_第9张图片

  • ConSumer 配置文件
spring.application.name=springcloud-mq
spring.rabbitmq.host=192.168.203.146
spring.rabbitmq.port=5672
spring.rabbitmq.username=123456
spring.rabbitmq.password=123456
#设置交换器的名称
mq.config.exchange=log.direct
#info 队列名称
mq.config.queue.info=log.info
#info 路由键
mq.config.queue.info.routing.key=log.info.routing.key
#error 队列名称
mq.config.queue.error=log.error
#error 路由键
mq.config.queue.error.routing.key=log.error.routing.key

  • Produce 配置文件
spring.application.name=springcloud-mq
spring.rabbitmq.host=192.168.70.131
spring.rabbitmq.port=5672
spring.rabbitmq.username=oldlu
spring.rabbitmq.password=123456
#设置交换器的名称
mq.config.exchange=log.direct
#info 路由键
mq.config.queue.info.routing.key=log.info.routing.key
#error 路由键
mq.config.queue.error.routing.key=log.error.routing.key
#error 队列名称
mq.config.queue.error=log.error
  • Consumer 编码
/**
 * 消息接收者
 * @author Administrator
 * @RabbitListener bindings:绑定队列
 * @QueueBinding  value:绑定队列的名称
 *                exchange:配置交换器
 * 
 * @Queue value:配置队列名称
 *        autoDelete:是否是一个可删除的临时队列
 * 
 * @Exchange value:为交换器起个名称
 *           type:指定具体的交换器类型
 */
@Component
@RabbitListener(
			bindings=@QueueBinding(
					value=@Queue(value="${mq.config.queue.info}",autoDelete="true"),
					exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.DIRECT),
					key="${mq.config.queue.info.routing.key}"
			)
		)
public class InfoReceiver {

	/**
	 * 接收消息的方法。采用消息队列监听机制
	 * @param msg
	 */
	@RabbitHandler
	public void process(String msg){
		System.out.println("Info........receiver: "+msg);
	}
}

==================error============

/**
 * 消息接收者
 * @author Administrator
 * @RabbitListener bindings:绑定队列
 * @QueueBinding  value:绑定队列的名称
 *                exchange:配置交换器
 * 
 * @Queue value:配置队列名称
 *        autoDelete:是否是一个可删除的临时队列
 * 
 * @Exchange value:为交换器起个名称
 *           type:指定具体的交换器类型
 */
@Component
@RabbitListener(
			bindings=@QueueBinding(
					value=@Queue(value="${mq.config.queue.error}",autoDelete="true"),
					exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.DIRECT),
					key="${mq.config.queue.error.routing.key}"
			)
		)
public class ErrorReceiver {

	/**
	 * 接收消息的方法。采用消息队列监听机制
	 * @param msg
	 */
	@RabbitHandler
	public void process(String msg){
		System.out.println("Error..........receiver: "+msg);
	}
}
  • Produce 消息生产者
/**
 * 创建消息队列
 */

@Configuration
public class QueueConfig {

	/**
	 * 创建队列
	 * @return
	 */
	@Bean
	public Queue createQueue(){
		return new Queue("hello-queue");
	}
}

===================接受消息===========
**
 * 消息接收者
 */
@Component
public class Receiver {

	/**
	 * 接收消息的方法。采用消息队列监听机制
	 * @param msg
	 */
	@RabbitListener(queues="hello-queue")
	public void process(String msg){
		System.out.println("receiver: "+msg);
	}
}

==================发送消息=============
/**
 * 消息发送者
 */
@Component
public class Sender {

	@Autowired
	private AmqpTemplate rabbitAmqpTemplate;
	/*
	 * 发送消息的方法
	 */
	public void send(String msg){
		//向消息队列发送消息
		//参数一:队列的名称。
		//参数二:消息
		this.rabbitAmqpTemplate.convertAndSend("hello-queue", msg);
	}
}


==========================================
/**
* 消息发送者
* @author Administrator
*
*/
@Component
public class Sender {
		@Autowired
		private AmqpTemplate rabbitAmqpTemplate;
		//exchange 交换器名称
		@Value("${mq.config.exchange}")
		private String exchange;
		//routingkey 路由键
			@Value("${mq.config.queue.error.routing.key}")
			private String routingkey;
	/*
	* 发送消息的方法
	*/
	public void send(String msg){
		//向消息队列发送消息
		//参数一:交换器名称。
		//参数二:路由键
		//参数三:消息
		this.rabbitAmqpTemplate.convertAndSend(this.exchange,
		this.routingkey, msg);
	}
}

  • Topic 交换器( 主题,规则匹配)
    SpringCloud之RabbitMQ_第10张图片

你可能感兴趣的:(SpringCloud)