Rabbitmq

RibbitMQ文档

前言

注意:本文档的环境是CentOS-7-x86_64-DVD-1611.iso,rabbitmq-server

一:什么是消息中间件间
二:消息中如何搭建RebbitMQD建的环境。
  1. 搭建需要的环境

    1. 虚拟机:CentOS-7-x86_64-DVD-1611.iso。Centos7下载地址

    2. rabbitmq依赖:由于rabbitmq是使用erlang语言开发的,所以需要下载相关依赖包

      1. erlang:erlang-solutions-2.0-1.noarch.rpm:需要先解压erlang包在安装

        解压: rpm -Uvh erlang-solutions-2.0-1.noarch.rpm
        安装: yum install -y erlang   
        
      2. 在安装完erlang时,进行rabbitmq-server包的解压,在进行rabbitmq安装,

        解压: rpm -Uvh rabbitmq-server-3.8.14-1.el8.noarch.rpm
        安装: yum install -y rabbitmq-server
        
      3. 如果rabbitmq-server在进行安装时如果出先缺少socat时,需要先进行对socat的安装后在安装rabbitmq-server,,如果没有则直接跳过该步骤即可

        安装socat:yum install -y socat
        安装rabbitmq:yum install -y rabbitmq-server
        
  2. 校验rabbitmq是否安装成功

    1. 先校验erlang是否成功,输入erl -version,出现版本号表示erlang安装成功

      [root@localhost /]# erl -version
      Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 11.1.7
      
    2. 校验rabbitmq-server是否安装成功,输入systemctl status rabbitmq-server,查看rabbitmq的状态,也可以先开启服务systemctl start rabbitmq-server在查看状态

      [root@localhost /]# systemctl status rabbitmq-server
      ● rabbitmq-server.service - RabbitMQ broker
         Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: disabled)
         Active: **active (running)** since 三 2021-03-17 15:06:42 CST; 1h 6min ago
       Main PID: 963 (beam.smp)
         Status: "Initialized"
         CGroup: /system.slice/rabbitmq-server.service
                 ├─ 963 /usr/lib64/erlang/erts-11.1.7/bin/beam.smp -W w -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -sbwt none -sbwtdcpu none -sb...
                 ├─1026 erl_child_setup 32768
                 ├─1267 /usr/lib64/erlang/erts-11.1.7/bin/epmd -daemon
                 ├─1292 inet_gethost 4
                 └─1293 inet_gethost 4
      
      3月 17 15:06:38 localhost.localdomain rabbitmq-server[963]: ##########  Licensed under the MPL 2.0. Website: https://rabbitmq.com
      3月 17 15:06:38 localhost.localdomain rabbitmq-server[963]: Doc guides: https://rabbitmq.com/documentation.html
      3月 17 15:06:38 localhost.localdomain rabbitmq-server[963]: Support:    https://rabbitmq.com/contact.html
      3月 17 15:06:38 localhost.localdomain rabbitmq-server[963]: Tutorials:  https://rabbitmq.com/getstarted.html
      3月 17 15:06:38 localhost.localdomain rabbitmq-server[963]: Monitoring: https://rabbitmq.com/monitoring.html
      3月 17 15:06:38 localhost.localdomain rabbitmq-server[963]: Logs: /var/log/rabbitmq/rabbit@localhost.log
      3月 17 15:06:38 localhost.localdomain rabbitmq-server[963]: /var/log/rabbitmq/rabbit@localhost_upgrade.log
      3月 17 15:06:38 localhost.localdomain rabbitmq-server[963]: Config file(s): /etc/rabbitmq/rabbitmq.config
      3月 17 15:06:42 localhost.localdomain rabbitmq-server[963]: Starting broker... completed with 3 plugins.
      3月 17 15:06:42 localhost.localdomain systemd[1]: Started RabbitMQ broker.
      
    3. 开启rabbitmq-server的web端访问设置页面插件

      1. rabbitmq-plugins enable rabbitmq_management:在任意位置输入这个命令用来开启rabbitmq-server的前端配置页面
      2. 如需开启其他插件可使用:rabbitmq-plugins list 来查看你要开启的插件名
    4. 登录rabbitmq-server的前端控制页面

      1. 由于我使用的是rabbitmq.3.8.xx的版本,在启动时会出现一个问题,如图

        Job for rabbitmq-server.service failed because the control process exited with error code. See "systemctl status rabbitmq-server.service" and "journalctl -xe" for details.
        
      2. 然后在通过提示的查看问题的命令 journalctl -xe来查看时发现如下图

        [root@192 rabbitmq]# journalctl -xe
        3月 17 22:30:41 192.168.190.129 rabbitmq-server[3457]: 22:30:41.800 [error] ERROR: epmd error for host 192: badarg (unknown POSIX error)
        3月 17 22:30:41 192.168.190.129 rabbitmq-server[3457]: 22:30:41.800 [error]
        3月 17 22:30:41 192.168.190.129 rabbitmq-server[3457]: BOOT FAILED
        3月 17 22:30:41 192.168.190.129 rabbitmq-server[3457]: ===========
        3月 17 22:30:41 192.168.190.129 rabbitmq-server[3457]: ERROR: epmd error for host 192: badarg (unknown POSIX error)
        3月 17 22:30:42 192.168.190.129 rabbitmq-server[3457]: 22:30:42.801 [error] Supervisor rabbit_prelaunch_sup had child prelaunch started with rabbit_prelaunch:run_prelaunch_first_phase() at undefined exit with 
        3月 17 22:30:42 192.168.190.129 rabbitmq-server[3457]: 22:30:42.802 [error] CRASH REPORT Process <0.151.0> with 0 neighbours exited with reason: {{shutdown,{failed_to_start_child,prelaunch,{epmd_error,"192",ba
        3月 17 22:30:44 192.168.190.129 rabbitmq-server[3457]: {"Kernel pid terminated",application_controller,"{application_start_failure,rabbitmq_prelaunch,{{shutdown,{failed_to_start_child,prelaunch,{epmd_error,\"1
        3月 17 22:30:44 192.168.190.129 rabbitmq-server[3457]: Kernel pid terminated (application_controller) ({application_start_failure,rabbitmq_prelaunch,{{shutdown,{failed_to_start_child,prelaunch,{epmd_error,"192
        3月 17 22:30:44 192.168.190.129 rabbitmq-server[3457]: Crash dump is being written to: erl_crash.dump...done
        3月 17 22:30:44 192.168.190.129 systemd[1]: rabbitmq-server.service: main process exited, code=exited, status=1/FAILURE
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: Error: unable to perform an operation on node 'rabbit@192'. Please see diagnostics information and suggestions below.
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: Most common reasons for this are:
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * Target node is unreachable (e.g. due to hostname resolution, TCP connection or firewall issues)
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * CLI tool fails to authenticate with the server (e.g. due to CLI tool's Erlang cookie not matching that of the server)
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * Target node is not running
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: In addition to the diagnostics info below:
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * See the CLI, clustering and networking guides on https://rabbitmq.com/documentation.html to learn more
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * Consult server logs on node rabbit@192
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * If target node is configured to use long node names, don't forget to use --longnames with CLI tools
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: DIAGNOSTICS
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: ===========
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: attempted to contact: [rabbit@192]
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: rabbit@192:
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * unable to connect to epmd (port 4369) on 192: badarg (unknown POSIX error)
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: Current node details:
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * node name: 'rabbitmqcli-397-rabbit@192'
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * effective user's home directory: /var/lib/rabbitmq
        3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * Erlang cookie hash: xuQ+TZ3bPaLDI0lSwy/hEQ==
        3月 17 22:30:45 192.168.190.129 systemd[1]: Failed to start RabbitMQ broker.
        -- Subject: Unit rabbitmq-server.service has failed
        -- Defined-By: systemd
        -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
        -- 
        -- Unit rabbitmq-server.service has failed.
        -- 
        -- The result is failed.
        
      3. 通过查找资料找到解决办法

        1. 由于3.8的版本在/etc/rabbitmq中没有rabbitmq-env.conf这个配置文件,所以要先创建一个文件,并在文件内容中加上一句话 NODENAME=rabbit@localhost

          NODENAME=rabbit@localhost
          
        2. 在重新启动rabbitmq-server服务,此时可以正常启动,打开浏览器通过虚拟机的ip+:15672(默认端口),就可以进入到rabbitmq-server的登录页面,通过输入 guest(用户名和密码同一个)进行登录,但是此时则会报错,这是因为没有开启宾客访问权限。

        3. 登录的问题找到原因后,在/etc/rabbitmq/目录下创建一个rabbitmq.config的配置文件,在内容中加上 [{rabbit, [{loopback_users, []}]}]. 后,保存退出,在重启服务即可登录

          [{rabbit, [{loopback_users, []}]}].   //注意这个点不要遗漏
          
      4. 查看rabbitmq-server的状态

        1. 查看状态:systemctl status rabbitmq-server
        2. 重启服务:systemctl restart rabbitmq-server
        3. 停止服务:systemctl stop rabbitmq-server
        4. 开机自启:systemctl enable rabbitmq-server
三:RabbitMQ的前端控制页面
  1. 使用guest成功登录是,则会进入到rabbitmq的主页。

TyporaSpaces\img\rabbitmq.png)
2. 每个选项卡都具有一定的功能。

四:RabbitMQ的第一个程序(直连)
  1. 回顾AMQP协议:

  2. 了解RabbitMQ的工作策略

    1. 每种模式介绍:

      • 编号为1:表示的是直接进行连接(点对点)
      • 编号为2:表示是任务模型
      • 编号为3:表示广播模型
      • 编号为4:表示路由模型
      • 编号为5:表示动态路由模型
      • 编号为6:表示消息订阅模型
      • 编号为7:表示消息确认机制模型
  3. 创建一个Maven工程,并添加amqp-client依赖

     <dependency>
          <groupId>com.rabbitmq</groupId>
          <artifactId>amqp-client</artifactId>
          <version>5.7.2</version>
     </dependency>
    
  4. 在RabbitMQ前端控制页面中添加一个虚拟主机

    1. 添加一个自定的虚拟主机

    2. 创建一个用户指定登录用户名和密码,并给这个用户进行权限设置

  5. 在创建的项目中创建一个RabbitMQ生产者Java类,并启动该类中的生产者方法

    package com.rabbitmq;
    
    import com.rabbitmq.client.AMQP;
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    
    import javax.lang.model.element.VariableElement;
    import java.io.IOException;
    import java.util.concurrent.TimeoutException;
    
    /**
     * 创建RabbitMQ的生产者
     */
    public class ProduceSend {
    
        public static void proMessage() throws Exception {
            //创建mq的连接工厂,让生产者和虚拟主机进行同信
            ConnectionFactory conn = new ConnectionFactory();
            //设置连接信息
            conn.setHost("192.168.190.132");
            conn.setVirtualHost("/ems");
            //amqp协议端口
            conn.setPort(5672);
            conn.setUsername("ems");
            conn.setPassword("ems123");
            //获取连接对象
            Connection connection = conn.newConnection();
            //获取通道
            Channel channel = connection.createChannel();
            //将通道和消息队列进行绑定
            //queue:队列名,没有则自动创建
            //durable:是否进行持久化,false 不,true 是
            //exclusive:是否独占队列,false 不,true 是
            //autoDelete:消费完后是否自动删除队列,false 不,true 是
            //arguments:额外附加参数
            channel.queueDeclare("hello", false, false, false, null);
            //发布消息 参数1:交换机名,参数二:队列名,参数三:传递额外消息设置,参数四:消息的具体内容
            channel.basicPublish("", "hello", null, "hello-rabbitmq".getBytes());
            //关闭通道
            channel.close();
            //关闭连接
            connection.close();
        }   
        public static void main(String[] args) throws Exception {
            proMessage();
        }
    }
    
    1. 生产者运行成功后,则会将生产者封装的数据在RabbitMQ的前端控制页面上显示

    2. 创建一个消费者用来消费生产者产生封装的队列信息中的内容

        /**
           * 创建消费者:用来对生产者生产的数据进行消费
           */
          public static void customerReicver() throws IOException, TimeoutException {
              ConnectionFactory connectionFactory = new ConnectionFactory();
              connectionFactory.setUsername("ems");
              connectionFactory.setPassword("ems123");
              connectionFactory.setPort(5672);
              connectionFactory.setVirtualHost("/ems");
              connectionFactory.setHost("192.168.190.132");
              //获取连接对象
              Connection connection = connectionFactory.newConnection();
              //创建通道
              Channel channel = connection.createChannel();
          }
      
    3. 第二种消息模型:任务模型(Work)

      1. 创建生产者

        public static void proDSendMess() {
            try {
                //获取连接
                Connection conn = RabbitUtil.getConn();
                //创建通道
                Channel channel = conn.createChannel();
                //声明队列名,参数一:队列名,参数二:,参数三:,参数四:自动删除队列,参数五:额外参数
                channel.queueDeclare("A123", true, false, true, null);
                for (int i = 0; i < 30; i++) {
                    channel.basicPublish("", "A123", MessageProperties.PERSISTENT_TEXT_PLAIN, (i + "WorkSequence---hello-rabbitmq").getBytes());
                }
                //关闭连接
                RabbitUtil.getClose(channel, conn);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
      2. 创建消费者(消费者可以有多个)

        //创建消费者A
        public static void receiveMessA() {
            try {
                //获取连接
                Connection conn = RabbitUtil.getConn();
                //创建通道
                Channel channel = conn.createChannel();
                //
                channel.queueDeclare("A123", true, false, true, null);
                //
                channel.basicConsume("A123", false, new DefaultConsumer(channel) {
                    @Override
                    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                        System.out.println("A" + body.toString() + "\t===" + new String(body));
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        channel.basicAck(envelope.getDeliveryTag(),false);
                    }
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        
        //创建消费者B
        public static void receiveMessB() {
            try {
                //获取连接
                Connection conn = RabbitUtil.getConn();
                //创建通道
                Channel channel = conn.createChannel();
                //
                channel.queueDeclare("A123", true, false, true, null);
                //
                channel.basicConsume("A123", false, new DefaultConsumer(channel) {
                    @Override
                    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                        System.out.println("B" + body.toString() + "\t===" + new String(body));
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        channel.basicAck(envelope.getDeliveryTag(),false);
                    }
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
    4. 第三种消息模型:广播模型

      1. 广播模型简介

      2. 创建生产者

        
        
      3. 创建消费者

        
        
    5. 第四种消息模型:路由模型

      1. 路由模型简介

      2. 创建生产者

        
        
      3. 创建消费者

        
        
    6. 第五种消息模型:动态路由模型(路由模型下的一种分支)

      1. 动态路由模型简介

      2. 创建生产者

        
        
      3. 创建消费者

        
        
    7. 第六种消息模型:RPC模型

      1. rpc模型简介

      2. 创建生产者

        
        
      3. 创建消费者

        
        
    8. 第七种消息模型:消息确认机制模型

      1. 消息确认机制模型简介

      2. 创建生产者

        
        
      3. 创建消费者

        
        

推荐这些文章:

Rabbitmq安装与部署

一:安装依赖软件Erlang
安装包otp_src_22.3.tar.gz,下载到部署服务器tar -zxvf解压
mv otp_src_22.3 ./erlang变更文件夹名字
可能需要安装的依赖包
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses ncur...

Rabbitmq 消息中间件

rabbitmq 安装
Linux服务器
# 安装rabbitmq全部依赖
yum -y install rabbitmq*

# 以守护程序的方式在后台运行
rabbitmq-server --detached

# 查询 RabbitMQ 服务器的状态信息可以用参数 status
rabbitmqctl status

# 关闭整个...

windows10 Rabbitmq 安装和启动

第一步:下载并安装erlang
 

原因:RabbitMQ服务端代码是使用并发式语言Erlang编写的,安装Rabbit MQ的前提是安装Erlang。
下载地址:http://www.erlang.org/downloads

 
 
根据本机位数选择erlang下载版本。

下载完是这么个东西:

...

使用Docker在本地搭建Rabbitmq集群

本文用于演示如何在本地使用Docker搭建RabbitMQ集群。
erlang cookie
erlang节点间通讯需要具有相同的erlang cookie值,erlang cookie的值在.erlang.cookie文件中,位置在家目录下, 通常是/var/lib/rabbitmq。这里通过Docker volume来共享erlan...

文章标题:Rabbitmq
文章链接:https://www.dianjilingqu.com/4593.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>