消息服务器rabbitmq安装使用以及集群搭建

5年前

安装rabbitmq_server


准备安装介质

本文介绍以Linux上安装软件最常用的方式来安装rabbitmq_server服务器(暂不使用Ubuntu apt-get install, Suse zypper install等自动安装方式)。需要下载一下软件:

rabbitmq-server-generic-unix-3.1.5.tar.gz 从官网下载Linux/Unix二进制安装包(如果源码则安装过程需要先编译成二进制) 
http://www.rabbitmq.com/
otp_src_R16B02.tar.gz rabbitmq_server使用erlang语言编写的,rabbitmq_server运行需要依赖erlang环境 
http://www.erlang.org/
编译c程序的基础类库 一般Linux系统都会安装这些基础软件,如果没有安装则从网上下载安装;



安装环境准备

Linxu操作系统:Suse 11G 64Bit (rabbitmq_server支持大多数主流的Linux操作系统和Windows)

建议学习的rabbitmq可以先使用虚拟机安装Linux操作系统。


安装过程

以下安装操作都是以root用户操作。


安装erlang

解压otp_src_R16B02.tar.gz源码包:

tar –zvxf otp_src_R16B02.tar.gz

进入源码包解压缩后的根目录:

cd otp_src_R16B02

配置安装(可以指定安装目录 --PREFIX),为了简化安装这里就安装到默认的路径:

./configure

执行编译源码的命令:(要确保系统已经安装了C编译器)

make

执行安装命令

make install

至此Erlang已经安装完毕。

【注意】configure时如果报错找不到xxx类库需要先安装该类库再configure。


安装rabbitmq_server

使用二进制的rabbitmq_server源码包安装比较简单,只需要把安装包解压到任意目录即可。

tar –zvxf rabbitmq-server-generic-unix-3.1.5.tar.gz


使用rabbitmq_server


启动停止rabbitmq_server

cd ${rabbitmq_home}/rabbitmq_server-3.1.5/sbin

rabbitmq_server的操作脚本都存在这个目录下,如果脚本没有执行权限请先赋予执行权限:

chmod +x *

启动rabbitmq_server

rabbimq-server –detached

说明:-detached参数是让rabbitmq_server进程在后台运行,当然也可以nohup的方式启动(nohup rabbitmq_server &) ;启动异常:检查/etc/hosts文件配置是否正确(要求hostName和hostIP要一致),检查挂载点存储大小。


关闭rabbitmq_server

rabbitmqctl stop


rabbitmqctl常用命令

查看虚拟主机命令:

rabbitmqctl list_vhosts

rabbitmq_server首次启动后会创建一个VHOST 【/】,虚拟主机是为了做到资源隔离,用户可以根据自己的需要创建多个虚拟主机,格式和文件路径类似。

查看队列命令:[可选参数-p指定VHOST,不指定则默认是/]

rabbitmqctl list_queues

显示格式 [队列名称] [消息数量]

查看路由命令:[可选参数-p指定VHOST,不指定则默认是/]

rabbitmqctl list_exchanges

查看用户权限命令:[可选参数-p指定VHOST,不指定则默认是/]

rabbitmqctl list_permissions

查看用户信息:

rabbitmqctl list_users

rabbitmq_server首次启动后会创建一个guest用户,该用户拥有默认VHOST的权限,以及管理权限(后面将讲述启用rabbitmq_server管理端)



rabbitmq_server插件管理

rabbitmq_server自带了许多好用的插件,可以通过命令查看携带和已安装的插件。

rabbitmq-plugins list

显示所有的插件,标记为 [i] 的表明是已经安装的插件。


启用rabbitmq_management管理插件,可以通过友好的HTML页面对rabbitmq_server进行管理和监控。执行以下命令来启用插件:

rabbitmq-plugins enable rabbitmq_management


重启rabbitmq_server,即可通过浏览器访问管理页面 http://192.168.81.128:15672/


使用默认的用户guest/guest登录。


可以通过这个管理个工具对rabbitmq_server进行管理和监控。


rabbitmq客户端编程

rabbitmq支持很多编程语言,本文讲述使用Java语言发送,接受AMQ消息。


开发准备

从官方网站下载Java版的rabbitmq_client Jar;如果使用的是maven项目则加入依赖:

<dependency>

<groupId>com.rabbitmq</groupId>

<artifactId>amqp-client</artifactId>

<version>3.1.4</version>

</dependency>


Hello World

使用Eclipse IDE新建一个Java项目并把rabbitmq_client Jar加入项目classpath;编写消息发送者MessageProducer,参考如下代码:


package org.amqp.dev.test;

