RabbitMQ 安装使用|青训营笔记

32 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第10天

消息队列RabbitMQ是由erlang语言开发的AMQP的开源实现。AMQP是Advanced Message Queue高级消息队列。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,不受开发语言的限制。

本文是在阿里云的ESC服务器上安装rabbitMQ。

安装Erlang

使用wget下载rpm包。

wget https://packages.erlang-solutions.com/erlang-solutions-2.0-1.noarch.rpm

安装需要的依赖的环境

yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel

执行

rpm -Uvh erlang-solutions-2.0-1.noarch.rpm

安装

yum install -y erlang

检查版本,出现版本则为安装成功

erl -v

使用下面命令行退出erl

halt().

安装RabbitMQ

安装socat

yum install -y  socat

到官网下载对应的文件,右键复制下载链接 www.rabbitmq.com/download.ht…

image.png

wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.16/rabbitmq-server-3.8.16-1.el8.noarch.rpm

执行

rpm -ihv rabbitmq-server-3.8.16-1.el8.noarch.rpm

安装

yum install -y rabbitmq-server

启动服务

systemctl start rabbitmq-server

查看rabbitmq server运行状态,如下,启动成功

systemctl status rabbitmq-server

image.png 设置开机启动

systemctl enable rabbitmq-server

Web管理插件

安装rabbitMQ界面管理器,RabbitMQ的插件是由Erlang语言写的,并且和服务器一同运行在同一个Erlang VM中

rabbitmq-plugins enable rabbitmq_management

重启服务

systemctl restart rabbitmq-server

通过ip:15672可以看到界面管理器 但是此时可能打不开,需要开放对应的端口号

      firewall-cmd --zone=public --add-port=15672/tcp --permanent
      firewall-cmd --zone=public --add-port=5672/tcp --permanent
 命令含义:
--zone #作用域
--add-port=1935/tcp  #添加端口,格式为:端口/通讯协议
--permanent  #永久生效,没有此参数重启后失效

重启防火墙

firewall-cmd --reload

重启rabbitMQ

systemctl restart rabbitmq-server

在系统中开放端口号打开仍旧失败,需要配置阿里云的安全组规则。手动添加

端口范围: 15672/15672

源: 0.0.0.0/0

image.png

Go连接RabbitMQ示例代码

需要在系统中开放5672端口 在系统中开放端口号打开仍旧失败,如果使用阿里云需要配置阿里云的安全组规则。手动添加

端口范围: 5672/5672

源: 0.0.0.0/0

新建一个消息生产者 producer

package main

import (
   "fmt"
   "github.com/streadway/amqp"
)

func main() {
   conn, err := amqp.Dial("amqp://admin:admin@服务器IP:5672/")
   if err != nil {
      println("连接失败")
      fmt.Printf("%v", err)
   }

   defer conn.Close()

   ch, err := conn.Channel()
   if err != nil {
      println("打开通道失败")
      defer ch.Close()
   }
   println("通道打开成功")
   q, err := ch.QueueDeclare(
      "testQueue",
      false,
      false,
      false,
      false,
      nil,
   )
   if err != nil {
      println("创建队列失败")
   }
   println("创建队列成功")

   //构建一个消息
   content := "178:172"
   msg := amqp.Publishing{
      ContentType: "text/plain",
      Body:        []byte(content),
   }

   msg2 := amqp.Publishing{
      ContentType: "text/plain",
      Body:        []byte(content),
   }

   //构建一个生产者,将消息放入队列
   err = ch.Publish(
      "",
      q.Name,
      false,
      false,
      msg)

   err = ch.Publish(
      "",
      q.Name,
      false,
      false,
      msg2)

   if err != nil {
      println("消息发布失败")
   }
   println("发送消息成功")
}

新建一个消息消费者 consumer

package main

import (
   "fmt"
   "github.com/streadway/amqp"
)

func main() {
   //连接rabbitmq
   conn, err := amqp.Dial("amqp://admin:admin@服务器IP:5672/")
   if err != nil {
      println("连接失败")
   }
   defer conn.Close()

   // 建立一个chanel,本质是开启一个tcp连接
   ch, err := conn.Channel()
   if err != nil {
      println("打开通道失败")
      defer ch.Close()
   }

   //c创建一个队列
   q, err := ch.QueueDeclare(
      "testQueue",
      false,
      false,
      false,
      false,
      nil,
   )
   if err != nil {
      println("创建队列失败")
   }

   //开启一个消费者
   msgChan, err := ch.Consume(
      q.Name,
      "",
      true,
      false,
      false,
      false,
      nil)
   if err != nil {
      println("创建消费者失败")
   }
   // 帮助阻塞
   forever := make(chan bool)
   //开启一个go线程
   go func() {
      for d := range msgChan {
         fmt.Printf("消费消息%v", string(d.Body))
      }
   }()
   println("等待消息....")
   <-forever

}

运行后,生产者程序打印

image.png

消费者程序打印

image.png

参考: t.csdn.cn/G0mxh