Linux服务器安装RabbitMQ——SpringBoot整合(过程+踩坑)

本文详细介绍了如何在Linux上安装erlang和RabbitMQ,包括下载、安装、验证和启动过程。接着展示了SpringBoot如何集成RabbitMQ,包括添加依赖、创建消息接收者和发送者,并提供了可能出现的问题及解决方案,如权限问题、依赖缺失等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下载erlang

下载地址
在这里插入图片描述下载好之后,将文件上传到linux服务器上,通常上传到/usr/local/bin目录下。

一种面向并发的编程语言,RabbitMQ需要依赖erlang。注意不同版本的RabbitMQ需要不同版本的erlang。
具体可以通过rabbitmq官网查看

下载RabbitMQ

下载地址
在这里插入图片描述
两个都下载完成,上传至linux。
在这里插入图片描述

安装erlang

1、安装依赖
yum install ncurses-devel
2、解压
tar xf otp_src_20.1.tar.gz
3、进入文件夹
cd otp_src_20.1
4、configure,指定到文件夹/usr/local/erlang20
./configure --prefix=/usr/local/erlang20 --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe --without-javac
5、编译
make -j
6、安装
make install
7、查看erlang是否安装成功。

#进入安装好的目录
cd /usr/local/erlang20/bin
#执行命令
./erl

进入shell里面说明已经按照成功。

Erlang/OTP 20 [erts-9.1] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V9.1  (abort with ^G)

ssl:versions().检查ssl版本正常

Eshell V9.1  (abort with ^G)
1>  ssl:versions().
[{ssl_app,"8.2.1"},
 {supported,['tlsv1.2','tlsv1.1',tlsv1]},
 {available,['tlsv1.2','tlsv1.1',tlsv1,sslv3]}]
2> 

erlang安装完成

安装RabbitMQ

1、解压RabbitMQ:
xz -d rabbitmq-server-generic-unix-3.6.14.tar.xz
tar xf rabbitmq-server-generic-unix-3.6.14.tar
2、安装依赖:
python的依赖:
yum install python -y
simplejson依赖
yum install xmlto -y
yum install python-simplejson -y
3、将RabbitMQ移动到指定目录:
mv rabbitmq-server-generic-unix-3.6.14 /usr/local/rabbitmq
这个不需要make
4、测试是否安装成功
cd /usr/local/rabbitmq/sbin
启动rabbitmq
./rabbitmq-server
如果输出以下图标说明成功了

[root@ccl sbin]# ./rabbitmq-server 

              RabbitMQ 3.6.14. Copyright (C) 2007-2017 Pivotal Software, Inc.
  ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
  ##  ##
  ##########  Logs: /usr/local/rabbitmq/var/log/rabbitmq/rabbit@ccl.log
  ######  ##        /usr/local/rabbitmq/var/log/rabbitmq/rabbit@ccl-sasl.log
  ##########
              Starting broker...
 completed with 0 plugins.

查看log
tail -f /usr/local/rabbitmq/var/log/rabbitmq/rabbit@ccl.log netstat -nap | grep 5672
started 5672
ps -ef|grep rabbitmq
可以看到正在监听5672

关闭RabbitMQ

./rabbitmqctl stop

SpirngBoot集成RabbitMQ

注意:如果是远程服务器,一定要检查安全组端口是否已经开放,否则配置正确也会导致无法连接

1、添加依赖


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

配置文件:

#rabbitmq
spring.rabbitmq.host=xx.xx.xxx.xxx
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/
#消费者数量
spring.rabbitmq.listener.simple.concurrency= 10
spring.rabbitmq.listener.simple.max-concurrency= 10
#消费者每次从队列获取的消息数量
spring.rabbitmq.listener.simple.prefetch= 1
#消费者自动启动
spring.rabbitmq.listener.simple.auto-startup=true
#消费失败,自动重新入队
spring.rabbitmq.listener.simple.default-requeue-rejected= true
#启用发送重试
spring.rabbitmq.template.retry.enabled=true 
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.multiplier=1.0

2、创建消息接收者



import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.imooc.miaosha.domain.MiaoshaOrder;
import com.imooc.miaosha.domain.MiaoshaUser;
import com.imooc.miaosha.redis.RedisService;
import com.imooc.miaosha.service.GoodsService;
import com.imooc.miaosha.service.MiaoshaService;
import com.imooc.miaosha.service.OrderService;
import com.imooc.miaosha.vo.GoodsVo;

/***
 *
 * 消息接收器。
 *
 */

@Service
public class MQReceiver {

		private static Logger log = LoggerFactory.getLogger(MQReceiver.class);
		
		@Autowired
		RedisService redisService;
		
		@Autowired
		GoodsService goodsService;
		
		@Autowired
		OrderService orderService;
		
		@Autowired
		MiaoshaService miaoshaService;

	/***
	 * @param message
	 *
	 * @RabbitListener(queues=MQConfig.MIAOSHA_QUEUE)指定监听队列名称
	 */
		@RabbitListener(queues=MQConfig.MIAOSHA_QUEUE)
		public void receive(String message) {
			log.info("receive message:"+message);
			MiaoshaMessage mm  = RedisService.stringToBean(message, MiaoshaMessage.class);
			MiaoshaUser user = mm.getUser();
			long goodsId = mm.getGoodsId();
			
			GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);
	    	int stock = goods.getStockCount();
	    	if(stock <= 0) {
	    		return;
	    	}
	    	//判断是否已经秒杀过了
	    	MiaoshaOrder order = orderService.getMiaoshaOrderByUserIdGoodsId(user.getId(), goodsId);
	    	if(order != null) {
	    		return;
	    	}
	    	//减库存 下订单 写入秒杀订单
	    	miaoshaService.miaosha(user, goods);
		}
	
//		@RabbitListener(queues=MQConfig.QUEUE)
//		public void receive(String message) {
//			log.info("receive message:"+message);
//		}
//		
//		@RabbitListener(queues=MQConfig.TOPIC_QUEUE1)
//		public void receiveTopic1(String message) {
//			log.info(" topic  queue1 message:"+message);
//		}
//		
//		@RabbitListener(queues=MQConfig.TOPIC_QUEUE2)
//		public void receiveTopic2(String message) {
//			log.info(" topic  queue2 message:"+message);
//		}
//		
//		@RabbitListener(queues=MQConfig.HEADER_QUEUE)
//		public void receiveHeaderQueue(byte[] message) {
//			log.info(" header  queue message:"+new String(message));
//		}
//		
		
}

3、创建消息发送者


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.imooc.miaosha.redis.RedisService;

/***
 * 消息发送器
 */
@Service
public class MQSender {

	private static Logger log = LoggerFactory.getLogger(MQSender.class);
	
	@Autowired
	AmqpTemplate amqpTemplate ;

	/***
	 * Direct模式的交换机
	 * Direct Exchange
	 * @param mm
	 */
	public void sendMiaoshaMessage(MiaoshaMessage mm) {
		//将对象转换成String,发送
		String msg = RedisService.beanToString(mm);
		log.info("send message:"+msg);
		amqpTemplate.convertAndSend(MQConfig.MIAOSHA_QUEUE, msg);
	}
	
//	public void send(Object message) {
//		String msg = RedisService.beanToString(message);
//		log.info("send message:"+msg);
//		amqpTemplate.convertAndSend(MQConfig.QUEUE, msg);
//	}
//	
//	public void sendTopic(Object message) {
//		String msg = RedisService.beanToString(message);
//		log.info("send topic message:"+msg);
	//topic.key1可以匹配到,"topic.#"也能匹配到,
//		amqpTemplate.convertAndSend(MQConfig.TOPIC_EXCHANGE, "topic.key1", msg+"1");
//		amqpTemplate.convertAndSend(MQConfig.TOPIC_EXCHANGE, "topic.key2", msg+"2");
//	}
//	
//	public void sendFanout(Object message) {
//		String msg = RedisService.beanToString(message);
//		log.info("send fanout message:"+msg);
//		amqpTemplate.convertAndSend(MQConfig.FANOUT_EXCHANGE, "", msg);
//	}
//	
//	public void sendHeader(Object message) {
//		String msg = RedisService.beanToString(message);
//		log.info("send fanout message:"+msg);
//		MessageProperties properties = new MessageProperties();
//		properties.setHeader("header1", "value1");
//		properties.setHeader("header2", "value2");
//		Message obj = new Message(msg.getBytes(), properties);
//		amqpTemplate.convertAndSend(MQConfig.HEADERS_EXCHANGE, "", obj);
//	}

	
	
}

4、将队列的Been配置进去


import java.util.HashMap;
import java.util.Map;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.HeadersExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MQConfig {
	
	public static final String MIAOSHA_QUEUE = "miaosha.queue";
	public static final String QUEUE = "queue";
	public static final String TOPIC_QUEUE1 = "topic.queue1";
	public static final String TOPIC_QUEUE2 = "topic.queue2";
	public static final String HEADER_QUEUE = "header.queue";
	public static final String TOPIC_EXCHANGE = "topicExchage";
	public static final String FANOUT_EXCHANGE = "fanoutxchage";
	public static final String HEADERS_EXCHANGE = "headersExchage";
	
	/**
	 * Direct模式 交换机Exchange
	 * */
//	@Bean
//	public Queue queue() {
//		return new Queue(QUEUE, true);
//	}

	@Bean
	public Queue queue() {
		return new Queue(MIAOSHA_QUEUE, true);
	}
	
	/**
	 * Topic模式 交换机Exchange
	 * */
	@Bean
	public Queue topicQueue1() {
		return new Queue(TOPIC_QUEUE1, true);
	}
	@Bean
	public Queue topicQueue2() {
		return new Queue(TOPIC_QUEUE2, true);
	}
	@Bean
	public TopicExchange topicExchage(){
		return new TopicExchange(TOPIC_EXCHANGE);
	}
	@Bean
	public Binding topicBinding1() {
		return BindingBuilder.bind(topicQueue1()).to(topicExchage()).with("topic.key1");
	}
	@Bean
	public Binding topicBinding2() {
		return BindingBuilder.bind(topicQueue2()).to(topicExchage()).with("topic.#");
	}
	/**
	 * Fanout模式 交换机Exchange(广播)
	 * */
	@Bean
	public FanoutExchange fanoutExchage(){
		return new FanoutExchange(FANOUT_EXCHANGE);
	}
	@Bean
	public Binding FanoutBinding1() {
		return BindingBuilder.bind(topicQueue1()).to(fanoutExchage());
	}
	@Bean
	public Binding FanoutBinding2() {
		return BindingBuilder.bind(topicQueue2()).to(fanoutExchage());
	}
	/**
	 * Header模式 交换机Exchange
	 * */
	@Bean
	public HeadersExchange headersExchage(){
		return new HeadersExchange(HEADERS_EXCHANGE);
	}
	@Bean
	public Queue headerQueue1() {
		return new Queue(HEADER_QUEUE, true);
	}
	@Bean
	public Binding headerBinding() {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("header1", "value1");
		map.put("header2", "value2");
		return BindingBuilder.bind(headerQueue1()).to(headersExchage()).whereAll(map).match();
	}
	
	
}

出现问题:
拒绝连接,因为我们使用的是guest用户。
解决:
进入linux服务器中
进入目录
cd /usr/local/rabbitmq/etc/rabbitmq
配置配置文件
rabbitmq.config 没有的话,就创建一个
里面添加代码:

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

然后关闭服务重新打开rabbitmq
问题解决。

踩坑记录:

安装erlang