import java.io.IOException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

publicclass MessageProducer {

privatestaticfinal String QUEUE_NAME = "hello_world";

publicstaticvoid main(String[] args) throws IOException {
// 新建连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.81.128");
factory.setVirtualHost("/");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");

// 新建连接
Connection connection = factory.newConnection();

// 建立通道
Channel channel = connection.createChannel();

// 创建队列
channel.queueDeclare(QUEUE_NAME/队列名称/, false/持久化/,
false/仅有1个consumer,与autoDelete配合使用,没有consumer自动删除/,
false/自动删除/, null/其他参数/);

// 发送消息 byte[]
// 用户可以把自己的消息序列化成JSON等格式在转成byte[]发送到队列中,取出消息后再反序列化得到消息内容
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println("Send message [" + message + "] success.");

// 此时可以去查看rabbitmq_server上的消息
// rabbitmqctl list_queues
// 或者登录管理端查看

channel.close();
connection.close();
}

}


如果不是默认的VHOST则要加入-p参数指定VHOST



通过管理界面可以新建队列/发送消息/查看队列中的消息/监控队列中消息等操作。



编写消息接收者MessageConsumer,参考如下代码:


package org.amqp.dev.test;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;

publicclass MessageConsumer {

privatefinalstatic String QUEUE_NAME = "hello_world";

publicstaticvoid main(String[] args) throws Exception {
// 新建连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.81.128");
factory.setVirtualHost("/");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");

// 新建连接
Connection connection = factory.newConnection();

// 建立通道
Channel channel = connection.createChannel();

// 重复声明队列,如果存在该队列且声明的参数与现在队列的参数一致则不会出错否则异常
channel.queueDeclare(QUEUE_NAME, false, false, false, null);

System.out.println("Waiting for messages.");

// 新建消息接收器
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(QUEUE_NAME, true, consumer);

boolean flag = true;
while (flag) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery(/可以传入一个超时时间,否则死等/);
String message = new String(delivery.getBody());
System.out.println("Received '" + message + "'");
// TODObiz
}

channel.close();
connection.close();
}

}



rabbitmq的连接是长连接,使用DBUG模式运行可以观察到有一个维持长连接的线程;登录管理端也可以查看到连接rabbitmq_server的客户端信息。





有关rabbitmq高级应用将在后续篇章中介绍。


rabbitmq_server集群搭建


环境准备

以 三个节点的集群为例,准备3台Linux主机,且3台主机之间网络互通。


安装过程

各个节点的安装请参考上面;下面只讲述如何配置集群。

修改各个主机的hosts文件,打开/etc/hosts文件,添加另外2台主机的地址,是主机之间可以通过HOSTNAME访问:(每台主机都要配置)

127.0.0.1localhost

127.0.0.1userver1


The following lines are desirable for IPv6 capable hosts

::1 ip6-localhost ip6-loopback

fe00::0 ip6-localnet

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

192.168.17.133userver1

192.168.17.134userver2

192.168.17.135userver3

配置erlang.cookie:该文件存放在/root/.erlang.cookie,rabbitmq_server首次启动的时候会生成这个文件;把这三个节点上的这个文件的内容设置为同一个值(比如以第一台机器的值为准);

先启动所有的rabbitmq_server,可以查看各个节点的状态:

rabbitmqctl cluster_status

执行下面命令完成集群配置:

root@userver2#:cd /opt/upaas/programs/rabbitmq_server/sbin

root@userver2#:./ rabbitmqctl stop_app

root@userver2#:./ rabbitmqctl reset

root@userver2#:./ rabbitmqctl join_cluster rabbit@userver1

root@userver2#:./ rabbitmqctl start_app

root@userver2#:./ rabbitmqctl cluster_status


root@userver3#:cd /opt/upaas/programs/rabbitmq_server/sbin

root@userver3#:./ rabbitmqctl stop_app

root@userver3#:./ rabbitmqctl reset

root@userver3#:./ rabbitmqctl join_cluster rabbit@userver1

root@userver3#:./ rabbitmqctl start_app

root@userver3#:./ rabbitmqctl cluster_status

root@userver1#:cd /op/upaas/programs/rabbitmq_server

root@userver1#:./ rabbitmqctl cluster_status

rabbitmq集群配置比较简单且支持在线即时动态修改集群节点数量。

在实际生产应用中,需要配置更多的高级参数,则需要编写配置文件来完成,配置文件是json格式。

COMMENTS

1 个回应

Normal

李智 2014年07月28日 09:38

这个常用来做什么?

回复


需要 后方可回复
如果没有账号可以 一个帐号。