专栏首页KEN DO EVERTHING「 从0到1学习微服务SpringCloud 」07 RabbitMq的基本使用

「 从0到1学习微服务SpringCloud 」07 RabbitMq的基本使用

在上篇文章中,我们已经用到了MQ,用于实现配置自动刷新。接下来,就具体说说MQ的应用场景以及RabbtMq的基本使用。

MQ应用场景

  • 异步处理 比如用户注册之后,需要加积分和发短信。就可以在用户信息入库后,通过异步消息让积分服务和短信服务做它们的事,用户无需等待这个过程,从而提高用户体验。
  • 流量削峰 最常见的是秒杀场景,一般会因为流量暴增,甚至应用挂掉。为解决这种情况,需要在应用前端加入消息队列。服务器接收用户的请求后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。
  • 日志处理 最典型的就是kafka,kafka最初的设计就是为了日志处理,大数据里用得特别多。通过日志采集,定时写入kafka队列,然后kafka对日志进行接收,储存和转发
  • 应用解耦 比如用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。但假如库存系统无法访问,则订单减库存将失败,从而导致订单失败,订单系统与库存系统耦合。引入应用消息队列后,用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功,库存系统阅下单的消息,进行库存操作。在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦
  • 消息通讯 消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等

基本使用

继续使用eureka-client项目 1.添加maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2.添加配置

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

3.Mq接收-发送

有3种接收方式,我这里为了方便,在同一个应用中写的发送和接收,大家可以想象一下它们是在不同应用中,如下

3.1 不自动创建Queue,需要在Mq手动建立对应名字的队列,否则会报"找不到队列"的错误

//接收消息
@Log4j2
@Component
public class MqReceiver {
    //不会自动创建队列
    @RabbitListener(queues = "myQueue1")
    public void receiver1 (String message){
        log.info("MqReceiver1: {}", message);
    }
}
//发送消息
@RunWith(SpringRunner.class)
@SpringBootTest
public class MqSenderTest{
    @Autowired
    private AmqpTemplate amqpTemplate;

    @Test
    public void send1(){
        amqpTemplate.convertAndSend("myQueue1","Hello!Mq Message!");
    }
}

3.2 若Mq中无相应名称的队列,会自动创建Queue

//接收消息
@RabbitListener(queuesToDeclare = @Queue("myQueue2"))
    public void receiver2 (String message){
        log.info("MqReceiver2: {}", message);
    }
//发送消息
@Test
    public void send2(){
        amqpTemplate.convertAndSend("myQueue2","Hello!Mq Message!");
    }

3.3 消息队列分组,将不同的队列归为一组,以不同关键字区分(会自动创建队列)

这里以订单服务为例,假设现有两种订单,一种是数码订单,另一种是水果订单,数码供应商和水果供应商两个服务同时订阅订单服务,但数码供应商只关心数码订单,水果供应商只关心水果订单,这里就需要对订单消息进行分类了

//接收消息
   /**
     * 数码供应商服务 接收消息
     * @param message
     */
    @RabbitListener(bindings = @QueueBinding(
            exchange = @Exchange("myOrder"),//相当于分组名
            key = "computer",//相当于分类名
            value = @Queue("computerQueue")
    ))
    public void computerReceiver (String message){
        log.info("computerReceiver: {}", message);
    }


    /**
     * 水果供应商服务 接收消息
     * @param message
     */
    @RabbitListener(bindings = @QueueBinding(
            exchange = @Exchange("myOrder"),//相当于分组名
            key = "fruit",//相当于分类名
            value = @Queue("fruitQueue")
    ))
    public void fruitReceiver (String message){
        log.info("fruitReceiver: {}", message);
    }
//发送消息
  @Test
    public void sen4(){
        amqpTemplate.convertAndSend("myOrder","computer","computer Order!");
    }

    @Test
    public void sen5(){
        amqpTemplate.convertAndSend("myOrder","fruit","fruit Order!");
    }

4.启动eureka-client,eureka-server,config应用,运行刚才写的单元测试

发送接收消息成功啦!

本文分享自微信公众号 - java从心(javaFollowHeart),作者:a丶ken

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「 从0到1学习微服务SpringCloud 」11 补充篇 RabbitMq实现延迟消费和延迟重试

    延迟队列就是进入该队列的消息会被延迟消费的队列。而一般的队列,消息一旦入队了之后就会被消费者马上消费。

    KEN DO EVERTHING
  • java&quot;小心机&quot;(1)【资源彩蛋!】

    方法名和参数列表(它们合起来被称为“方法签名”)唯一地标识出某个方法。(引用自[Thinking in java])

    KEN DO EVERTHING
  • 神器| 推荐几款超神脚本和插件

    先说声抱歉 技术干货正在路上...还需要几天的时间,稍安勿躁 这几天主要推送一些干货工具和资源,请笑纳

    KEN DO EVERTHING
  • 为什么分布式一定要有消息队列?

    架构师小秘圈
  • 分布式之消息队列复习精讲

    Java高级架构
  • 分布式之消息队列复习精讲

    庆幸的是两位朋友都很有上进心,于是博主写这篇文章,帮助他们复习一下关于消息队列中间件这块的要点

    lyb-geek
  • 分布式之消息队列复习精讲

    庆幸的是两位朋友都很有上进心,于是博主写这篇文章,帮助他们复习一下关于消息队列中间件这块的要点

    java思维导图
  • 让分布式消息队列不再难懂

    小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑。再不然就是和运营聊聊天,写几个SQL,生成下报表。又或者接到客...

    java思维导图
  • 分布式之消息队列复习精讲

    庆幸的是两位朋友都很有上进心,于是博主写这篇文章,帮助他们复习一下关于消息队列中间件这块的要点

    Java团长
  • 分布式之消息队列复习精讲!

    小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑。再不然就是和运营聊聊天,写几个SQL,生成下报表。又或者接到客...

    用户5224393

扫码关注云+社区

领取腾讯云代金券