/usr/local/bin/otp_src_20.1 目录下执行

==出现的问题:==这里./configure后erlang找不到ssl使用下面的解决

./configure --prefix=/usr/local/erlang20 --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe --without-javac

make -j 

make install

出现的问题:

make -j的时候出错。

gcc 编译出现 internal compiler error: Killed

网上很多说内存不足的,改了半天也没好

最后解决:

https://wkcto.com/wenda/detail/1543

安装erlang前先安装Linux依赖库,执行下面的命令:
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel

出现的问题:./rabbitmq-server开启服务出现错误。

Error description:
   {error,{missing_dependencies,[crypto,ssl],
                                [cowboy,cowlib,rabbitmq_management,
                                 rabbitmq_management_agent,
                                 rabbitmq_trust_store]}}

Log files (may contain more information):
   /usr/local/rabbitmq/var/log/rabbitmq/rabbit@ccl.log
   /usr/local/rabbitmq/var/log/rabbitmq/rabbit@ccl-sasl.log

Stack trace:
   [{rabbit_plugins,ensure_dependencies,1,
                    [{file,"src/rabbit_plugins.erl"},{line,185}]},
    {rabbit_plugins,prepare_plugins,1,
                    [{file,"src/rabbit_plugins.erl"},{line,203}]},
    {rabbit,broker_start,0,[{file,"src/rabbit.erl"},{line,300}]},
    {rabbit,start_it,1,[{file,"src/rabbit.erl"},{line,424}]},
    {init,start_em,1,[]},
    {init,do_boot,3,[]}]

{"init terminating in do_boot",{error,{missing_dependencies,[crypto,ssl],[cowboy,cowlib,rabbitmq_management,rabbitmq_management_agent,rabbitmq_trust_store]}}}
init terminating in do_boot ({error,{missing_dependencies,[crypto,ssl],[cowboy,cowlib,rabbitmq_management,rabbitmq_management_agent,rabbitmq_trust_store]}})

https://blog.youkuaiyun.com/qq_35946990/article/details/78967660

解决:

参考博客:

https://www.cnblogs.com/wuhenzhidu/p/rabitmq.html

./configure --prefix=/usr/local/erlang20 --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe --without-javac

检查erlang是否安装成功:

/usr/local/erlang20/bin目 #目录下
./erl	#执行这个命令
Erlang/OTP 20 [erts-9.1] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V9.1  (abort with ^G)

Eshell V9.1  (abort with ^G)
1> ssl:versions().		#检查SSL版本,按照之前的configure,ssl版本能正常输出
[{ssl_app,"8.2.1"},
 {supported,['tlsv1.2','tlsv1.1',tlsv1]},
 {available,['tlsv1.2','tlsv1.1',tlsv1,sslv3]}]
2> 

开启rabbitmq

#这个目录下执行
/usr/local/rabbitmq/sbin
./rabbitmq-server

出现的问题:

[root@ccl sbin]# ./rabbitmq-server 
./rabbitmq-server: line 80: erl: command not found

解决:

vim /etc/profile
#添加代码
#set erlang environment export 
PATH=$PATH:/usr/local/erlang20/bin

#set rabbitmq environment 
export PATH=$PATH:/usr/local/rabbitmq/sbin
#使profile文件修改生效
source /etc/profile

[root@ccl sbin]# ./rabbitmq-server 

              RabbitMQ 3.6.14. Copyright (C) 2007-2017 Pivotal Software, Inc.
  ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
  ##  ##
  ##########  Logs: /usr/local/rabbitmq/var/log/rabbitmq/rabbit@ccl.log
  ######  ##        /usr/local/rabbitmq/var/log/rabbitmq/rabbit@ccl-sasl.log
  ##########
              Starting broker...
 completed with 0 plugins.

tail -f /usr/local/rabbitmq/var/log/rabbitmq/rabbit@ccl.log
netstat -nap | grep 5672
ps -ef|grep rabbitmq
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值