这是我参与「第五届青训营 」笔记创作活动的第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…
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
设置开机启动
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
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
}
运行后,生产者程序打印
消费者程序打印
参考: t.csdn.cn/G0mxh