Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在微服务中使用RabbitMQ也需要规范化

在微服务中使用RabbitMQ也需要规范化

作者头像
Bug开发工程师
发布于 2021-01-13 06:31:32
发布于 2021-01-13 06:31:32
1.1K00
代码可运行
举报
文章被收录于专栏:码农沉思录码农沉思录
运行总次数:0
代码可运行

这篇文章的读者,假设您已经对RabbitMQ、SpringBoot和微服务有一定的理解。此文章来自于对内部技术规范指引的编辑。

典型应用场景

RabbitMQ典型应用场景

此图展示了RabbitMQ的典型应用场景,生产者把消息发送到Exchange,消费者从Queue读取消息,消息可通过topic、header、direct、fanout四种方式由Exchange路由到Queue。

在微服务中的开发过程中,如果任由开发者定义Exchange、Queue以及路由方式,即便优秀的程序员正确定义了这些要素,服务依赖会生成一个巨复杂的网状结构,管理起来必定是灾难。所以要对使用进行规范,这是技术管理应有之意。

通过文档定义规范,这种约束是弱势的,需要不断核查规范的实施情况。通过代码、架构定义规范,在不需要开发者介入的情况下执行规范,屏蔽程序的复杂性,是架构师需要考虑的问题。优秀的架构使开发过程简单化、规范化,使程序员专注业务开发,提升业务开发的效率。

按照这种指导思想,对RabbitMQ的使用进行了规范和约束。

微服务应用规范化

微服务中的应用场景

约束如下:

  1. 如若服务启用了Producer,则创建与服务名相同的Exchange,发送消息到此Exchange。
  2. 如若服务启用了Consumer,则创建与服务名相同的Queue,从此Queue中订阅消息。
  3. 读取程序中定义的Receiver,解析定义的service(其实就是Exchange名字)和tag,创建Queue到Exchange的绑定关系。
  4. 以上过程,在服务启动时执行,无需程序员干预。

优点: 程序员无需关注消息发给谁,只需要调用服务发送消息即可;程序员无需关注消息如何路由,只需要为自己关心的tag,定义receiver处理类。另外,因为采用统一的api发送和接收,为未来的扩展提供了便利。

缺点: 每个服务只有一个Exchange,只有一个Queue,并且只使用了Topic路由;所以,性能并不是最优的,只能在中度或轻度处理场景中使用。如若有个性化的处理场景,还是需要自定义这些组件的。

综述: 在AntSentry的微服务体系中,大流量量使用了Kinesis队列(类kafka),大并发使用了点对点的SQS队列,RabbitMQ只是用来解决服务之间的调用问题,流量并不会太大,其灵活性弥补了Kinesis和SQS的不足,在这个特有的场景中,满足了业务需求。在大多数的微服务场景中,这种应用模式是可以满足大多数的需求的,希望对你有所帮助。

使用方法

1)修改pom,升级api版本(此项目并未开源,公司内部使用)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>xx</groupId>
    <artifactId>cloud-api-tools</artifactId>
    <version>1.3.3-SNAPSHOT</version>
</dependency>

2)采用自定义AutoConfig,配置后即按照规范启用了rabbitmq

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
com:
  xx:
    rabbitmq:
      host: 10.30.60.41
      password: XX
      userName: xx
      port: 5672
      vhost: dev

3)创建消息实体

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
public class XXDemoInfo extends MQMessage {
 
    @Override
    public String getTag() {
        return "work";  // 消息的标识
    }
 
    private String name;
    private Long timestamp;
}

4)创建接受者,配置消息的来源以及tag;可配置多个注解,实现一个receiver处理多种tag

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RabbitMQReceiver(service = "cloud-xx-service", tag = "work") 
public class XXTagReceiver implements RabbitMQBaseReceiver<XXDemoInfo> {
 
    @Override
    public void receive(XXDemoInfo xxDemoInfo) {
 
    }
}

5)发送消息示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Autowired
RabbitMQSender sender;
 
 
public void send() {
    XXDemoInfo info = new XXDemoInfo();
    info.setName("Test Message");
    info.setTimestamp(System.currentTimeMillis());
    sender.send(info);
}
  1. 配置ReceiverScan
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RabbitMQReceiverScan(basePackages = {"com.xx.receiver"})
// 填写receiver类所在的包
public class SomeApplication implements CommandLineRunner{

}

