通过golang实现RabbitMQ的五种模式

本文详细介绍了如何使用Golang实现RabbitMQ的simple、work、订阅、路由和话题五种模式,包括各个模式的生产者和消费者代码示例,帮助读者深入理解RabbitMQ的消息传递机制。

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

撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>> hot3.png

本文永久更新地址:https://my.oschina.net/bysu/blog/3092864

推荐一款免费的自购省钱,分享赚钱的平台——赚赚熊,感兴趣的,特别是家里有婆娘专职带娃的,请看文末。

0.先安装配置好RabbitMQ,参考《window10下RabbitMQ的安装及入门使用

1.执行go get  github.com/streadway/amqp,安装amqp包

一.RabbitMQ的simple模式:生产者生成消息放到队列中,消费者从队列中获取消息进行消费

1.go实现代码如下:

package RabbitMQ

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

//url格式 amqp://账户;密码@RabbitMQ服务器地址:端口号/vhost
const MQURL = "amqp://by_name_root:byroot@127.0.0.1:5672/vir_root"

type RabbitMQ struct{
	conn *amqp.Connection
	channel *amqp.Channel
	//队列名词
	QueueName string
	//交换机
	Exchange string
	//key
	Key string
	//连接信息
	Mqurl string
}

//创建RabbitMQ结构体实例
func NewRabbitMQ(queueName,exchange,key string) *RabbitMQ{
	rabbitmq := &RabbitMQ{QueueName:queueName,Exchange:exchange,Key:key,Mqurl:MQURL}
	var err error
	//创建rabbitmq连接
	rabbitmq.conn,err = amqp.Dial(rabbitmq.Mqurl)
	rabbitmq.FailOnErr(err,"创建连接错误!")
	rabbitmq.channel,err = rabbitmq.conn.Channel()
	rabbitmq.FailOnErr(err,"获取channel失败")
	return rabbitmq
}

//断开connection和channel
func (r *RabbitMQ) Destory(){
	r.channel.Close()
	r.conn.Close()
}

func (r *RabbitMQ) FailOnErr(err error,message string){
	if err != nil {
		log.Fatal("%s:%s",message,err)
		panic(fmt.Sprint("%s:%s",message,err))
	}
}

//创建简单模式Step:1.创建简单模式下RabbitMQ实例
func NewRabbitMQSimple(queueName string) *RabbitMQ{
	return NewRabbitMQ(queueName,"","")
}

//简单模式Step:2.简单模式下生产代码
func (r *RabbitMQ) PublishSimple(message string){
	//1.申请队列,如果队列不存在会自动创建,如果存在则跳过创建
	//保证队列存在,消息能发送到队列中
	_,err := r.channel.QueueDeclare(r.QueueName,
		//是否持久化
		false,
		//是否为自动删除
		false,
		//是否具有排他性
		false,
		//是否阻塞
		false,
		//额外属性
		nil)
	if err != nil {
		fmt.Println(err)
	}
	//2.发送消息到队列中
	r.channel.Publish(
		r.Exchange,
		r.QueueName,
		//如果为true,根据exhange类型和routkey规则,如果无法找到符合条件的队列,那么会把发送的消息返回给消息发送者
		false,
		//如果为true,当exchan发送消息到队列后发现队列上没有绑定消费者,则会把消息返回给发送者
		false,
		amqp.Publishing{
			ContentType:"text/plain",
			Body:[]byte(message),
		})
}


func (r *RabbitMQ) ConsumeSimple(){
	//1.申请队列,如果队列不存在会自动创建,如果存在则跳过创建
	//保证队列存在,消息能发送到队列中
	_,err := r.channel.QueueDeclare(r.QueueName,
		//是否持久化
		false,
		//是否为自动删除
		false,
		//是否具有排他性
		false,
		//是否阻塞
		false,
		//额外属性
		nil)

	if err != nil {
		fmt.Println(err)
	}

	//2.接受消息
	msgs,err := r.channel.Consume(
		r.QueueName,
		//用来区别多个消费者
		"",
		//是否自动应答
		true,
		//是否具有排他性
		false,
		//如果设置为true,表示不能将同一个connection中发送的消息传递给这个connection中的消费者
		false,
		//队列消费是否阻塞
		false,
		nil)
	if err != nil {
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值