赞
踩
AMQP
,即Advanced Message Queuing Protocol
,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
消息中间件主要用于组件之间的解耦
,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP
的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
RabbitMQ
是一个开源的AMQP
实现,服务器端用Erlang
语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP
等,支持AJAX
。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
下图所示的是,流程是依次发送的,即:下订单->订单服务->发短信->发email->发push,所以时间很多
如下图所示,在订单服务中开启一个线程池,线程不在等待其他线程的结果,可以将同步转换为异步,但是不能解耦合
如下图所示,使用消息队列,MQ
系统,也可以把同步变为异步:当用户下订单后,MQ
系统返回订单id,不在管MQ
系统,其实MQ
系统在和其他系统交互就和订单服务没有什么影响了
使用MQ服务还可以解除彼此间的耦合
互联网的秒杀服务,如果巨大请求量发送到秒杀服务, 可能让服务器瘫痪,这时候用消息队列,接收处理巨大的请求,因为它不处理秒杀请求,所以还要给秒杀服务。这时候可以在消息队列里面设置一个阀值,如果达到某个请求,就不在发送给秒杀服务,而发送给其他服务了
消息生产者, 就是投递消息的程序。
消息消费者, 就是接受消息的程序。
队列就像存放了商品的仓库或者商店,是生产商品的工厂和购买商品的用户之间的中转站
在rabbitMQ
中, 信息流从你的应用程序出发, 来到Rabbitmq
的队列,所有信息可以只存储在一个队列中。 队列可以存储很多信息, 因为它基本上是一个无限制的缓冲区, 前提是你的机器有足够的存储空间。
多个生产者可以将消息发送到同一个队列中, 多个消息者也可以只从同一个队列接收数据
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
# 给应用起一个名字
spring.applicatin.name=springcloud-mq
# RabbitMQ的安装地址
spring.rabbitmq.host=192.168.126.140
# RabbitMQ的访问端口,和页面的15672端口不一样
spring.rabbitmq.port=5672
# RabbitMQ的用户名
spring.rabbitmq.username=admin
# RabbitMQ的密码
spring.rabbitmq.password=123456
@Configuration
public class QueueConfig {
//@Bean 方法的名字是默认的id名字,因此不要使用get+方法名
@Bean
// 注意:Queue要使用:org.springframework.amqp.core.Queue
public Queue createQueue() {
return new Queue("test_mq");
}
}
@Component
public class QueueSender {
@Autowired
private AmqpTemplate amqpTemplate;
public void send (String msg) {
//向消息队列发送消息
//参数一: 队列的名称。
//参数二: 消息
this.amqpTemplate.convertAndSend("test_mq",msg);
}
}
@Component
public class QueueReciver {
//此处的注解用来检测某一个特定队列是否变化
@RabbitListener(queues="test_mq")
public void reciver(String msg) {
System.out.println("=====================");
System.out.println(msg);
System.out.println("=====================");
}
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes=AppAction.class)
public class QueueTest {
@Autowired
private QueueSender sender;
/*
* 测试消息队列
*/
@Test
public void test(){
this.sender.send("Hello RabbitMQ");
}
}
报错:
ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.
解决:
Can access virtual hosts
修改为/
对于Centos7
要修改主机名保持的话,用hostnamectl
还有在/etc/hosts
这个文件也要改一下
修改/etc/hosts
下的文件
还有/etc/sysconfig/network
下的文件
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。