最近在都一本名为《暗时间》的书,书的作者是一位程序员,而且对心理学还有研究,刚好闲来无事的所以阅读了一番,没想到却被深深吸引。书中有一章为“打造自己的核心竞争力”,提到了为什么要写博客,书写博客是为了缓存自己学习知识的思维,而且还用了一个例子来说明,“如果数学家没有了纸和笔,只在自己的脑子中做运算,那么人人类的文明不会有今天”。这番话深深触动了我。最为重要的是,写博客所带来的收益,不止帮我解决了如何使用一门技术的问题,还帮我拓宽了技术面,激励我去学习更深层的原理。
好书如同贵人,读一本书就犹如和一个高情商的人聊天,而和“高情商”的人连天是乐此不疲的。
言归正传,下面就让我来展开说说mq
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。
消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。
rabbitmq是我们初学者常常使用的中间件,使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP,STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。
作为初学者来说,我只知道它是一个“高级消息队列协议”,至于往深层次的说,我对于这一协议还有点模糊。
如果大家想要详细了解,可以看看这位博主写的AMQP协议学习 - 知乎 (zhihu.com)
请参考这幅图
以下是里边涉及到的概念
在Centos7服务器上使用Docker来安装
docker pull rabbitmq:3.9-management
docker run \
-e RABBITMQ_DEFAULT_USER=user \
-e RABBITMQ_DEFAULT_PASS=password \
--name mq \
--hostname mq1 \
-p 15672:15672 \
-p 5672:5672 \
-d \
rabbitmq:3.9-management
15672端口为访问端口
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-amqpartifactId>
dependency>
1)要使用rabbitmq参考rabbit工作原理的图,分为如下步骤:
2)springboot整合之后简写
spring:
rabbitmq:
host: 192.168.150.101 # 主机名
port: 5672 # 端口
virtual-host: / # 虚拟主机
username: username # 用户名
password: password # 密码
交换机和队列需自己创建和绑定关系
1)声明交换机和队列,并绑定关系
//交换机
public static final String EXCHANGE_FANOUT = "fanout";
//队列名称
public static final String NOTIFY_QUEUE = "notify_queue";
public static final String REPLY_QUEUE = "reply_queue";
//声明交换机
@Bean(EXCHANGE_FANOUT)
public FanoutExchange exchange_direct(){
// 三个参数:交换机名称、是否持久化、当没有queue与其绑定时是否自动删除
return new FanoutExchange(EXCHANGE_FANOUT, true, false);
}
//声明队列
@Bean(NOTIFY_QUEUE)
public Queue publish_queue(){
return QueueBuilder.durable(NOTIFY_QUEUE).build();
}
//回复队列
@Bean(PREPLY_QUEUE)
public Queue result_queue(){
return QueueBuilder.durable(PAYNOTIFY_REPLY_QUEUE).build();
}
//交换机和队列绑定
@Bean
public Binding binding_publish_queue(@Qualifier(NOTIFY_QUEUE) Queue queue, @Qualifier(EXCHANGE_FANOUT) FanoutExchange exchange){
return BindingBuilder.bind(queue).to(exchange);
}
@Bean
public Binding binding_result_queue(@Qualifier(REPLY_QUEUE) Queue queue, @Qualifier(EXCHANGE_FANOUT) FanoutExchange exchange){
return BindingBuilder.bind(queue).to(exchange);
}
2)发送消息
String message = "hello rabbitmq"
rabbitTemplate.convertAndSend(PayNotifyConfig.PAYNOTIFY_EXCHANGE_FANOUT,"",message);
3)接收消息
@Component
public class ConsumerListener {
@RabbitListener(queues = NotifyConfig.NOTIFY_QUEUE)
public void receive(String message) {
System.out.println("spring notify 消费者接收到消息:【" + message + "】");
}
}
注意:测试时者两个模块分别在不同的服务里
建议大家调试的时候打上断点,以便观察
优点:
使用MQ会产生的问题:
这些问题我会在下次写博客的时候解决,因为还在整理思绪
总结:
在写这篇博客的时候,中间想过很多次想要停下来的冲动,因为这种博客在网上应有尽有。但是看到《暗时间》作者刘未鹏对书写博客重要的阐述时。我恍然大悟,书写博客是对自己思维的总结,而在这期间我获得的收益远远大于文章内容所阐述的东西,而且还培养了自己解决问题的能力。
下一步计划:
消息队列的交换机几种模式
声明队列和交换机时,对其参数的详细说明
使用MQ所产生的背景问题的解决。
在写这篇博客的时候,中间想过很多次想要停下来的冲动,因为这种博客在网上应有尽有。但是看到《暗时间》作者刘未鹏对书写博客重要的阐述时。我恍然大悟,书写博客是对自己思维的总结,而在这期间我获得的收益远远大于文章内容所阐述的东西,而且还培养了自己解决问题的能力。
下一步计划: