这几天百度移动pc权重都直接降到0了,一下回到解放前。
有时候只靠努力是不行的。共享ip的的痛苦。

RabbitMQ

1 介绍

1.1 RabbitMQ

MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced MessageQueue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。RabbitMQ官方地址:http://www.rabbitmq.com 开发中消息队列通常有如下应用场景:

1、任务异步处理。将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。
2、应用程序解耦合MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。

为什么使用RabbitMQ呢?
1、使得简单,功能强大。
2、基于AMQP协议。
3、社区活跃,文档完善。
4、高并发性能好,这主要得益于Erlang语言。
5、Spring Boot默认已集成RabbitMQ

2 快速入门

2.1 RabbitMQ的工作原理


组成部分说明如下:

  • Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue。
  • Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。
  • Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方。
  • Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。
  • Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。
    消息发布接收流程:
    -----发送消息-----
    1、生产者和Broker建立TCP连接。
    2、生产者和Broker建立通道。
    3、生产者通过通道消息发送给Broker,由Exchange将消息进行转发。
    4、Exchange将消息转发到指定的Queue(队列)
    ----接收消息-----
    1、消费者和Broker建立TCP连接
    2、消费者和Broker建立通道
    3、消费者监听指定的Queue(队列)
    4、当有消息到达Queue时Broker默认将消息推送给消费者。
    5、消费者接收到消息。

工作模式
RabbitMQ有以下几种工作模式 :
1、Work queues 工作队列模式

2、Publish/Subscribe 发布订阅模式

3、Routing 路由工作模式

4、Topics 通配符工作模式

5、Header
6、RPC

3 SpringBoot整合rabbitmq

3.1 pom

我们选择基于Spring-Rabbit去操作RabbitMQ
https://github.com/spring-projects/spring-amqp
使用spring-boot-starter-amqp会自动添加spring-rabbit依赖

    <dependency>
     <groupId>org.springframework.boot</groupId>     
     <artifactId>spring‐boot‐starter‐amqp</artifactId> 
    </dependency> 
    <dependency>    
     <groupId>org.springframework.boot</groupId>    
     <artifactId>spring‐boot‐starter‐test</artifactId> 
    </dependency>
    <dependency>    
     <groupId>org.springframework.boot</groupId>   
     <artifactId>spring‐boot‐starter‐logging</artifactId>
    </dependency>

3.2配置

1、配置application.yml
配置连接rabbitmq的参数

    server:   
      port: 44000 
    spring:   
      application:     
        name: test‐rabbitmq‐producer   
      rabbitmq:     
        host: 127.0.0.1     
        port: 5672     
        username: guest     
        password: guest     
        virtualHost: /

2、定义RabbitConfig类,配置Exchange、Queue、及绑定交换机。
本例配置Topic交换机。

/**
 * 配置文件类
 */
@Configuration
public class RabbitmqConfig {

    public static final String QUEUE_INFORM_EMAIL = "queue_inform_email";
    public static final String QUEUE_INFORM_SMS = "queue_inform_sms";
    public static final String EXCHANGE_TOPICS_INFORM="exchange_topics_inform";


    /**
     * 交换机配置
     * ExchangeBuilder提供了fanout、direct、topic、header交换机类型的配置
     * @return the exchange
     */
    @Bean(EXCHANGE_TOPICS_INFORM)
    public Exchange EXCHANGE_TOPICS_INFORM(){
        //true持久化
        return ExchangeBuilder.topicExchange(EXCHANGE_TOPICS_INFORM).durable(true).build();
    }

    //声明队列
    @Bean(QUEUE_INFORM_SMS)
    public Queue QUEUE_INFORM_SMS(){
        Queue queue = new Queue(QUEUE_INFORM_SMS);
        return queue;
    }

    //声明队列
    @Bean(QUEUE_INFORM_EMAIL)
    public Queue QUEUE_INFORM_EMAIL(){
        Queue queue = new Queue(QUEUE_INFORM_EMAIL);
        return queue;
    }

    @Bean
    public Binding BINDING_QUEUE_INFORM_SMS(@Qualifier(QUEUE_INFORM_SMS) Queue queue,@Qualifier(EXCHANGE_TOPICS_INFORM) Exchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("infrom.#.sms.#").noargs();
    }
    @Bean
    public Binding QUEUE_INFORM_EMAIL(@Qualifier(QUEUE_INFORM_EMAIL) Queue queue,@Qualifier(EXCHANGE_TOPICS_INFORM) Exchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("infrom.#.email.#").noargs();
    }
}

3.3 生产端

使用RarbbitTemplate发送消息

public class Producer05_topics_springboot {

    @Autowired
    RabbitTemplate rabbitTemplate;

    @Test
    public void testSendByTopics(){
        for (int i=0;i<5;i++){
            String message = "sms email inform to user"+i;
            rabbitTemplate.convertAndSend(RabbitmqConfig.EXCHANGE_TOPICS_INFORM,"inform.sms.email",message);
            System.out.println("Send Message is:'" + message + "'");
        }
    }
}

3.4消费端

使用@RabbitListener注解监听队列。

@Component
public class ReceiveHandler {//监听email队列     

    @RabbitListener(queues = {RabbitmqConfig.QUEUE_INFORM_EMAIL})
    public void receive_email(String msg, Message message, Channel channel) {
        System.out.println(msg);
    }       //监听sms队列     

    @RabbitListener(queues = {RabbitmqConfig.QUEUE_INFORM_SMS})
    public void receive_sms(String msg, Message message, Channel channel) {
        System.out.println(msg);
    }
}

Q.E.D.