实现关键技术

这里感觉没什么好讲的,总不能贴出来大片的代码吧!就把启动过程简单画一下吧。

点个在看支持我吧,转发就更好了

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农沉思录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RabbitMQ入门篇[通俗易懂]
MQ全称 Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信
全栈程序员站长
2022/07/23
5020
RabbitMQ入门篇[通俗易懂]
【RabbitMq 篇二】-RabbitMq 发送与消费
本文介绍RabbitMq各个消息类型,以及用使用Fanout 类型进行消息的发送和消费,让大家对RabbitMq有一个简单的认识。
胖虎
2019/06/26
1.3K0
【RabbitMq 篇二】-RabbitMq 发送与消费
【微服务】微服务间通信的最佳实践
一个好的 API 架构对于有效处理微服务之间的通信很重要。不要害怕创建新的微服务,并尽可能地尝试解耦功能。例如,与其创建一个通知服务,不如尝试为电子邮件通知、SMS 通知和移动推送通知创建单独的微服务。 在这里,我假设您有一个 API 网关来管理请求、处理到负载平衡服务器的路由并限制未经授权的访问。 通讯类型 同步协议:HTTP 是一种同步协议。客户端发送请求并等待服务的响应。这与客户端代码执行无关,它可以是同步的(线程被阻塞)或异步的(线程未被阻塞,并且响应最终会到达回调)。这里的重点是协议(HTTP/H
架构师研究会
2022/03/08
1.2K0
「 从0到1学习微服务SpringCloud 」07 RabbitMq的基本使用
在上篇文章中,我们已经用到了MQ,用于实现配置自动刷新。接下来,就具体说说MQ的应用场景以及RabbtMq的基本使用。
KEN DO EVERTHING
2019/04/24
5150
「 从0到1学习微服务SpringCloud 」07 RabbitMq的基本使用
微服务实战(三):落地微服务架构到直销系统(构建基于RabbitMq的消息总线)
从前面文章可以看出,消息总线是EDA(事件驱动架构)与微服务架构的核心部件,没有消息总线,就无法很好的实现微服务之间的解耦与通讯。通常我们可以利用现有成熟的消息代理产品或云平台提供的消息服务来构建自己的消息总线;也可以自己完全写一个消息代理产品,然后基于它构建自己的消息总线。通常我们不用重复造轮子(除非公司有特殊的要求,比如一些大型互联网公司考虑到自主可控的白盒子),可以利用比如像RabbitMq这样成熟的消息代理产品作为消息总线的底层支持。
用户1910585
2018/08/02
8520
Spring Boot2.x-15 整合RabbitMQ 及RabbitMQ的基本使用
以 Spring Cloud实战-06使用/actuator/bus-refresh端点手动刷新配置 + 使用Spring Cloud Bus自动更新配置中使用的几个微服务工程为基础,我们梳理下整合RabbitMQ及RabbitMQ的基本用法.
小小工匠
2021/08/17
3510
7000字详解Spring Boot项目集成RabbitMQ实战以及坑点分析
本文给大家介绍一下在 Spring Boot 项目中如何集成消息队列 RabbitMQ,包含对 RibbitMQ 的架构介绍、应用场景、坑点解析以及代码实战。
wayn
2024/01/30
4K0
7000字详解Spring Boot项目集成RabbitMQ实战以及坑点分析
RabbitMQ 快速入门实战
本文基于docker来安装RabbitMQ,通过pull当前最新版本rabbitmq:3.8.5-management即可,之后通过如下的命令即可运行:
技术路漫漫
2020/07/18
8670
RabbitMQ使用规范「建议收藏」
如果规定了消息的格式为JSON,并使用消息转换器,则会自动将消息转化为JSON格式而不需要每次手动进行转换。RabbitTemplate默认使用SimpleMessageConverter作为自己的消息转化器,而SimpleMessageConverter并不能满足JSON消息的需求。我们可以使用Jackson2JsonMessageConverter作为默认的消息转换器。
全栈程序员站长
2022/11/09
1.4K0
RabbitMQ学习笔记(二)——RabbitMQ快速上手
使用微服务系统,组件之间充分解耦 使用消息中间件,解耦业务逻辑 使用数据库,持久化业务数据
不愿意做鱼的小鲸鱼
2022/09/26
5790
RabbitMQ学习笔记(二)——RabbitMQ快速上手
SpringBoot与RabbitMQ详解与整合
Direct Exchange是RabbitMQ默认的交换机模式,也是最简单的模式,根据key全文匹配去寻找队列。
码哥字节
2021/07/27
8010
Spring Boot中的RabbitMQ死信队列魔法:从异常到延迟,一网打尽【RabbitMQ实战 一】
在编写现代应用时,我们经常需要处理异步消息。而当这些消息发生异常或者需要延迟处理时,RabbitMQ的死信队列就像一把神奇的钥匙,为我们打开了新的可能性。本文将带你踏入Spring Boot和RabbitMQ的奇妙世界,揭示死信队列的神秘面纱。
一只牛博
2025/05/31
1050
每日一库:RabbitMQ
RabbitMQ 是一个广泛使用的开源消息队列系统,它实现了高级消息队列协议(AMQP)标准,为分布式应用程序提供了强大的消息传递功能。RabbitMQ 是 Erlang 语言编写的,具有高度的可扩展性和可靠性,因此被广泛用于构建分布式、异步的消息通信系统。
孟斯特
2023/10/19
3510
每日一库:RabbitMQ
RabbitMQ
消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。
许喜朝
2022/05/05
6550
订单服务以及优惠券服务及rabbitmq(7)-1024电商平台项目技术选择和创 建聚合工程项目【工业级PaaS云平台+SpringCloudAlibaba+JDK11综合项目实战】
第二十七章 新版消息队列RabbitMQ回顾和容器化安装部署 第1集 基于Linux服务器安装RabbitMQ容器化部署 简介:Docker安装RabbitMQ消息队列 阿里云安装RabbitMQ 最少 2核4g或者推荐 2核8g(用家人账号购买,接近1折,初次买1年或者3年) 登录个人的Linux服务器 ssh root@8.129.113.233 Docker安装RabbitMQ 地址:https://hub.docker.com/_/rabbitmq/ #拉取镜像 docker pull ra
高大北
2022/09/16
1.7K0
订单服务以及优惠券服务及rabbitmq(7)-1024电商平台项目技术选择和创 建聚合工程项目【工业级PaaS云平台+SpringCloudAlibaba+JDK11综合项目实战】
在ASP.NET Core微服务架构下使用RabbitMQ如何实现CQRS模式
在现代软件开发中,微服务架构和CQRS模式都是备受关注的技术趋势。微服务架构通过将应用程序拆分为一系列小型、自治的服务,提供了更好的可伸缩性和灵活性。而CQRS模式则通过将读操作和写操作分离,优化了系统的性能和可维护性。本文小编将为大家介绍如何在ASP.NET Core微服务架构下使用RabbitMQ来实现CQRS模式。
葡萄城控件
2024/01/10
3380
在ASP.NET Core微服务架构下使用RabbitMQ如何实现CQRS模式
RabbitMQ学习笔记(三)——RabbitMQ 常用高级特性
自动ACK:消费端收到消息后,会自动签收消息 手动ACK:消费端收到消息后,不会自动签收消息,需要我们在业务代码中显式签收消息
不愿意做鱼的小鲸鱼
2022/09/26
4830
RabbitMQ学习笔记(三)——RabbitMQ 常用高级特性
RabbitMQ消息中间件从入门到高级(一)
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ等等。
用户1212940
2022/04/13
6310
RabbitMQ消息中间件从入门到高级(一)
Spring Cloud简单集成RabbitMQ:详解与实战案例
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
bug菌
2025/01/03
3250
Spring Cloud简单集成RabbitMQ:详解与实战案例
详解SpringCloud中RabbitMQ消息队列原理及配置,一篇就够!
公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。
java进阶架构师
2020/09/22
3.9K0
详解SpringCloud中RabbitMQ消息队列原理及配置,一篇就够!
推荐阅读
相关推荐
RabbitMQ入门篇[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验