1. 异步通信和同步通信的优缺点:
      1. 同步:优点:时效性强,可以立即得到结果 缺点: 耦合度度高,吞吐量小 执行效率低,以及有级联问题
        异步:优点
        : 可以解耦,提高吞吐量,性能好,调用没有阻塞,流量削峰 可以故障隔离 缺点:不能及时得到结果 且结构复杂 不好管理,依赖于broker的可用性和性能
    2. MQ技术对比: | | RabbitMQ | ActiveMQ | RocketMQ | Kafka | | —- | —- | —- | —- | —- | | 公司/社区 | Rabbit | Apache | 阿里 | Apache | | 开发语言 | Erlang | Java | Java | Scala&Java | | 协议支持 | AMQP,XMPP,SMTP,STOMP | OpenWire,STOMP,REST,XMPP,AMQP | 自定义协议 | 自定义协议 | | 可用性 | 高 | 一般 | 高 | 高 | | 单机吞吐量 | 一般 | 差 | 高 | 非常高 | | 消息延迟 | 微秒级 | 毫秒级 | 毫秒级 | 毫秒以内 | | 消息可靠性 | 高 | 一般 | 高 | 一般 |

      RabbitMQ性能好 , 开源 消息延迟微秒级 适合中小型公司使用,rocketMQ和kafka 适用于大数据的处理
      追求可用性:Kafka、 RocketMQ 、RabbitMQ
      追求可靠性:RabbitMQ、RocketMQ
      追求吞吐能力:RocketMQ、Kafka
      追求消息低延迟:RabbitMQ、Kafka

    3. RabbitMQ中的一些角色

      1. publisher 消息生产者
      2. consumer:消费者
      3. exchange:交换机
      4. queue:队列
      5. virtualHost:虚拟主机 隔离不同租户的exchange queue 和消息的隔离
    4. RabbitMQ 消息模型:

      1. 基本消息队列(basicqueue),
      2. 工作消息队列(workqueue)
      3. 发布订阅(三种交换机类型):广播模式fonout ;l路由模式direct ,主题模式,topic
    5. 原生 API模式:(生产端)

      1. 创建连接工厂 ConnectionFanctory connect=new ConnectionFactory()
      2. 设置连接参数:connet.setHost()设置MQ 的IP地址
        connect.setPort()设置MQ 的端口
        connet.setVirtualHost(“/“)设置虚拟主机 一般使用默认的”/“
        connet.setusername()用户
        connet.setpassword()设置密码
      3. 创建连接 connnection connection=connet.newConnection()
      4. 获取信道 Chann channl =connection.createChannl()
      5. 声明队列 channel.queueDeclare(“队列名”,false,fasle,fasle,null);
      6. 发送消息:channel.basicpublish(“”,队列名,null,消息二进制)
      7. 释放资源 channel.close() connection.close()
    6. 原生 API模式:(消费端)

      1. 创建连接工厂new connectionFactory()
      2. 设置工厂连接参数…
      3. 通过工厂创建连接对象 newConnection()对象
      4. 获取信道 每一个connection 有许多个信道 connection .createChannel() 消息通过信道传输
      5. 声明队列 防止队列没有创建 channel.queueDeclare()
      6. 定阅消息:channel.basicConsum(queueName,Auotoask(true),new defaultConsumer(channel){
        重写方法:handlerDelivery()
        @Override

        1. public void handleDelivery(String consumerTag, Envelope envelope,<br /> AMQP.BasicProperties properties, byte[] body) throws IOException {<br /> // 5.处理消息<br /> String message = new String(body);<br /> System.out.println("接收到消息:【" + message + "】");
        2. })
    7. springAMQP: AMQP是一套在应用程序之间传递消息的标准协议 和语言技术无关,更符合微服务中独立性的要求

      1. springAMQP是基于AMQP协议的一套API规范,spring-amqp是基础抽象,底层使用spring-rabbit来实现
      2. springAMQP的三个功能:
        自动声明队列 交换机及其绑定关系
        基于注解的监听器模式,异步接收消息
        封装了RabbitTemplate工具 用具发送消息

        1. 消息发送 :在yml配置文件中配置MQ的连接地址:
          spring:

      rabbitmq:
      host: 192.168.150.101 # 主机名
      port: 5672 # 端口
      virtual-host: / # 虚拟主机
      username: itcast # 用户名
      password: 123321 # 密码

      c. API: RabbitTemplate.convertAndSend(queueNanme,message);
      d. 使用注解@RabbitListener()指定要监听的队列 在方法上使用 ;方法的参数就是接收到的消息 ,参数要和发送的消息类型保持一致

    8. 一个队列可以被多个消费者监听消息 ,但是同一个消息只能被一个消费者消费 多个消费者消费同一个队列 ,默认是平均分配接收到的消息数量, 提前已经确定好的了数量 像发牌一样, 我们可以设置预取数量 可以实现性能好的消费者多接收消息(能则多劳)

    9. @RabbitListener()详解: 参数:bingdngs=(@queueBinding(@queue=(queueName), exchange=@exchange(交换机名,交换机类型),key={})) key表示routingkey 路由key 指定交换机和queue之间的绑定关系 fanout类型交换机可以不指定路由key 但是 direct 和topic 必须指定路由key

    10. 消息转换器:Rabbit默认的转化器是JDK二进制的序列化数据 占用空间比较大 可读性差,需要替换为 Jackson2JsonMessageConverter() 在配置类中声明
      @bean
      public MessageConverter conveter(){
      return new Jackson2JsonMessageConverter();
      }