文档章节

【原创】管理 RabbitMQ 服务器的几种方式

摩云飞
 摩云飞
发布于 2013/10/24 10:23
字数 1489
阅读 5639
收藏 81

1.通过 rabbitmqctl 脚本

rabbitmqctl 是 shell 脚本,其通过 exec 调用了 erl 程序。会间接调用到如下两个 shell 脚本:
  • rabbitmq-env
  • rabbitmq-defaults
在使用该脚本时允许用户定制的环境变量为:
  • RABBITMQ_NODENAME          默认值 ${NODENAME}
  • RABBITMQ_CTL_ERL_ARGS       默认值 ${CTL_ERL_ARGS}
下面分别看下这几个脚本都干了哪些事情。
rabbitmqctl
[root@Betty chapter-9]# vi /usr/sbin/rabbitmqctl 

#!/bin/sh
##  The contents of this file are subject to the Mozilla Public License
##  Version 1.1 (the "License"); you may not use this file except in
##  compliance with the License. You may obtain a copy of the License
##  at http://www.mozilla.org/MPL/
##
##  Software distributed under the License is distributed on an "AS IS"
##  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
##  the License for the specific language governing rights and
##  limitations under the License.
##
##  The Original Code is RabbitMQ.
##
##  The Initial Developer of the Original Code is VMware, Inc.
##  Copyright (c) 2007-2013 VMware, Inc.  All rights reserved.
##

# Get default settings with user overrides for (RABBITMQ_)<var_name>
# Non-empty defaults should be set in rabbitmq-env
. `dirname $0`/rabbitmq-env     # $0 为 /usr/sbin/rabbitmqctl 所以 `dirname $0`/rabbitmq-env 
                                # 为 /usr/sbin/rabbitmq-env
                                # 这里是初始化了一些默认的环境变量值(详见下面)

##--- Set environment vars RABBITMQ_<var_name> to defaults if not set

# 若未手动设置 $RABBITMQ_NODENAME 则设置其为默认值 ${NODENAME}
[ "x" = "x$RABBITMQ_NODENAME" ] && RABBITMQ_NODENAME=${NODENAME}
# 若未手动设置 $RABBITMQ_CTL_ERL_ARGS 则设置其值为默认值 ${CTL_ERL_ARGS}
[ "x" = "x$RABBITMQ_CTL_ERL_ARGS" ] && RABBITMQ_CTL_ERL_ARGS=${CTL_ERL_ARGS}

##--- End of overridden <var_name> variables

exec ${ERL_DIR}erl \
    -pa "${RABBITMQ_HOME}/ebin" \
    -noinput \
    -hidden \
    ${RABBITMQ_CTL_ERL_ARGS} \
    -sname rabbitmqctl$$ \                  # $$ 为当前进程的 pid
    -boot "${CLEAN_BOOT_FILE}" \
    -s rabbit_control_main \
    -nodename $RABBITMQ_NODENAME \
    -extra "$@"
rabbitmq-env
[root@Betty ~]# vi /usr/sbin/rabbitmq-env

#!/bin/sh
##  The contents of this file are subject to the Mozilla Public License
##  Version 1.1 (the "License"); you may not use this file except in
##  compliance with the License. You may obtain a copy of the License
##  at http://www.mozilla.org/MPL/
##
##  Software distributed under the License is distributed on an "AS IS"
##  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
##  the License for the specific language governing rights and
##  limitations under the License.
##
##  The Original Code is RabbitMQ.
##
##  The Initial Developer of the Original Code is VMware, Inc.
##  Copyright (c) 2007-2013 VMware, Inc.  All rights reserved.
##

# Determine where this script is really located (if this script is
# invoked from another script, this is the location of the caller)
SCRIPT_PATH="$0"    # $0 的值应该为 /usr/sbin/rabbitmq-env
while [ -h "$SCRIPT_PATH" ] ; do       # -h 用于判定是否为符号链接
    # readlink -f 获取符号链接 rabbitmq-env 所对应的完整路径 /usr/lib/rabbitmq/sbin/rabbitmq-env
    FULL_PATH=`readlink -f $SCRIPT_PATH 2>/dev/null`
    if [ "$?" != "0" ]; then   # 判定上一步执行结果是否为成功
    # 直接执行 readlink 将获取符号链接 rabbitmq-env 所对应的相对路径 ../lib/rabbitmq/sbin/rabbitmq-env
      REL_PATH=`readlink $SCRIPT_PATH`
      # expr STRING : REGEXP 判定 $REL_PATH 是不是以 '/' 开头
      if expr "$REL_PATH" : '/.*' > /dev/null; then
        SCRIPT_PATH="$REL_PATH"   # 以 '/' 开头
      else
        SCRIPT_PATH="`dirname "$SCRIPT_PATH"`/$REL_PATH"
      fi
    else
      SCRIPT_PATH=$FULL_PATH
    fi
done

SCRIPT_DIR=`dirname $SCRIPT_PATH`    # 得到 SCRIPT_DIR = /usr/lib/rabbitmq/sbin
RABBITMQ_HOME="${SCRIPT_DIR}/.."     # 得到 RABBITMQ_HOME = /usr/lib/rabbitmq/
[ "x" = "x$HOSTNAME" ] && HOSTNAME=`env hostname`  # 得到 HOSTNAME = Betty
NODENAME=rabbit@${HOSTNAME%%.*}      # 得到 NODENAME = rabbit@Betty 其中 ${HOSTNAME%%.*} 的含义是
                                     # 以 '.' 为分隔位置,从后开始作最长匹配的删除
                                     # 如果是一个 '%' 则为最短匹配

## Set defaults
. ${SCRIPT_DIR}/rabbitmq-defaults    # 初始化默认环境变量(详见下面)

## Common defaults
SERVER_ERL_ARGS="+K true +A30 +P 1048576 \
  -kernel inet_default_connect_options [{nodelay,true}]"    # 默认的通用配置选项

# warn about old rabbitmq.conf file, if no new one
if [ -f /etc/rabbitmq/rabbitmq.conf ] && \
   [ ! -f ${CONF_ENV_FILE} ] ; then
    echo -n "WARNING: ignoring /etc/rabbitmq/rabbitmq.conf -- "   # echo -n 不输出换行符
    echo "location has moved to ${CONF_ENV_FILE}"
fi

## Get configuration variables from the configure environment file
[ -f ${CONF_ENV_FILE} ] && . ${CONF_ENV_FILE} # 如果存在 ${CONF_ENV_FILE} 文件则执行该 环境配置 文件
rabbitmq-defaults
[root@Betty ~]# vi /usr/sbin/rabbitmq-defaults 

#!/bin/sh
##  The contents of this file are subject to the Mozilla Public License
##  Version 1.1 (the "License"); you may not use this file except in
##  compliance with the License. You may obtain a copy of the License
##  at http://www.mozilla.org/MPL/
##
##  Software distributed under the License is distributed on an "AS IS"
##  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
##  the License for the specific language governing rights and
##  limitations under the License.
##
##  The Original Code is RabbitMQ.
##
##  The Initial Developer of the Original Code is VMware, Inc.
##  Copyright (c) 2012-2013 VMware, Inc.  All rights reserved.
##

### next line potentially updated in package install steps
SYS_PREFIX=

### next line will be updated when generating a standalone release
ERL_DIR=

CLEAN_BOOT_FILE=start_clean
SASL_BOOT_FILE=start_sasl

## Set default values

CONFIG_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq                 # 配置文件路径
LOG_BASE=${SYS_PREFIX}/var/log/rabbitmq                         # 日志文件路径
MNESIA_BASE=${SYS_PREFIX}/var/lib/rabbitmq/mnesia               # 数据库路径
ENABLED_PLUGINS_FILE=${SYS_PREFIX}/etc/rabbitmq/enabled_plugins # 记录已使能插件的文件

PLUGINS_DIR="${RABBITMQ_HOME}/plugins"                          # 插件所在路径

CONF_ENV_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq-env.conf      # 环境配置文件

2. 通过 RabbitMQ Management plugin
首先想到的问题是:为什么有了 rabbitmqctl 还要 RabbitMQ Management plugin ?
  • 原因一,若想通过 rabbitmqctl 来对 rabbitmq server 进行操作,要求必须要有 Erlang 运行环境、必须拥有和目标 rabbitmq server 使用的相同 erlang cookie 文件。
  • 原因二,一旦满足了上述条件,那么该访问者将拥有对当前 rabbitmq server 为所欲为的能力,非常危险。
  • 原因三,不是所有人都喜欢敲、以及会敲 CLI 命令。
  • 原因四,难于与其他编程语言或工具进行集成。
RabbitMQ Management plugin 提供了如下几种入口:
  • Web interface    --  通过鼠标点击就可以查看各种信息
  • REST interface   --   通过 HTTP URI 实现对各种功能的访问
  • CLI interface      --   通过 rabbitmqadmin 脚本访问 (Python2.x)
与《Rabbitmq in Action》中的说明进行对照:
  • Management: Web UI
  • Management: HTTP API
  • Management: Command Line Tool 
其中,
  • WEB UI 提供了在 rabbitmq server 上的可视化操作;
  • REST API 提供了一种与其他语言和工具集成的方式。返回的结构均以 JSON 格式提供,故需要支持 JSON 解析;需要支持 HTTP basic authentication ;需要手动构造完整的 HTTP request 。支持对返回结果的排序、显示过滤,以及获取历史数据。(参考 http://youripaddir:15672/api/)
  • CLI interface 优于 REST-based API 的地方是不需要构建 request 中的全部内容,提供了优雅的格式化的输出。rabbitmqadmin 已经实现了对 REST API 的封装,提供了更加简洁的调用接口,能够对 rabbitmq server 进行管理和监控。
      官网原文如下介绍该工具:rabbitmqadmin 提供了 Web UI 上所具有的全部功能,且更易于在脚本中使用。rabbitmqadmin 是一个特化的 HTTP 客户端,但如果你打算在自己的应用程序中调用 rabbitmqadmin ,那么还是建议你采用直接访问 HTTP API 的方式 另外, rabb itmqadmin 一般会在增加可执行权限后放到 /usr/local/bin 中。



© 著作权归作者所有

摩云飞
粉丝 373
博文 534
码字总数 952694
作品 0
徐汇
程序员
私信 提问
加载中

评论(2)

半仙w
半仙w
不错
http://yu180.com
hncscwc
hncscwc

有了cookie后会remsh
【原创】RabbitMQ 之 Plugins(翻译)

为了方便工作中使用,对 RabbitMQ 的【插件】相关文档进行了翻译,鉴于自己水平有限,翻译中难免有纰漏产生,如果疑问,欢迎指出探讨。此文以中英对照方式呈现。 官方原文:http://www.rabb...

摩云飞
2012/12/12
0
0
(四)RabbitMQ消息队列-服务详细配置与日常监控管理

RabbitMQ服务管理 RabbitMQ服务详细配置rabbitmq.config RabbitMQ 提供了三种方式来定制服务器: 环境变量 定义端口,文件位置和名称(接受shell输入,或者在环境配置文件(rabbitmq-env.conf)...

Super_RD
2017/04/21
0
0
RabbitMQ安装与web后台管理界面开启

首先介绍一下RabbitMQ: RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用...

Andrewniu
01/29
0
0
配置RabbitMQ默认群集模式

RabbitMQ是什么? MQ(Msaaage Queue,消息队列)是一种应用程序对应用程序的通信方式。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无须专用链接来连接它们。消息传递指...

cchenyz
2018/07/31
0
0
RabbitMQ详解(二)------消息通信的概念

  PS:近期在南宁出差,工作比较忙,所以更新会比较慢。   说到消息通信,可能我们首先会想到的是邮箱,QQ,微信,短信等等这些通信方式,这些通信方式都有发送者,接收者,还有一个中间...

ysocean
2018/07/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一文让你轻松了解JAVA开发中的四种加密方法

文章目录 一、工具类 md5加密工具类 base64加密工具类 Bcrypt工具类 二、加密测试 MD5加密测试 base64加密测试 SHA加密测试 BCrypt加密测试 一、工具类 1. md5加密工具类 package 加密Teste...

爱编程的浪子
26分钟前
5
0
注解Annotation实现原理与自定义注解例子

什么是注解? 对于很多初次接触的开发者来说应该都有这个疑问?Annontation是Java5开始引入的新特征,中文名称叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metad...

Java面经
27分钟前
5
0
并发模式与 RPS 模式之争,性能压测领域的星球大战

本文是《如何做好性能压测》系列专题分享的第四期,该专题将从性能压测的设计、实现、执行、监控、问题定位和分析、应用场景等多个纬度对性能压测的全过程进行拆解,以帮助大家构建完整的性能...

阿里云云栖社区
36分钟前
1
0
Knative Service 之流量灰度和版本管理

本篇主要介绍 Knative Serving 的流量灰度,通过一个 rest-api 的例子演示如何创建不同的 Revision、如何在不同的 Revision 之间按照流量比例灰度。 部署 rest-api v1 代码 测试之前我们需要...

阿里云官方博客
38分钟前
4
0
金融壹账通与菲律宾联合银行合作 共推科技平台赋能中小企业融资

中小微企业融资是世界性的难题,在破解这一难题上,中国平安集团一直在用科技手段贡献来自中国的解决方案,而区块链技术的引入更为这一问题的解决带来了新的方向,同时平安对外赋能的脚步也借...

IFTNews
39分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部