1-RabbitMQ(1)

1、初始MQ

  1.1 微服务间通讯有同步和异步两种方式:

    同步通讯:就像打电话,需要实时响应,时效性强,可以立即得到结果,耦合度高,

       性能吞吐能力低,有级联失败问题,有额外的资源消耗,Feign就属于同步方式

    异步通讯:就像微信发消息,不需要马上回复,异步调用可以避免上述问题

        无需等待订阅者处理完成,响应更快速

        服务之间不是直接调用,不存在级联失败问题

        耦合度低,每个服务都可以灵活插拔,可替换

        流量削峰,不管发送者发送消息的速率有多快,订阅者可以按照自己能接受的速度来处理消息

        但是,异步通信架构复杂,不好管理

2、MQ的安装

    MQ,简称消息队列,即存放消息的队列,

    常见的MQ有:ActiveMQ、RabbitMQ、 RocketMQ、Kafka我们这里只针对RabbitMQ来说:

    RabbitMQ中的一些角色:

      publisher:生产者

      consumer:消费者

      exchange:交换机

      queue:队列、存储消息

      virtualHost:虚拟主机、一个虚拟主机可以存放一个租户的多个exchage、queue

            来对不同租户的交换机和队列进行隔离

    1、导入依赖:springboot-boot-starter-amqp

    2、配置ynl文件:Spring:rabbitmq:host: 192.168.150.101

 

            Spring:rabbitmq:port: 5672

                   virtual-host: /   #虚拟主机

                   username: itcast

                    password: 123321

 

3、编写publisher消息发送 和 consumer消息接收(无交换机参与的最基本的发接操作)

      因为RabbitMq是实现两个微服务之间的消息异步发送,所以在两个微服务之间

      需要导入RabbitMq的依赖和yml配置

      消息发送:

        @Autowired

        private RabbitTemplate rabbitTemplate;

        rabbitTemplate.convertAndSend(队列名,消息内容);

      消息接收:

        类上标注@Component

        @RabbitListener(queues="监听的队列名"

        public void listener(String msg){  sout(msg);  }

 

    1、默认情况下,队列会把自己接收到的多条消息平均分配给监听它的消费者,这样会

    导致能者无消息消费、弱者消息过多消费过慢

    2、能者多劳:消费者每次只能获得一个消息,消费完了在给你一个

      yml配置:spring:rabbitmq:listener:simple: prefetch: 1

 

4、发布/订阅

  

    

 

 

  其中exchange交换机有三种类型:

  Fanout:广播,将消息递交给所有与交换机绑定的队列

  Direct:定向,将把消息递交给符合指定routing key的队列

  Topic:通配符,与Direct类似,在routing key中可以指定通配符 

      #:匹配多个   *:匹配一个

5、加入交换机之后的消息的接发

  第一种方式:

  1、消息的发送还是注入@RabbitTemplate对象,调用convertAndSend方法来发送消息

    rabbitTemplate.converAndSend(队列名,key名,消息内容)

    //如果使用Fanout交换机来发送消息,没有key,可以在key的位置上写一个空字符串

  2、消息的接收是通过声明@Bean的方式

    在@Configuration配置类中,通过@Bean注解的方式声明交换机、队列、交换机和

    队列的绑定关系

  第二种方式:

  1、消息的接收

    通过@RabbitListener注解的方式来声明:队列名、交换机名和交换机类型、

    和他们的绑定关系,以及key值   

    @RabbitListener(

      bindings = @QueueBinding(value = @Queue(name = "direct.queue2"),
      exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
      key = {"red", "yellow"}
    ))

   2、消息的发送

    注入@RabbitTemplate

    发送消息:rabbitTemplate.convertAndSend(队列名,key,消息内容)  

 

6、用RabbitMQ来发送对象数据   

  1、 默认情况下,spring会把发送的消息序列化为字节发送到队列,接收消息的时候,

   在反序列化为对象,不过spring采用的是jdk的序列化方式,数据体积大、可读性差

  2、   我们用JSON转换器,来实现对象在MQ间的接发

    需要在发送端 和 接收端 来分别倒入依赖:

      1、jackson-dataformat-xml

      2、在@Configuration配置类里面写一个@Bean方法

        @Bean
        public MessageConverter jsonMessageConverter(){
        return new Jackson2JsonMessageConverter();
        }

        

      

      

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

            

posted @ 2022-10-27 23:19  焦茶  阅读(55)  评论(0编辑  收藏  举报