温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

在微服务中如何规范化使用RabbitMQ

发布时间:2021-12-24 09:24:31 来源:亿速云 阅读:104 作者:小新 栏目:云计算

这篇文章主要为大家展示了“在微服务中如何规范化使用RabbitMQ”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“在微服务中如何规范化使用RabbitMQ”这篇文章吧。

 

典型应用场景

在微服务中如何规范化使用RabbitMQ  
RabbitMQ典型应用场景

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

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

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

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

 

微服务应用规范化

在微服务中如何规范化使用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版本(此项目并未开源,公司内部使用)

<dependency>
    <groupId>xx</groupId>
    <artifactId>cloud-api-tools</artifactId>
    <version>1.3.3-SNAPSHOT</version>
</dependency>
 

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

com:
  xx:
    rabbitmq:
      host: 10.30.60.41
      password: XX
      userName: xx
      port: 5672
      vhost: dev
 

3)创建消息实体

@Data
public class XXDemoInfo extends MQMessage {
 
    @Override
    public String getTag() {
        return "work";  // 消息的标识
    }
 
    private String name;
    private Long timestamp;
}
 

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

@RabbitMQReceiver(service = "cloud-xx-service", tag = "work") 
public class XXTagReceiver implements RabbitMQBaseReceiver<XXDemoInfo> {
 
    @Override
    public void receive(XXDemoInfo xxDemoInfo) {
 
    }
}
 

5)发送消息示例

@Autowired
RabbitMQSender sender;
 
 
public void send() {
    XXDemoInfo info = new XXDemoInfo();
    info.setName("Test Message");
    info.setTimestamp(System.currentTimeMillis());
    sender.send(info);
}
 
  1. 配置ReceiverScan
@RabbitMQReceiverScan(basePackages = {"com.xx.receiver"})
// 填写receiver类所在的包
public class SomeApplication implements CommandLineRunner{

}
   

实现关键技术

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

在微服务中如何规范化使用RabbitMQ  


以上是“在微服务中如何规范化使用RabbitMQ”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI