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

1.通过 rabbitmqctl 脚本 

rabbitmqctl 是 shell 脚本,其通过 exec 调用了 erl 程序。会间接调用到如下两个 shell 脚本: 

  • rabbitmq-env
  • rabbitmq-defaults

在使用该脚本时允许用户定制的环境变量为: 

  • RABBITMQ_NODENAME          默认值 ${NODENAME}
  • RABBITMQ_CTL_ERL_ARGS       默认值 ${CTL_ERL_ARGS}

下面分别看下这几个脚本都干了哪些事情。
rabbitmqctl】 

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

[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】 

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

[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 】 

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

[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 中。 

时间: 2024-08-29 09:23:35

【原创】管理 RabbitMQ 服务器的几种方式的相关文章

详解Android提交数据到服务器的两种方式四种方法_Android

Android应用开发中,会经常要提交数据到服务器和从服务器得到数据,本文主要是给出了利用http协议采用HttpClient方式向服务器提交数据的方法. 代码比较简单,这里不去过多的阐述,直接看代码. /** * @author Dylan * 本类封装了Android中向web服务器提交数据的两种方式四种方法 */ public class SubmitDataByHttpClientAndOrdinaryWay { /** * 使用get请求以普通方式提交数据 * @param map 传

详解Android提交数据到服务器的两种方式四种方法

Android应用开发中,会经常要提交数据到服务器和从服务器得到数据,本文主要是给出了利用http协议采用HttpClient方式向服务器提交数据的方法. 代码比较简单,这里不去过多的阐述,直接看代码. /** * @author Dylan * 本类封装了Android中向web服务器提交数据的两种方式四种方法 */ public class SubmitDataByHttpClientAndOrdinaryWay { /** * 使用get请求以普通方式提交数据 * @param map 传

ODM规则执行服务器RES支持热部署的两种方式

规则集的热部署是指在规则集版本发生变化时,规则执行组件 (XU) 可以自动接收到规则集版本更新的通知 , 从而自动加载最新的规则集,整个过程用户不需要重启任何组件.业务规则管理系统实现了业务规则和应用程序逻辑的分离,业务用户可以在业务逻辑放生变化时,即时的更新业务规则,部署最新的规则集到规则执行服务器.而规则集的热部署则保证了在业务逻辑发生变化时,业务规则管理http://www.aliyun.com/zixun/aggregation/18477.html">系统服务的连续性. ODM

【原创】Windows下使用 Eclipse 管理 RabbitMQ 源码之问题解决

      使用 Eclipse + Erlide 来管理 Erlang 代码是一种常见方式.本文简要说明下,本人在 Windows 下管理 RabbitMQ 代码时遇到的小问题.       首先,搭建好 Eclipse + Erlide 的环境,方法略:然后,将下载好的 RabbitMQ 源码放置在指定的目录中,比如 D:\ErlangCode\rabbitmq-server-3.0.0 ,目录中的内容如下图所示:       照道理讲,一般源码包中的 README 和 INSTALL 会说

分享管理不同操作系统的两种方式

数据中心的管理员可以通过各种工具和技术的结合,在单个系统就能完成对多个服务器的管理工作,这样能让工作更有效率. 用户总是选择最适合的操作系统来配合业务需求,所以数据中心的服务器都是多种操作系统混合,但这也为管理带来麻烦. 配置和维护不同的系统是很复杂和耗时的.但系统管理员可以使用官方的管理工具或者第三方工具来减轻管理的负担. 在支持异构系统的数据中心,首先要配置支持多种操作系统管理的服务器.管理员可以使用硬件隔离或将系统底层与虚拟化层隔离. 从引导开始 多重引导是运行多个操作系统的常用技术.系统

asp net mvc ef-asp.net mvc 中EF上下文的管理使用哪种方式好

问题描述 asp.net mvc 中EF上下文的管理使用哪种方式好 1,使用取线程内唯一实例的方式管理EF上下文 2,使用 using (AceManageEntities db=new AceManageEntities()) { } 请教下 使用哪种方式比较好,说说原因 解决方案 使用取线程内唯一实例的方式管理EF上下文好,毕竟是单例,减少了每次创建和销毁的过程 解决方案二: 两者没有本质的区别,即便你用using,也不会造成什么开销,底层ef使用连接池,而不是你关闭了连接它就回收的. 解决

【原创】RabbitMQ 之 Federation 插件(翻译)

Federation Plugin   Introduction简介 The high-level goal of the federation plugin is to transmit messages between brokers without requiring clustering. This is useful for various reasons:federation 插件的 high level 目标是,在不同 broker 之间进行消息传递而无需建立集群:该功能在很多场景

【原创】RabbitMQ 的 shovel 插件使用

      从之前的两篇文章< [原创]RabbitMQ 之 Shovel(翻译) >和< [原创]RabbitMQ 之 Dynamic Shovel(翻译) >中,我们已经知道 shovel 插件的使用存在 static 和 dynamic 两种形式,其主要差异如下  Static Shovels Dynamic Shovels 基于 broker 的配置文件进行定义 基于 broker 的 parameter 参数进行定义 Require a restart of the ho

【原创】RabbitMQ官网文档翻译 -- Highly Available Queues

      为了方便工作中使用,对 RabbitMQ 的[高可用]相关文档进行了翻译,鉴于自己水平有限,翻译中难免有纰漏产生,如果疑问,欢迎指出探讨.此文以中英对照方式呈现. 官方原文:http://www.rabbitmq.com/ha.html ============== 我是分割线 =============== Highly Available Queues高可用 queue If your RabbitMQ broker consists of a single node, then