这里使用的操作系统为ubuntu,首先安装rabbitmq,命令终端输入:
sudo apt-get install rabbitmq-server
下载mq管理工具rabbitmqadmin,输入:
sudo rabbitmq-plugins enable rabbitmq_management
wget localhost:15672/cli/rabbitmqadmin
这样我们就可以通过管理工具来管理Rabbitmq,浏览器中输入:localhost:15672,输入默认的用户名密码:guest,guest,管理界面如下:
Overview:RabbitMQ概述
Connections:MQ的连接信息
Channels:MQ的通道信息
Exchanges:MQ的交换器信息,默认情况下MQ会自动创建几个持久性的交换器。
Queues:MQ的队列信息
Admin:用户信息
这里,我们先创建一个测试用户,用来测试RabbitMQ的连接。
终端输入以下命令:
添加用户test,秘密test
sudo rabbitmqctl add_user test test
设置用户为管理员用户
sudo rabbitmqctl set_user_tags test administrator
给test用户添加访问所有exchange权限
sudo rabbitmqctl set_permissions -p / test “.*” “.*” “.*”
这时候我们通过管理页面可以看到已经创建成功,如下:
当然,这里也可以通过点击“Add user”来添加用户。
接下来,我们就可以编写rabbitmq代码了,先使用代码实现rabbitmq生成者发现发送消息功能。
package main
import (
"github.com/streadway/amqp"
)
var conn *amqp.Connection
var ch *amqp.Channel
func main() {
//设置连接地址和交换器队列名称
addr := "amqp://test:test@192.168.1.104:5672/"
exname := "amqp.ex"
quname := "amqp.qu"
//创建连接
conn, _ = amqp.Dial(addr)
//创建通道,注意,一个连接可以有多个通道
ch, _ = conn.Channel()
//创建一个交换器,参数fanout说明该交换器会将消息转发到所有与之绑定的队列中
ch.ExchangeDeclare(exname, "fanout", true, false, false, true, nil)
//创建一个队列,用来接受和消费信息,注意这里的队列名称,消费者获取数据需要该名称
ch.QueueDeclare(quname, true, false, false, false, nil)
//绑定交换器和队列
ch.QueueBind(quname, "", exname, false, nil)
//发送消息
ch.Publish(exname, quname, false, false, amqp.Publishing{
ContentType: "text/plain",
Body: []byte("hello,world"),
})
//关闭连接
conn.Close()
ch.Close()
select {}
}
交换器创建的参数说明如下:
name:交换器的名称,对应图中exchangeName。
kind:也叫作type,表示交换器的类型。有四种常用类型:direct、fanout、topic、headers。
durable:是否持久化,true表示是。持久化表示会把交换器的配置存盘,当RMQ Server重启后,会自动加载交换器。
autoDelete:是否自动删除,true表示是。至少有一条绑定才可以触发自动删除,当所有绑定都与交换器解绑后,会自动删除此交换器。
internal:是否为内部,true表示是。客户端无法直接发送msg到内部交换器,只有交换器可以发送msg到内部交换器。
noWait:是否非阻塞,true表示是。阻塞:表示创建交换器的请求发送后,阻塞等待RMQ Server返回信息。非阻塞:不会阻塞等待RMQ Server的返回信息,而RMQ Server也不会返回信息。(不推荐使用)
args:参数可选,如果有特殊参数需要传递,可以使用该参数。
消费者实现代码如下:
package main
import (
"bytes"
"fmt"
"github.com/streadway/amqp"
)
var conn *amqp.Connection
var ch *amqp.Channel
func main() {
addr := "amqp://test:test@192.168.1.104:5672/"
quname := "amqp.qu"
conn, _ = amqp.Dial(addr)
ch, _ = conn.Channel()
//接受消息
value, _ := ch.Consume(quname, "", true, false, false, false, nil)
go func() {
for v := range value {
s := bytesToString(&(v.Body))
fmt.Println(*s)
}
}()
conn.Close()
ch.Close()
select {}
}
func bytesToString(b *[]byte) *string {
s := bytes.NewBuffer(*b)
r := s.String()
return &r
}
运行程序,消费者输出 hello,world,运行成功。