Rabbitmq入门篇

在消息传输的过程中保存消息的容器,多用于分布式系统之间进行通信;
优势:
应用解耦:系统有系统与系统之间并不会直接交互,而是与MQ交互,如果某个系统宕机了,也并不会影响其他系统;因为是与MQ交互,如果新增一个系统,直接与MQ交互即可,不需要去改原有系统的代码;
异步提速:mq的效率非常高,性能非常优越,系统与系统之间的交互速度远不如mq与系统之间交互的速度。如订单系统,库存系统,支付系统,物流系统。在使用MQ之前,需要这四个系统共同配合才能使用,而用了MQ之后,支付系统只需要和MQ交互即可完成,步骤少了,而且步骤也变快了。其速度是大大提升的。
削峰填谷:请求激增时,mq并不会把所有的请求一股脑的发给系统而是,只发送一定量的请求数给系统,这样就不会让这些大量请求给服务器造成太大的压力,造成各种不好的影响;在请求不高时,再慢慢处理那些过量的需求;
劣势:
系统可用性降低:系统引入的依赖越多,系统的稳定性就降低了,MQ一旦宕机,就会对业务造成影响;
系统复杂度提高:mq的加入大大增加了系统的复杂度,以前是远程调用,现在是异步调用,可能存在消息丢失的情况;
常见的mq:RabbitMQ(万级),ActiveMQ(不常用),RocketMQ(十万级),Kafka(十万级)
Kafka:大数据领域用的比较多
RabbitMQ:安全性能做的最好,单机吞吐量可能比较差,但是是最可靠的。

RabbitMQ:用的是Erlang语言,专门为开发高并发和分布式系统的语言;
交换机:分配请求
队列:存放消息,先进先出
RabbitMQ安装:
下载这三个软件:
erlang­18.3­1.el7.centos.x86_64.rpm
socat­1.7.3.2­5.el7.lux.x86_64.rpm
rabbitmq­server­3.6.5­1.noarch.rpm
执行三条语句:
rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm
rpm -ivh socat-1.7.3.2-1.1.el7.x86_64.rpm
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
安装就好了;
开启管理界面:rabbitmq-plugins enable rabbitmq_management(可以用浏览器访问,也是药开放端口的,需要先启动rmq才能开启)
修改默认配置:vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app
在浏览器输入http://192.168.88.3:15672/#/即可访问RabbitMQ页面;

复制配置文件到
cd /usr/share/doc/rabbitmq-server-3.6.5/
cp rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
复制完记得修改loopback_users 中的 <<“guest”>>为guest,否则客户端无法访问
RabbitMQ有6种工作模式,其中第六种RPC ,RabbitMQ并不擅长,这里只讲剩下的5种;
1、Hello World
一个消费者,一个生产者,一个RabbitMQ的工作模式;
2、Work queues
一个生产者,一个RabbitMQ,多个消费者;比如5000个请求,每个消费者处理1000个的请求;
3、Publish/Subscribe 发布订阅模式
生产者发送消息到交换机,多台RabbitMQ,多个消费者;RabbitMQ接收发送的消息是重复的
4、路由模式
生产者发送消息给生产者,对消息做筛选,定向到不通的消费者中去;
5、通配符模式

公共部分代码;

 ConnectionFactory connectionFactory = new ConnectionFactory();
         connectionFactory.setHost("192.168.88.3");//设置ip
        connectionFactory.setPort(5672);//5672是RabbitMQ的默认端口号
        connectionFactory.setUsername("mymq");//用户名
        connectionFactory.setPassword("mymq");//密码
        connectionFactory.setVirtualHost("/one");//虚拟机名
        Connection conn = null;
        try {
            conn = connectionFactory.newConnection();//获取长链接
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

1、hello world

生产者

//创建通信“通道”,相当于TCP中的虚拟连接
        Channel channel = conn.createChannel();
        channel.queueDeclare(RabbitConstant.QUEUE_HELLOWORLD,false, false, false, null);
        String message = "666";
        channel.basicPublish("", "hello_world", null,message.getBytes());
        channel.close();
        conn.close();
        System.out.println("===发送成功===");

channel.queueDeclare(“hello_world”,false, false, false, null);
第一个参数:队列的名称,这里会自动创建队列,也可以通过管理界面创建
第二个参数:是否持久化,false不持久化,MQ停掉数据就没了
第三个参数:是否队列私有化,true代表第一次拥有他的消费者才能用,false则是所有消费者都可以
第四个参数:是否自动删除,false代表连接停掉后不自动删除掉这个队列
channel.basicPublish("", “hello_world”, null,message.getBytes());
第一个参数:exchange 交换机,暂时用不到,在后面进行发布订阅时才会用到
第二个参数:队列名称
第三个参数:额外的设置属性
第四个参数:最后一个参数是要传递的消息字节数组
消费者

 //获取TCP长连接
         Connection conn = RabbitUtils.getConnection();
        Channel channel = conn.createChannel();
        channel.queueDeclare("hello_world",false, false, false, null);
        channel.basicConsume("hello_world", false, new Reciver(channel));

channel.basicConsume(“hello_world”, false, new Reciver(channel));
第一个参数:队列名
第二个参数:是否手动确认收到消息,false标识手动确认,true则是自动确认
第三个参数:要传入DefaultConsumer的实现类
我们自己写一个继承自DefaultConsumer的类并且重写,直接new一个DefaultConsumer进去其实也可以,
消费的操作在这里面执行,重写handleDelivery方法;

class  Reciver extends DefaultConsumer {

    private Channel channel;
    //重写构造函数,Channel通道对象需要从外层传入,在handleDelivery中要用到
    public Reciver(Channel channel) {
        super(channel);
        this.channel = channel;
    }
    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {

         String message = new String(body);
         System.out.println("消费者接收到的消息:"+message);
         System.out.println("消息的TagId:"+envelope.getDeliveryTag());//标签
        //false只确认签收当前的消息,设置为true的时候则代表签收该消费者所有未签收的消息
        channel.basicAck(envelope.getDeliveryTag(), false);//确认消息
    }
}

2、工作队列模式
与上面的模式写法是一样的,只是多写了一些消费者而已,默认会均匀的发送给所有的消费者;
可以在消费者中添加channel.basicQos(1);
这个代码添加在处理消息之前,写了这个后,处理完消息后就会做完一个去拿一个,谁处理的快就谁多做一些;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值