rabbitmq基础知识

1.消息队列的使用场景:

1.解耦

2.流量削峰

3.异步处理

4.日志处理

5.消息通讯

1.Message

消息:由消息头和消息体组成,消息体是不透明的;消息头则由一系列不可选属性组成,这些属性包括routing-key(路由键)、priority(优先级别)、delivery-mode(是否持久化属性)

2.Publisher

消息的生产者,也是一个向交换器发布消息的客户端应用程序。

3.Consumer

消息的消费者:消费由生产者发送到队列中的消息。

4.Exchange

交换器:用来接收生产者发送的消息并将这些消息路由给服务器中的队列。

    三种常用的交换器类型:direct(发布与订阅)、fanout(广播)、topic(主题,规则匹配)

5.Binding  

绑定:用于消息队列和交换器之间的映射。绑定就是通过路由键将交换器和队列连接起来的路由规则。

6.Queue

消息队列:用来保存消息知道发送给消费者,是消息的容器,一个消息可以投入一个或多个队列中,等待消费者取走。

7.Routing-Key

路由键:rabbitmq决定消息该投递到那个队列的规则。消息发送到mq服务器时,消息将拥有一个路由键,即便时空,rabbitmq也会将其和绑定使用的路由键进行匹配。

如果相匹配,消息将会投递到该队列;如果不匹配,消息将进入黑洞(rabbitmq单独存放在Queue中)

8.Connection

连接:rabbit服务器和服务建立的tcp链接

9.Channel

信道:客户端和rabbitmq之间会创建AMQP信道,无论发布消息,接收消息,订阅队列,这些都需要通过信道完成,一个链接中可存在多个信道。

10.virtual host

虚拟主机:表示一批交换器,消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost本质上就是一个mini版的rabbitmq服务器,拥有自己的队列,交换器,绑定和权限机制,vhost是AMQP概念的基础,必须在连接时指定,rabbitmq默认vhost是/

11.borker :消息队列服务器实体。

交换器和队列的关系:

交换器通过路由键和队列绑定到一起,如果消息拥有的路由键跟消息队列和交换器的路由键匹配,那么消息就会被路由到该绑定的队列中。

rabbitmq为什么需要信道,而不是直接使用tcp通信?

1.TCP的创建和销毁开销特别大,创建需要3次握手,销毁需要4次分手。

2.信道的原理是一条线程一条通道,多条线程多条通道同用一条TCP链接,一条TCP链接可以容纳无限的信道,即使每秒成千上万的请求也不会成为性能瓶颈。

 

创建rabbitmq的springboot项目需要的依赖

客户端

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.sbh</groupId>
  <artifactId>rabbitmq-server</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  
  <parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.13.RELEASE</version>
  </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-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
		</dependency>
  </dependencies>
  <build>
    <finalName>rabbitmqServer</finalName>
  </build>
</project>

配置application文件

#rabbitmq配置文件
spring.rabbitmq.host=192.168.106.130
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

#队列名称
mq.rabbitmq.queue.info=log.queque.info
#交换器名称
mq.rabbitmq.exchange.info=log.exchange.info
#路由键
mq.rabbitmq.routingKey.info=log.info
server.port=8081

package com.sbh.rabbitmq.client;

import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
 * 
 * @author CYH
 *
 */
@Component
@RabbitListener(bindings=@QueueBinding(
		exchange=@Exchange(value="${mq.rabbitmq.exchange.info}",type=ExchangeTypes.DIRECT),
		value=@Queue(autoDelete="true",value="${mq.rabbitmq.queue.info}"),
		key="${mq.rabbitmq.routingKey.info}"
		))
public class Client {
	
	@RabbitHandler
	public void hand(String message){
		
		System.out.println("消费者"+message);
	}
}

 

生产者:


server.port=8080

#rabbitmq配置文件
spring.rabbitmq.host=192.168.106.130
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

#队列名称
mq.rabbitmq.queue.info=log.queque.info
#交换器名称
mq.rabbitmq.exchange.info=log.exchange.info
#路由键
mq.rabbitmq.routingKey.info=log.info
package com.sbh.rabbitmq.server;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class ServerService {
	
	@Value("${mq.rabbitmq.exchange.info}")
	private String exchange;
	@Value("${mq.rabbitmq.routingKey.info}")
	private String routingKey;
	@Autowired
	private AmqpTemplate amqpTemplate;
	
	public void message() {
		
		amqpTemplate.convertAndSend(exchange, routingKey, "你好");
	}
}

测试代码:

package com.sbh.rabbitmq.server;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(value=SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=App.class)
public class ServerServiceTest {
	@Autowired
	private ServerService serverService;
	@Test
	public void testMessage() {
		while (true) {
			try {
				serverService.message();
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}

}

 

rabbitmq服务器添加交换器

 

队列:

绑定交换器和队列

 

 

输出结果:

转载于:https://my.oschina.net/u/3484671/blog/2870529

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值