• RabbitMQ基础知识及Linux安装


    RabbitMQ:

      RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。

    AMQP协议:

      AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件同产品、不同的开发语言等条件的限制。

      AMQP的实现有:RabbitMQ、OpenAMQ、Apache Qpid、Redhat Enterprise MRG、AMQP Infrastructure、ØMQ、Zyre等。 

    典型应用场景:

    1、跨系统的异步通信 ,异步,解耦,削峰都有体现。

    2、应用内的同步变成异步 秒杀:自己发送给自己

    3、基于Pub/Sub模型实现的事件驱动 放款失败通知、提货通知、购买碎屏保 系统间同步数据 摒弃ELT(比如全量同步商户数据); 摒弃API(比如定时增量获取用户、获取产品,变成增量广播)。

    4、利用RabbitMQ实现事务的最终一致性

    RabbitMQ的特性:

      RabbitMQ使用Erlang语言编写,使用Mnesia数据库存储消息。

    1. 可靠性(Reliability) RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。
    2. 灵活的路由(Flexible Routing) 在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。
    3. 消息集群(Clustering) 多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。
    4. 高可用(Highly Available Queues) 队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
    5. 多种协议(Multi-protocol) RabbitMQ 支持多种消息队列协议,比如 AMQP、STOMP、MQTT 等等。
    6. 多语言客户端(Many Clients) RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby、PHP、C#、JavaScript 等等。
    7. 管理界面(Management UI) RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点。
    8. 插件机制(Plugin System)RabbitMQ提供了许多插件,以实现从多方面扩展,当然也可以编写自己的插件。

    工作模型:

      当消息生产者/(消费者)要生产/(消费)消息的时候需要与服务器建立一个长连接,在RabbitMQ中叫做Connection,为了解决客户端与服务器所产生的频繁的连接问题,由于会大量的消耗服务器内存,这里引入了消息通道的概念,在保持长连接的情况下。可以通过建立Channel的方式与服务器通讯,当有请求的时候就会建立通道,结束则关闭通道。在RabbitMQ中,一般的做法不会让消息直接发送到消息队列中,这里引入了Exchange(交换机)的概念,通过交换机来实现消息更加灵活的消息分发,交换机没有实际的进程,而队列是有的,它只是一个地址列表,在队列创建的时候会与Exchange绑定一个专属的 key ,在生产者生产消息的时候也会指定这个key,那么 Exchange 就会通过这个key去匹配 Queue,从而实现灵活分发。然后消费者会通过订阅指定的队列去消费消息。在RabbitMQ中有Virtual Host 虚拟机的概念,他可以当成是一个小型的MQ,一个RabbitMQ服务器上可以有多个虚拟机,相互之间是隔离的,当然不同的虚拟机之间可以有相同命名的交换机与队列,可以实现资源的隔离

    Exchange交换机:

      最新版本的RabbitMQ有四种交换机类型,分别是Direct exchange、Fanout exchange、Topic exchange、Headers exchange。

    Direct Exchange 直连交换机:

      定义:直连类型的交换机与一个队列绑定时,需要指定一个明确的binding key。路由规则:发送消息到直连类型的交换机时,只有routing key跟binding key完全匹配时,绑定的队列才能收到消息。

      示例:

    // 只有队列1能收到消息
    channel.basicPublish("MY_DIRECT_EXCHANGE", "key1", null, msg.getBytes());
    

    Topic Exchange 主题交换机:

      定义:主题类型的交换机与一个队列绑定时,可以指定按模式匹配的routing key。通配符有两个,*代表匹配一个单词。#代表匹配零个或者多个单词。单词与单词之间用 . 隔开。路由规则:发送消息到主题类型的交换机时,routing key符合binding key的模式时,绑定的队列才能收到消息。

      示例:

    // 只有队列1能收到消息
    channel.basicPublish("MY_TOPIC_EXCHANGE", "sh.abc", null, msg.getBytes());
    // 队列2和队列3能收到消息
    channel.basicPublish("MY_TOPIC_EXCHANGE", "bj.book", null, msg.getBytes());
    // 只有队列4能收到消息
    channel.basicPublish("MY_TOPIC_EXCHANGE", "abc.def.food", null, msg.getBytes());
    

    Fanout Exchange 广播交换机:

      义:广播类型的交换机与一个队列绑定时,不需要指定binding key。路由规则:当消息发送到广播类型的交换机时,不需要指定routing key,所有与之绑定的队列都能收到消息。

     Headers Exchanges:

      不处理路由键。而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的。匹配规则x-match有下列两种类型:

      x-match = all :表示所有的键值对都匹配才能接受到消息。

      x-match = any :表示只要有键值对匹配就能接受到消息。

    Linux下安装RabbitMQ:

      系统版本:CentOS Linux release 7.5.1804 (Core)

      RabbitMQ版本:3.6.12

      Erlang版本:erlang-19.0.4-1.el7.centos.x86_64

      JDK版本:1.8

    Erlang安装:

      Erlang包安装:https://www.erlang.org/downloads/19.0 下载对应安装包 otp_src_19.0.tar.gz

      添加依赖:确实啥依赖可以百度

    yum install ncurses-devel
    yum list | grep ssl 
    yum install openssl-devel
    yum list | grep ODBC
    yum install unixODBC-devel
    yum install gcc-c++yum install fop.noarch
    apt install libwxgtk3.0-dev
    yum install -y gcc gcc-c++
    yum -y install gtk2-devel binutils-devel
    yum install mesa-libGLU-devel.x86_64
    yum install unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel
    yum install fop.noarch

      或者按照下面的命令:

    yum -y install gcc glibc-devel make ncurses-devel openssl-devel xmlto perl wget

      解压:tar -xf otp_src_19.0.tar.gz ,重命名下 mv otp_src_19.0 otp

      进入目录安装:./configure --prefix=/usr/local/erlang --without-javac & make & make install (时间有点小长)

      如果老是提示jinterface : Java compiler disabled by user,尝试去掉--without-javac

      需要安装wxWidgets:如果还报错可以自行百度,基本都是依赖环境没有装。

      Can not link the wx driver, wx will NOT be useable 可以直接忽略。直接进入make

    下载地址:http://www.wxwidgets.org/downloads/
    wget https://netix.dl.sourceforge.net/project/wxwindows/3.0.1/wxWidgets-3.0.1.tar.bz2
    bzip2 -dkv wxWidgets-3.0.1.tar.bz2
    tar -xvf wxWidgets-3.0.1.tar
    cd wxWidgets-3.0.1/
    ./configure --with-opengl --enable-debug --enable-unicode
    make && make install

      cd /usr/local/erlang/bin  执行 ./erl 出现以下即安装完成:

      如果提示没有这个目录,查看自己make的时候是否成功。一定要确保 make & make install 是没问题的。

      添加环境变量:export PATH=$PATH:/usr/local/erlang/bin

    RabbitMQ安装:

      下载安装包:http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.12/ 选择 rabbitmq-server-generic-unix-3.6.12.tar.xz 下载

      上传至服务器,我这边放在 /mysoft 下。Mq安装包默认是xz结尾的,解压xz文件后得到tar文件  

    xz -d rabbitmq-server-generic-unix-3.6.12.tar.xz

      执行解压命令 tar -xvf rabbitmq-server-generic-unix-3.6.12.tar

      在 /etc/profile 文件最后一行添加环境变量:export PATH=$PATH:/mysoft/rabbitmq_server-3.6.12/sbin

      环境变量生效:source  /etc/profile

      配置网页插件:

      首先创建目录,否则可能报错:mkdir /etc/rabbitmq 

      启动mq:./rabbitmq-server -detached

      进入 sbin 目录,启用插件:./rabbitmq-plugins enable rabbitmq_management

      启用rabbitmq_management插件去管理rabbitmq服务,但是在访问管理界面使用guest用户登录时出现login failed错误。到服务器上查询日志显示出现错误的原因是:

    HTTP access denied: user 'guest' - User can only log in via localhost。

      rabbitmq从3.3.0开始禁止使用guest/guest权限通过除localhost外的访问。如果想使用guest/guest通过远程机器访问,需要在rabbitmq配置文件中(/mysoft/rabbitmq_server-3.6.12/etc/rabbitmq/rabbitmq.config)中设置loopback_users为[]。rabbitmq.config文件需要自己创建,完整内容如下(注意后面的半角句号):

    [{rabbit, [{loopback_users, []}]}].
    

      重启,再通过访问 http://192.168.254.137:15672 ,通过guest/guest 登陆:

      查看服务状态:rabbitmqctl status

      关闭服务:rabbitmqctl stop

      查看mq用户:rabbitmqctl list_users  

      查看用户权限:rabbitmqctl list_user_permissions guest

      新增用户: rabbitmqctl add_user admin 123456

      设置角色:rabbitmqctl set_user_tags admin administrator 

      赋予管理员权限:rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*" 

    rabbitmqctl set_permissions -p [Vhost_Name][username][conf][write][read]

      conf:一个正则表达式match哪些配置资源能够被该用户访问

      write:一个正则表达式match哪些配置资源能够被该用户读。

      read:一个正则表达式match哪些配置资源能够被该用户访问

      根据个人需求更改rabbitmq的环境变量:

      创建环境变量配置文件 vim /mysoft/rabbitmq_server-3.6.12/etc/rabbitmq/rabbitmq-env.conf 

    RABBITMQ_MNESIA_BASE=/data/rabbitmq/mnesia //数据库位置
    RABBITMQ_LOG_BASE=/data/rabbitmq/log //日志文件目录

      创建数据库目录及日志目录:

    mkdir  /data/rabbitmq/mnesia
    mkdir  /data/rabbitmq/log 
    chowm -R rabbitmq:rabbitmq /data/rabbitmq

      默认状态下 日志存放位置 /mysoft/rabbitmq_server-3.6.12/var/log/rabbitmq 下面,通过查看日志,在启动的时候会输出以下信息:

    =INFO REPORT==== 24-Jan-2019::22:25:38 ===
    Starting RabbitMQ 3.6.12 on Erlang 19.0.4
    Copyright (C) 2007-2017 Pivotal Software, Inc.
    Licensed under the MPL.  See http://www.rabbitmq.com/
    
    =INFO REPORT==== 24-Jan-2019::22:25:38 ===
    node           : rabbit@localhost
    home dir       : /root
    //配置文件位置
    config file(s) : /mysoft/rabbitmq_server-3.6.12/etc/rabbitmq/rabbitmq.config
    cookie hash    : aRQYNdsONCZK2FIkVnK0bA==
    //日志文件
    log            : /mysoft/rabbitmq_server-3.6.12/var/log/rabbitmq/rabbit@localhost.log
    sasl log       : /mysoft/rabbitmq_server-3.6.12/var/log/rabbitmq/rabbit@localhost-sasl.log
    //数据库位置
    database dir   : /mysoft/rabbitmq_server-3.6.12/var/lib/rabbitmq/mnesia/rabbit@localhost
    //内存信息
    =INFO REPORT==== 24-Jan-2019::22:25:40 ===
    Memory high watermark set to 389 MiB (408762777 bytes) of 974 MiB (1021906944 bytes) total
    
    =INFO REPORT==== 24-Jan-2019::22:25:40 ===
    Enabling free disk space monitoring
    
    =INFO REPORT==== 24-Jan-2019::22:25:40 ===
    Disk free limit set to 50MB
    
    =INFO REPORT==== 24-Jan-2019::22:25:40 ===
    Limiting to approx 924 file handles (829 sockets)
    
    =INFO REPORT==== 24-Jan-2019::22:25:40 ===
    FHC read buffering:  OFF
    FHC write buffering: ON
    
    =INFO REPORT==== 24-Jan-2019::22:25:40 ===
    Waiting for Mnesia tables for 30000 ms, 9 retries left
    
    =INFO REPORT==== 24-Jan-2019::22:25:40 ===
    Waiting for Mnesia tables for 30000 ms, 9 retries left
    
    =INFO REPORT==== 24-Jan-2019::22:25:40 ===
    Priority queues enabled, real BQ is rabbit_variable_queue
    
    =INFO REPORT==== 24-Jan-2019::22:25:40 ===
    Starting rabbit_node_monitor
    
    =INFO REPORT==== 24-Jan-2019::22:25:40 ===
    Management plugin: using rates mode 'basic'
    
    =INFO REPORT==== 24-Jan-2019::22:25:40 ===
    msg_store_transient: using rabbit_msg_store_ets_index to provide index
    
    =INFO REPORT==== 24-Jan-2019::22:25:40 ===
    msg_store_persistent: using rabbit_msg_store_ets_index to provide index
    //AMQP端口
    =INFO REPORT==== 24-Jan-2019::22:25:40 ===
    started TCP Listener on 0.0.0.0:5672
    //管理端口
    =INFO REPORT==== 24-Jan-2019::22:25:40 ===
    Management plugin started. Port: 15672
    //数据库加载完成
    =INFO REPORT==== 24-Jan-2019::22:25:40 ===
    Statistics database started.
    //插件加载
    =INFO REPORT==== 24-Jan-2019::22:25:40 ===
    Server startup complete; 6 plugins started.
     * rabbitmq_management
     * rabbitmq_management_agent
     * rabbitmq_web_dispatch
     * amqp_client
     * cowboy
     * cowlib
    

      这段日志包含了RabbitMQ的版本号、Erlang的版本号、RabbitMQ服务节点名称、cookie的hash值、RabbitMQ配置文件地址、内存限制、磁盘限制、默认账户guest的创建以及权限配置等等。

    RabbitMQ配置:

      配置属性、 说明以及默认值如下所示

    • spring.rabbitmq.addresses:客户端连接的地址, 有多个的时候使用逗号分隔 , 该地址可以是IP与Port的结合
    • spring.rabbitmq.cache.channel.checkout-timeout:当缓存已满时,获取Channel的等待时间,单位为毫秒
    • spring.rabbitmq.cache.channel.size:缓存中保待的Channel数量
    • spring.rabbitmq.cacbe.connection.mode:连接缓存的模式,默认 CHANNEL
    • spring.rabbitmq.cache.connection.size:缓存的连接数
    • spring.rabbitmq.connection-timeout:连接超时参数, 单位为毫秒; 设置为"0"代表无穷大
    • spring.rabbitmq.dynamic:默认创建 一 个 AmqpAdmin的Bean ,默认值true
    • spring.rabbitmq.host:RabbitMQ的主机地址 localhost
    • spring.rabbitmq.listener.acknowledge-mode:容器的acknowledge 模式
    • spring.rabbitmq.listener.auto-startup:启动时自动启动容器 true
    • spring.rabbitmq.listener.concurrency:消费者的最小数量
    • spring.rabbitmq.listener.default-requeue-rejected:投递失败时是否重新排队 true
    • spring.rabbitmq. Iistener.max-concurrency:消费者的最大数噩
    • spring.rabbitmq.listener.prefetch:在单个请求中处理的消息个数, 它应该大于等于事务数量
    • spring.rabbitmq.listener.retry.enabled:不论是不是重试的发布 false
    • spring.rabbitmq.listener.retry.initial-interval:第 一 次与第二次投递尝试的时间间隔 1000
    • spring.rabbitmq.listener.retry.max-attempts :尝试 投递消息的最大数量 3
    • spring.rabbitmq.listener.retry.max-interval: 两次尝试的最大 时间间隔 10000
    • spring.rabbitmq.listener.retry.multiplier: 上 一 次尝试 时间间隔的乘数 1.0
    • spring.rabbitmq.listener.retry.stateless: 不论重试是有状态的还是无状态的 true
    • spring.rabbitmq.listener.transaction-size: 在 一 个 事务中处理的消息数量。 为了获得最佳效果, 该值应设置为小于等于每个请求中处 理 的 消 息个数, 即 spring.rabbitmq. listener.prefetch的值
    • spring.rabbitmq.password: 登录到RabbitMQ的密码
    • spring.rabbitmq.port:RabbitMQ的端口号 5672
    • spring.rabbitmq.publisher-confinns: 开启Publisher Confirm机制 false
    • spring rabbitmq publisher-returns: 开启PublisherReturn机制 false
    • spring rabbitmq.requested-heartbeat: 请求心跳超时时间, 单位为秒
    • spring rabbitmq.ssl.enabled: 启用SSL支持 false
    • spring.rabbitmq.ssl.key-store: 保存SSL证书的地址
    • spring.rabbitmq.ssl.key-store-password: 访问SSL证书的地址使用的密码
    • spring.rabbitmq.ssl.trust-store: SSL的可信地址
    • spring.rabbitmq.ssl.trust-store-password: 访问SSL的可信地址的密码
    • spring.rabbitmq.ssl.algonthm: SSL算法,默认使用Rabbit的客户端算法库
    • spring.rabbitmq.template.mandatory: 启用强制消息 false
    • spring.rabbitmq.template.receive-timeout: receive ()方法的超时时间 。
    • spring.rabbitmq.template.reply-timeout: sendAndReceive()方法的超时时间 5000
    • spring.rabbitmq.template.retry.enabled :设置为true的时候RabbitTemplate能够实现重试  false
    • spring.rabbitmq.template.retry.initial-interval: 第 一 次与第二次发布消息的时间间隔 1000
    • spring.rabbitmq.template retry.max-attempts :尝试发布消息的最大数量 3
    • spring.rabbitmq.template.retry.max-interval :尝试发布消息的最大时间间隔 10000
    • spring.rabbitmq.template.retry.multiplie:r 上 一 次尝试时间间隔的乘数 1.0
    • spring.rabbitmq. usemame: 登录到RabbitMQ的用户名
    • spring.rabbitmq.virtual-host: 连接到Rabb1tMQ的虚拟主机
  • 相关阅读:
    java虚拟机之垃圾回收机制
    java虚拟机之JVM体系结构
    java虚拟机之JVM生命周期
    删除链表中重复的结点
    (二十一)java多线程之Executors
    (十八)java多线程之Callable Future
    (十六)java多线程之优先队列PriorityBlockingQueue
    (十九)java多线程之ForkJoinPool
    (二十)java多线程之ScheduledThreadPoolExecutor
    (六)java多线程之ReadWriteLock
  • 原文地址:https://www.cnblogs.com/wuzhenzhao/p/10315642.html
Copyright © 2020-2023  润新知