探索解析微服务下的RabbitMQ
概览
本文主要介绍如何使用RabbitMQ消息代理来实现分布式系统之间的通信,从而促进微服务的松耦合。
RabbitMQ,也被称为开源消息代理,它支持多种消息协议,并且可以部署在分布式系统上。它轻量级,便于部署应用程序。它主要充当一个队列,其中输入的消息可以首先被操作。RabbitMQ可以在许多操作系统和云环境中运行,并为大多数流行语言提供了广泛的开发工具。它是生产者-消费者模式,生产者发出信息,消费者消费信息。RabbitMQ的主要特点如下:
- 异步消息
- 分布式部署
- 管理和监控
- 企业和云计算
安装
对于RabbitMQ,首先需要在系统中安装ErLang,因为RabbitMQ是用ErLang语言编写的。安装Erlang之后,你可以通过下面的介绍从它的官网下载最新版本的 RabbitMQ 。
在微服务中使用RabbitMQ
在您的微服务体系结构中,RabbitMQ是实现消息队列的最简单的免费的可用选项之一。这些队列模式有助于解耦各个微服务之间的通信来增加应用程序的弹性。我们可以将这些队列用于各种目的,比如核心微服务之间的交互、微服务的解耦、实现故障转移机制,以及通过消息代理发送电子邮件通知。
无论在哪里,只要有两个或两个以上的核心模块需要相互通信,我们就不应该进行直接的HTTP调用,因为它们会使核心层产生紧耦合,并且当每个核心模块有更多实例时将很难管理。而且每当服务宕机时,HTTP调用模式就会失败,因为在服务重启之后,我们将无法跟踪旧的HTTP请求调用。这就产生了对RabbitMQ的需求。
在微服务中设置RabbitMQ
在微服务架构中,为了演示,我们将使用一个可以通过任何核心微服务发送电子邮件通知的示例模式。在这种模式下,我们将有一个可以存在任何核心微服务的生产者,它将生成电子邮件内容并将其发送到队列。然后,这个电子邮件内容由总是在等待队列中新消息的消费者来处理。
请注意,由于正在使用Spring Boot构建微服务,因此我们将为Spring提供配置。
1)生产者:这一层负责生成电子邮件内容,并将此内容发送给RabbitMQ中的消息代理。
a)在properties文件中,我们需要配置队列名和交换类型,以及安装RabbitMQ服务器的主机和端口。
queue.name=messagequeue
fanout.exchange=messagequeue-exchange
spring.rabbitmq.host: localhost
spring.rabbitmq.port: 5672
spring.rabbitmq.username: guest
spring.rabbitmq.password: guest
b)我们需要创建一个配置类,它将使用队列名和交换类型将队列绑定到微服务模块。
@Configuration
public class RabbitConfiguration {
@Value("${fanout.exchange}")
private String fanoutExchange;
@Value("${queue.name}")
private String queueName;
@Bean
Queue queue() {
return new Queue(queueName, true);
}
@Bean
FanoutExchange exchange() {
return new FanoutExchange(fanoutExchange);
}
@Bean
Binding binding(Queue queue, FanoutExchange exchange) {
return BindingBuilder.bind(queue).to(exchange);
}
}
c)最后,我们需要一个工具类,它将使用Spring框架提供的RabbitTemplate将实际的电子邮件内容发送到队列中。
@Component
public class QueueProducer {
protected Logger logger = LoggerFactory.getLogger(getClass());
@Value("${fanout.exchange}")
private String fanoutExchange;
private final RabbitTemplate rabbitTemplate;
@Autowired
public QueueProducer(RabbitTemplate rabbitTemplate) {
super();
this.rabbitTemplate = rabbitTemplate;
}
public void produce(NotificationRequestDTO notificationDTO) throws Exception {
logger.info("Storing notification...");
rabbitTemplate.setExchange(fanoutExchange);
rabbitTemplate.convertAndSend(new ObjectMapper().writeValueAsString(notificationDTO));
logger.info("Notification stored in queue sucessfully");
}
}
d)然后,您可以在模块的任何地方调用这个produce
方法。
{
queueProducer.produce(notificationDTO);
}
2) 消费者: 这一层负责使用FIFO方法从RabbitMQ消息代理中消费消息,然后执行与电子邮件相关的操作。
a)在这个properties文件中,我们需要配置队列名和交换类型,以及安装RabbitMQ服务器的主机和端口。
queue.name=messagequeue
fanout.exchange=messagequeue-exchange
spring.rabbitmq.host: localhost
spring.rabbitmq.port: 5672
spring.rabbitmq.username: guest
spring.rabbitmq.password: guest
b)我们需要创建一个配置类,它将使用队列名和交换类型将队列绑定到微服务模块。此外,在消费者的RabbitMQ配置中,我们需要创建一个充当消费者的MessageListenerAdapter
bean,它始终侦听从队列中传入的消息。这个MessageListenerAdapter
将有一个带有消费者工具类和defaultListenerMethod
的有参构造函数,在这里我们可以指定与电子邮件相关的操作。
@Configuration
public class RabbitConfiguration {
private static final String LISTENER_METHOD = "receiveMessage";
@Value("${queue.name}")
private String queueName;
@Value("${fanout.exchange}")
private String fanoutExchange;
@Bean
Queue queue() {
return new Queue(queueName, true);
}
@Bean
FanoutExchange exchange() {
return new FanoutExchange(fanoutExchange);
}
@Bean
Binding binding(Queue queue, FanoutExchange exchange) {
return BindingBuilder.bind(queue).to(exchange);
}
@Bean
SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueueNames(queueName);
container.setMessageListener(listenerAdapter);
return container;
}
@Bean
MessageListenerAdapter listenerAdapter(QueueConsumer consumer) {
return new MessageListenerAdapter(consumer, LISTENER_METHOD);
}
}
c)然后,需要创建具有特定消息侦听器方法的 QueueConsumer
类,在该类中我们可以进行实际发送电子邮件的操作。
@Component
public class QueueConsumer {
@Autowired
MailServiceImpl mailServiceImpl;
protected Logger logger = LoggerFactory.getLogger(getClass());
public void receiveMessage(String message) {
logger.info("Received (String) " + message);
processMessage(message);
}
public void receiveMessage(byte[] message) {
String strMessage = new String(message);
logger.info("Received (No String) " + strMessage);
processMessage(strMessage);
}
private void processMessage(String message) {
try {
MailDTO mailDTO = new ObjectMapper().readValue(message, MailDTO.class);
ValidationUtil.validateMailDTO(mailDTO);
mailServiceImpl.sendMail(mailDTO, null);
} catch (JsonParseException e) {
logger.warn("Bad JSON in message: " + message);
} catch (JsonMappingException e) {
logger.warn("cannot map JSON to NotificationRequest: " + message);
} catch (Exception e) {
logger.error(e.getMessage());
}
}
}
总结
通过使用RabbitMQ,您可以避免服务之间直接的HTTP调用,并消除核心微服务的紧密耦合。这将帮助您在更高级别上实现微服务的可伸缩性,并在微服务之间添加故障转移机制。
程序员学习交流群:878249276,欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Idea 调试Tomcat源码
开篇 不知道从哪个途径被安利买了一本《Tomcat架构解析》的书,突然对Tomcat来了兴趣,准备花一段时间好好研究这个对自己来说是黑盒的容器,所以在未来一段时间里朋友圈应该会有大量这方面的分享。 按照固有套路,阅读源码前得搭建基于idea集成开发环境的debug环境,这篇文章主要就是做这个事情的,当然必然是参考了前人的文章,在文末的参考文章中已经注明,以示尊重。 源码下载 我是基于TOMCAT_8_5_34版本,所以source和binary的下载都是基于该版本。 需要注意的是在tomcat binary下载中需要选择core版本 tomcat source 下载 tomcat binary 下载 额外需要执行下面的配置 目录结构 tomcat_study ├── TOMCAT_8_5_34 (tomcat源码) └── apache-tomcat-8.5.34 (tomcat的core文件) 新增pom.xml 在TOMCAT_8_5_34的目录下新增pom.xml,内容如下所示。 <?xml version="1.0" encoding="UTF-8"?> ...
-
下一篇
程序员你应为自己将来早做打算了!
大家可能有感受到,最近新闻特别多,都是事关自身利益的大事,比如加税、减税、比如养老金增加、房产税草案等,都是直接涉及到个人腰包的大事。 而且最近很多朋友的公司、企业业绩相当的差,很多本来正常的公司融资断了,有的直接宣布破产,工资都发不下来的也有一大坨。 既然大家都很缺钱,很难过,程序员又是挣得多、死的早的代表,那么当我们干不动的时候再想出路就晚了。一定要在干得动,有竞争力的时候,尽早选择出路,并坚定不移的走下去,这样最终会的善终。 「 程序员的出路 」 先来看一张图,本来想自己画一个,没想到我大google果然万能,一击命中,省的我在费脑细胞了,拿来一用 此图,基本涵盖了大部分阶层程序员的未来选择和晋升之路,直观明了,大家可以仔细看看,认真入座。 看图应该很明白了,程序员有两条主要的职业通道:技术和管理 1.技术,这个不用多说了,一条路走到黑,最终会发光发热,做到CTO,发布自己的框架和技术专利 ,不用纠结人事斗争,走上人生巅峰、迎娶白富美... 嘿!醒醒,醒醒,这是描述的国外,国内大部分技术人牛了之后最终都会走向管理或者三界之外。 别问我为何知道,因为外部环境还是挺重要的,不做管理好...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL数据库在高并发下的优化方案
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker容器配置,解决镜像无法拉取问题